5.Spring Boot 使用 Curator 操作 ZooKeeper「第三章 ZooKeeper Java客户端」「架构之路ZooKeeper理论和实战」

这一节我们来看下Spring Boot中如何使用Curaotor操作ZooKeeper。

一、Spring Boot 使用 Curator 操作 ZooKeeper

1.1 环境说明

(1)操作环境:Mac OS

(2)开发工具Idea

(3)ZooKeeper 服务端版本:3.6.2

(4)Spring Boot版本:2.4.4

(5)curator版本:5.1.0

1.2 操作步骤

       在具体的实际操作之前,我们先捋一下思路,在java中使用Curator,核心的一个类就是CuratorFramework,所以我们只需要能够将类CuratorFramework注入到Spring中,那么就能够对节点进行操作了。

       对于如何注入CuratorFramework的话,我们有两种思路:

(1)找到一个curator的starter,在这个starter就已经注入了CuratorFramework,我们直接使用即可:能找到这个方式是最简单的,但既然没有找到相应的starter,难道是我的姿势不对?

(2)我们自己使用@Bean注入CuratorFramework。

       本文主要使用第(2)种方式进行展开讲解,如果有找到相应的starter的,记得给我留言哦。

       对于第二种方式,来看下具体需要的步骤:

(1)创建一个spring boot项目:使用idea创建一个spring boot项目;

(2)引入依赖包:核心就是curator-recipes;

(3)在application.properties文件编写配置信息:这里我们将连接zk的参数放到配置文件进行管理。

(4)编写一个配置信息对应的配置信息类,比如ZooKeeperProperties:对应在配置类编写的配置信息。

(5)编写一个配置类ZooKeeperConfig,这个类核心就是注入CuratorFramework。

       接下里我们就根据这个操作说明来看下具体要怎么操作。

1.3 新建项目

       使用idea新建一个项目,比如取名为:springboot-curator-demo

1.4 添加依赖

       在pom.xml文件添加一些包:curator-recipes(curator的核心依赖包)、spring-boot-configuration-processor(@ConfigurationProperties在这个包里),具体的pom.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.4.4</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.kfit</groupId>
  12. <artifactId>springboot-curator-demo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springboot-curator-demo</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-web</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-configuration-processor</artifactId>
  27. <version>RELEASE</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.apache.curator</groupId>
  31. <artifactId>curator-recipes</artifactId>
  32. <version>5.1.0</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-test</artifactId>
  37. <scope>test</scope>
  38. </dependency>
  39. </dependencies>
  40. <build>
  41. <plugins>
  42. <plugin>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-maven-plugin</artifactId>
  45. </plugin>
  46. </plugins>
  47. </build>
  48. </project>

1.5 配置信息

       在application.properties配置连接zk server的一些信息,比如地址、超时时间等等:

  1. #服务器地址
  2. zookeeper.connectString=127.0.0.1:2181
  3. #命名空间,被称为ZNode
  4. zookeeper.namespace=curator
  5. #会话超时时间,默认值为:60000
  6. zookeeper.sessionTimeoutMs=60000
  7. #连接超时时间,默认值为:15000
  8. zookeeper.connectionTimeoutMs=15000
  9. #重试之间等待的初始时间
  10. zookeeper.baseSleepTimeMs=1000
  11. #重试的最大次数
  12. zookeeper.maxRetries=3





1.6 配置信息类

       配置信息对应的配置类,熟悉Spring Boot的想必不会陌生:

  1. package com.kfit.springbootcuratordemo.curator;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.context.annotation.Configuration;
  4. /**
  5. * 连接zk server的配置信息,在application.properties进行配置。
  6. *
  7. * @author 悟纤「公众号SpringBoot」
  8. * @date 2021-03-23
  9. * @slogan 大道至简 悟在天成
  10. */
  11. //不需要配置:@Component,在@Configuration已经包括了,无需多此一举。
  12. //@Component
  13. //注明这是一个配置文件
  14. @Configuration
  15. // 配置文件信息前缀
  16. @ConfigurationProperties(prefix = "zookeeper")
  17. public class ZooKeeperProperties {
  18. private String connectString;
  19. private String namespace;
  20. private int sessionTimeoutMs=60000;
  21. private int connectionTimeoutMs=15000;
  22. private int baseSleepTimeMs=1000;
  23. private int maxRetries=3;
  24. public int getSessionTimeoutMs() {
  25. return sessionTimeoutMs;
  26. }
  27. public void setSessionTimeoutMs(int sessionTimeoutMs) {
  28. this.sessionTimeoutMs = sessionTimeoutMs;
  29. }
  30. public int getConnectionTimeoutMs() {
  31. return connectionTimeoutMs;
  32. }
  33. public void setConnectionTimeoutMs(int connectionTimeoutMs) {
  34. this.connectionTimeoutMs = connectionTimeoutMs;
  35. }
  36. public int getBaseSleepTimeMs() {
  37. return baseSleepTimeMs;
  38. }
  39. public void setBaseSleepTimeMs(int baseSleepTimeMs) {
  40. this.baseSleepTimeMs = baseSleepTimeMs;
  41. }
  42. public int getMaxRetries() {
  43. return maxRetries;
  44. }
  45. public void setMaxRetries(int maxRetries) {
  46. this.maxRetries = maxRetries;
  47. }
  48. public String getConnectString() {
  49. return connectString;
  50. }
  51. public void setConnectString(String connectString) {
  52. this.connectString = connectString;
  53. }
  54. public String getNamespace() {
  55. return namespace;
  56. }
  57. public void setNamespace(String namespace) {
  58. this.namespace = namespace;
  59. }
  60. }

