spring boot3 使用zookeeper做注册中心、配置中心

工作需要, 在这里记录一下步骤, 具体zookeeper什么原理大家自行查其他博客,非常感谢。

项目采用jdk22, spring boot 3, zookeeper , 服务器的zookeeper是使用docker compose集群部署的。

zookeeper使用docker启动, 没安装的同学自行安装。部署分两个环境,一个集群(三节点),一个单节点。

单节点docker-compose.yml, 这里改了名字叫 zk-single.yml

version: '3.4'
services:
  zk1:
    image: zookeeper:latest
    restart: always
    hostname: zk1-single
    container_name: zk1-single
    ports:
    - 2181:2181
    - 8085:8080
    environment:
        ZOO_MY_ID: 1
        ZOO_SERVERS: server.1=zk1:2888:3888;2181
    networks:
        - zk-net
 
networks:
  zk-net:

启动命令: docker compose -f zk-single.yml up -d

启动后服务器需要开 2181 端口,8085开不开都可以,那个只是通过http请求查看一些zk状态的端口,具体连接自行百度,我这里给个例子: http://ip:8085/commands/server_stats ,返回的信息是这样的:

集群: zk.yml

version: '3.4'
services:
  zk1:
    image: zookeeper:latest
    restart: always
    hostname: zk1
    container_name: zk1
    ports:
    - 2181:2181
    - 8085:8080
    environment:
        ZOO_MY_ID: 1
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    networks:
        - zk-net
 
  zk2:   
    image: zookeeper:latest
    restart: always
    hostname: zk2
    container_name: zk2
    ports:
    - 2182:2181
    - 8086:8080
    environment:
        ZOO_MY_ID: 2
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    networks:
        - zk-net
            
  zk3:   
    image: zookeeper:latest
    restart: always
    hostname: zk3
    container_name: zk3
    ports:
    - 2183:2181
    - 8087:8080
    environment:
        ZOO_MY_ID: 3
        ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
    networks:
        - zk-net
 
networks:
  zk-net:

启动命令: docker compose -f zk.yml up -d

同样服务器要开端口 2181 、2182、2183 ,而8085 8086 8087一样,有需要就开一下。

启动后可以进入容器的/bin目录操作 zkCli.sh 进行一些目录的curd。那这样操作其实很麻烦, 所以我装了个zkui,zookeeper的可视化窗口,有点类似nacos的操作后台,具体安装步骤请移步此处 https://blog.51cto.com/u_15867943/6065313 

ui长这样,可以直接在这个web界面对目录进行curd:


 

服务器的内容记录完,下面放一下spring boot的配置。

首先是maven pom, 这里面只是摆了个parent 的pom文件 ,因为实际代码放在子项目,大家用dependencies里面的引用就行:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo-parent</name>
	<description>Demo project for Spring Boot</description>
	<packaging>pom</packaging>
	<modules>
		<module>../demo-common</module>
		<module>../demo-consumer</module>
		<module>../demo-provider</module>
	</modules>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>22</java.version>
		<spring-cloud.version>2023.0.3</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.17.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<version>2.5</version>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<testFailureIgnore>true</testFailureIgnore>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
		<resources>
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.xml</include>
				</includes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*</include>
				</includes>
			</resource>
		</resources>
	</build>



</project>

然后这里放一下application.yml

spring:
  config:
    import: 'zookeeper:'
  application:
    name: demo-provider
  cloud:
    zookeeper: #如果环境读dev情况下, 读取/{root}/{spring.application.name},dev/ 和 /{root}/{default-context},dev/ 目录下的节点,作为配置项。
      connect-string: ip:2182,ip:2183,ip:2181
      session-timeout: 30000
      connection-timeout: 30000
      config:
        enabled: true
        root: /config
        default-context: demo-provider
        profile-separator: ','
        watcher:
          enabled: true



server:
  port: 8081

解释一下每个配置的意思: 

  1. spring.config.import: 'zookeeper:':

    • 这告诉 Spring Boot 从 Zookeeper 导入配置。
    • optional: 前缀是可选的,意味着即使从 Zookeeper 导入配置失败,应用程序仍然可以启动。
  2. spring.application.name: demo-provider:

    • 设置应用程序的名称为 demo-provider
  3. spring.cloud.zookeeper.connect-string:

    • 设置 Zookeeper 服务器集群的连接字符串。
  4. spring.cloud.zookeeper.config:

    • enabled: true 表示启用 Zookeeper 配置支持。
    • root: /config 指定 Zookeeper 中配置数据的根节点。
    • default-context: demo-provider 指定默认读取 Zookeeper 配置的目录。
    • profile-separator: ',' 指定多环境配置目录分隔符。
    • watcher: enabled: true 表示启用 Watch 功能,监听 Zookeeper 数据的变化。

注册中心: 

 项目启动之后会自动在目录中按spring.application.name创建目录, 能看到目录说明注册成功: 

配置中心:

我们要用zookeeper配置中心的话 ,要知道具体系统怎么读zookeeper的上面的路径。

对于 Zookeeper Config 来说,它会读取 Zookeeper /{root}/{spring.application.name}/ 和 /{root}/{default-context}/ 目录下的节点。

那这里我们配置文件的root = /config  , default-context = demo-provider , 那zookeeper就会读取/config/demo-provider下面的目录:

如上图,我如果要读demo这个属性,那java代码要这么写

@Value是拿到对应demo的值。@RefreshScope是用来动态更新demo的值的,比如我在项目启动后,如果要修改demo的值,在不重启的情况下更新项目的demo值,加上注解之后就会自动更新。不加@RefreshScope是不会自动更新的。

以上就是zookeeper作为spring boot 的注册及配置中心的一些记录。

后续的一些open-feign等其他spring cloud组件可以照常使用,自行研究。

参考: https://blog.51cto.com/u_12831/10750867

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值