SpringCloud ZooKeeper踩坑记录
SpringCloud pom文件配置
工程结构
采用多模块方式,父模块的打包方式魏pom方式,主要配置了公共的springboot依赖于springcloud版本管理,主要的部分如下:
<modules>
<module>zookeeper-provider</module>
</modules>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
</parent>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
</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.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
注意事项
springboot的版本必须与springcloud匹配,否则会出现意想不到的问题,具体的版本配置可以参考官网。
子模块配置
yml配置
server:
port: 8005
spring:
application:
name: cloud-provider-payment # 注册到zookeeper的服务名
cloud:
zookeeper:
connect-string: 192.168.0.104:2181 # zookeeper地址
主启动类配置
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现
public class ZkApplication {
public static void main(String[] args) {
SpringApplication.run(ZkApplication.class, args);
}
}
zookeeper配置
我这里采用docker-compose在vmware虚拟机(ubuntu20.04)搭建了3个结点的zookeeper伪集群,版本为3.6.0,与jar版本一致。docker-compose.yml配置如下:
version: '3'
services:
zoo1:
image: zookeeper:3.6.0
restart: always
hostname: zoo1
ports:
- 2181:2181
- 8080:8080
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ${HOME}/docker/zk1/zkdata:/data
- ${HOME}/docker/zk1/zkdatalog:/datalog
- ${HOME}/docker/zk1/zklog:/log
networks:
- zknet
zoo2:
image: zookeeper:3.6.0
restart: always
hostname: zoo2
ports:
- 2182:2181
- 8081:8080
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ${HOME}/docker/zk2/zkdata:/data
- ${HOME}/docker/zk2/zkdatalog:/datalog
- ${HOME}/docker/zk2/zklog:/log
networks:
- zknet
zoo3:
image: zookeeper:3.6.0
restart: always
hostname: zoo3
ports:
- 2183:2181
- 8082:8080
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
volumes:
- ${HOME}/docker/zk3/zkdata:/data
- ${HOME}/docker/zk3/zkdatalog:/datalog
- ${HOME}/docker/zk3/zklog:/log
networks:
- zknet
networks:
zknet:
driver: bridge
问题记录
主机启动服务连接不到容器中zookeeper
- 主机和容器之间网络不通
宿主机上以管理员方式打开powershell执行
ROUTE -p add 172.17.0.0 mask 255.255.0.0 192.168.0.104
其中172.17.0.0
是容器的网段, 255.255.0.0
是子网掩码,192.168.0.104
是虚拟机的ip,可以通过一下方式查看docker容器的网段。
启动服务,通过zkCli查看是否注册成功
可以看到,我们的服务已经注册成功
2. 集群问题
将3个节点的集群改为单节点,问题解决,原因未找到