1.7 配置类

       编写注入CuratorFramework的配置类:

  1. package com.kfit.springbootcuratordemo.curator;
  2. import org.apache.curator.RetryPolicy;
  3. import org.apache.curator.framework.CuratorFramework;
  4. import org.apache.curator.framework.CuratorFrameworkFactory;
  5. import org.apache.curator.framework.state.ConnectionState;
  6. import org.apache.curator.framework.state.ConnectionStateListener;
  7. import org.apache.curator.retry.ExponentialBackoffRetry;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. /**
  12. * 注入Curator的CuratorFramework
  13. *
  14. * @author 悟纤「公众号SpringBoot」
  15. * @date 2021-03-23
  16. * @slogan 大道至简 悟在天成
  17. */
  18. @Configuration
  19. public class ZooKeeperConfig {
  20. @Autowired
  21. private ZooKeeperProperties zooKeeperProperties;
  22. @Bean
  23. public CuratorFramework curatorFramework(){
  24. /*
  25. 方式二:
  26. * connectionString zk地址
  27. * sessionTimeoutMs 会话超时时间
  28. * connectionTimeoutMs 连接超时时间
  29. * namespace 每个curatorFramework 可以设置一个独立的命名空间,之后操作都是基于该命名空间,
    比如操作 /user/message 其实操作的是/curator/user/message
  30. * retryPolicy 重试策略
  31. */
  32. String connectString = zooKeeperProperties.getConnectString();
  33. //集群的情况下,多个地址使用逗号分隔:
  34. //String connectString = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184";
  35. RetryPolicy retryPolicy = new ExponentialBackoffRetry(zooKeeperProperties.getBaseSleepTimeMs(),
    zooKeeperProperties.getMaxRetries());
  36. CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
  37. .connectString(connectString)
  38. .sessionTimeoutMs(zooKeeperProperties.getSessionTimeoutMs())
  39. .connectionTimeoutMs(zooKeeperProperties.getConnectionTimeoutMs())
  40. .namespace(zooKeeperProperties.getNamespace())
  41. .retryPolicy(retryPolicy)
  42. .build();
  43. curatorFramework.getConnectionStateListenable().addListener(new ConnectionStateListener() {
  44. @Override
  45. public void stateChanged(CuratorFramework client, ConnectionState newState) {
  46. if(newState == ConnectionState.CONNECTED){
  47. System.out.println("连接成功!");
  48. }
  49. }
  50. });
  51. curatorFramework.start();
  52. return curatorFramework;
  53. }
  54. }

1.8 使用

       这时候我们可以在别的类中使用@Autowired注入CuratorFramework,对于具体的使用和我们前面两节讲的就一样,这里就不重复进行讲解了,不懂的可以看前面的两个小小节。

1.9 zookeeper 8080端口管理功能

3.5版本后增加管理接口,默认8080,有可能与本机tomcat冲突而造成启动失败

在zoo.conf增加一行配置来修改默认配置即可:

admin.serverPort=12181

       管理接口访问:http://127.0.0.1:12181/commands/stats

二、小结

       对于如何注入CuratorFramework的话,我们有两种思路:

(1)找到一个curator的starter,在这个starter就已经注入了CuratorFramework,我们直接使用即可:能找到这个方式是最简单的,但既然没有找到相应的starter,难道是我的姿势不对?

(2)我们自己使用@Bean注入CuratorFramework。

       本文主要使用第(2)种方式进行展开讲解,如果有找到相应的starter的,记得给我留言哦。

       对于第二种方式,来看下具体需要的步骤:

(1)创建一个spring boot项目:使用idea创建一个spring boot项目;

(2)引入依赖包:核心就是curator-recipes;

(3)在application.properties文件编写配置信息:这里我们将连接zk的参数放到配置文件进行管理。

(4)编写一个配置信息对应的配置信息类,比如ZooKeeperProperties:对应在配置类编写的配置信息。

(5)编写一个配置类ZooKeeperConfig,这个类核心就是注入CuratorFramework。

购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287