工作需要, 在这里记录一下步骤, 具体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
解释一下每个配置的意思:
-
spring.config.import: 'zookeeper:'
:- 这告诉 Spring Boot 从 Zookeeper 导入配置。
optional:
前缀是可选的,意味着即使从 Zookeeper 导入配置失败,应用程序仍然可以启动。
-
spring.application.name: demo-provider
:- 设置应用程序的名称为
demo-provider
。
- 设置应用程序的名称为
-
spring.cloud.zookeeper.connect-string
:- 设置 Zookeeper 服务器集群的连接字符串。
-
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组件可以照常使用,自行研究。