现在主流的注册中心都是eureka,很多教程基本上都是eureka的,但是对于一些大厂而言,eureka还是比较新的东西,并且他只能在Spring cloud里使用,广泛性不是很好,也很难说服运维做 eurake做全球化部署以及维护。但是zookeeper是一个比较广泛的组件,大厂一般都有现成的,并且非常成熟。笔者也遇到相似的问题,借此机会把自己踩得坑记录下来,分享给大家。
Spring Cloud 版本和zookeeper版本
Spring Cloud 版本
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
------------------------------------------
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
注:在集成zookeeper的时候,一定要问清楚运维zookeeper的版本,因为不同版本,对依赖的选取完全不一样。否则就会报错。下面分两个版本,分别讲下。
zookeeper3.5.x 版本
依赖如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
注: 要去掉 netflix 所有相关组件依赖,否则可能导致失败。
配置如下:
spring:
cloud:
zookeeper:
connect-string: localhost:2181 # zookeeper 地址
discovery:
enabled: true
root: /services
注: 去掉 eureka.client 和 netflix 所有相关配置,否则可能导致失败。
zookeeper3.4.x 版本
依赖如下:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<exclusions>
</exclusions>
</dependency>
配置如下:
spring:
cloud:
zookeeper:
connect-string: localhost:2181 # zookeeper 地址
discovery:
enabled: true
root: /services
FAQ
为什么要区分zookeeper版本?答案参考 http://curator.apache.org/zk-compatibility.html
UnimplementedException: KeeperErrorCode = Unimplemented
这样的异常怎么解决?基本上可以判断,还是zookeeper client与服务端的版本没有匹配上,可以打印依赖树,看看自己配置的依赖是否起作用了。