背景需求
- 近些日,由于客户对产品架构有一些新的需求,我们适配了多种不同技术栈
- 目前服务注册与发现主流的已是Nacos了,早期用Eureka较多,但有客户要求还要zk
- 于是基于架构适配zk做配置中心的需求,对产品进行改造
- 对于配置中心能力,这里提下,个人觉得虽然spring cloud也对zk做config有支持,但也仅停在可用层面
- 用zk做配置中心,说实话功能太弱,也没有其他产品使用方便,不推荐
- 所以下面还是以 Spring Cloud 亲儿子 config 做配置中心服务
具体修改方案
下载安装zk
- https://zookeeper.apache.org/releases.html
- linux环境 就
wget
下载下,然后tar -zxvf
解压下 - 然后进去conf 目录下,将zoo_sample.cfg 复制为 zoo.cfg
- 内容想改就改下dataDir,默认在 /tmp/zookeeper,不想改拉到
- 到bin目录下,启动,执行
sh zkServer.sh start
,看到started即可
- 本地有条件,安装一个 prettyZoo 客户端,默认端口2181,连接上看一眼就行了
改造config代码
- 因为配置文件都放在配置中心,所以先得让配置中心注册上再说
- 修改pom.xml
<!-- 使用 eureka 做 注册中心 -->
<!--<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>-->
<!-- 适配 zk 作 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
- 修改 application.yml,添加zk的配置
# 适配 zk 作为注册中心相关配置
spring:
cloud:
zookeeper:
discovery:
enabled: true
connect-string: 192.168.2.8:2181
- 可以了,然后启动即可,正常情况下就可看到你服务注册上来的节点数据了
改造业务服务
- pom.xml 与 配置中心一样修改接口,这里省略了
- bootstrap.xml配置文件
spring:
main:
# 关键配置
allow-bean-definition-overriding: true
cloud:
config:
discovery:
enabled: true
# 注意,该名称在zk中大小写敏感
service-id: ebs-config-service
zookeeper:
discovery:
enabled: true
# 这里必须显示的配置register为true,否则默认没注册上,比较奇怪,原因未知
register: true
connect-string: 192.168.2.8:2181
- 改完以上两点,重启即可
- 观察下客户端的数据
测试
- 至少修改两个业务服务,注册上zk
- 测试你服务的Feign接口调用,看看是否能正常调用成功即可
比较难搞的seata
- 不出意外,你大概率还用到了seata做分布式事务服务
- 修改seata-server配置文件registry.conf
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "zk"
zk {
cluster = "default"
serverAddr = "192.168.2.8:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
}
- 客户端这边要注意,我折腾好几遍,才弄对
- 这里说明下,我用的版本是1.4.2版本,以前老版本估计还不一样
# 关键配置
spring.cloud.alibaba.seata.tx-service-group: xxxx_tx_group
seata:
config:
type: file
registry:
type: zk
zk:
server-addr: 192.168.2.8:2181
service:
vgroup-mapping:
xxxx_tx_group: default
- registry.conf 和 file.conf基本与服务端一样,部分配置其实和上面的yml有重叠
- 但是不配置上面的yml中seata前缀的配置,貌似系统读不到zk的连接信息,取的默认127.0.0.1
- 不信你服务启动的时候,仔细去看下日志,如果正好你的zk在你本地启动的,你可能发现不了这个问题
- 下面贴下两个配置文件关键配置图,自行参考
- 最后启动日志关注下一些seata的关键信息
- 忘记说了,启动的时候你可能会报一个zk的类找不到,要加下这个依赖
- 我的错误:
NoClassDefFoundError: org/I0Itec/zkclient/ZkClient
- 添加依赖:
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>