Zookeeper作为SpringCloud配置中心

一、背景介绍

在分布式系统中动态配置中,可以避免重复重启服务,动态更改服务参数等。一句话非常重要。 哈哈。 Zookeeper 作为知名的分布式调度系统, 我们也可以利用其作为配置中心,其wacth 主动通知机制, 可以将node 节点数据变更信息及时通知到client 端。

环境依赖:

名称 备注
JDK 1.8
Consul 1.5.2 注册中心,Consul安装及介绍 https://mp.csdn.net/mdeditor/95372805#
SpringCloud Greenwich.SR1
spring-boot-starter-actuator Zookeeper 基于actuator对应的接口通知参数变更
Zookeeper 3.3.5 安装目录下面zkCli.* 可以cli操作zookeeper

二、项目实战

1) pom依赖(主要)


		1.8
		Greenwich.SR1



		
			
				org.springframework.cloud
				spring-cloud-dependencies
				${spring-cloud.version}
				pom
				import
			
		



	org.springframework.boot
	spring-boot-starter-web


	org.springframework.boot
	spring-boot-starter-actuator
	

	org.springframework.cloud
	spring-cloud-starter-consul-discovery


	org.springframework.cloud
	spring-cloud-starter-zookeeper-config
	

2)配置文件

application.properties

#0表示服务器随机端口
server.port=8090
#consul  地址
spring.cloud.consul.host=localhost
#consul  端口
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.prefer-ip-address=true
#本次演示的kv的默认值(老板默认给你0元)
company.pay.money=0

bootstrap.properties

#服务名称
spring.application.name=waiter-service
#zookeeper连接信息
spring.cloud.zookeeper.connect-string=localhost:2181

3)动态参数接收类

@ConfigurationProperties("company.pay")
@RefreshScope
@Data
@Component
public class PayMoneyProperties {
  //key结尾部分,以小数点为间隔
   Integer  money ;
}

备注:
ConfigurationProperties 表示这个类关联动态配置,“company.pay”表示key的前缀部分。
@RefreshScope 表示动态刷新config server 值
@Component 表示将该类加载到IOC容器中
在实战中尝试用@Value的方式获取动态,只能实现服务重启后获取动态的config server 的值

4)对外接口(便于直观验证)

@RestController
@RequestMapping("zk")
public class ZkConfigController {
    @Autowired
    private PayMoneyProperties payMoneyProperties ;

    @RequestMapping("/pay/money")
    public  Object getZkConfig(HttpRequest request){
        String money ="项目顺利上线,老板开始发奖金:";
      return money + payMoneyProperties.getMoney();
    }
}

5)启动项目
Zookeeper作为SpringCloud配置中心_第1张图片
备注:State change:CONECTED 表示zookeeper 注册中心已经连接上

6)zookeeper 还没设置对应节点值时演示
Zookeeper作为SpringCloud配置中心_第2张图片
备注:Spring boot 在加载配置顺序:本地配置文件 --> Config Server -->application

7) zookeper 中创建数据节点
Zookeeper作为SpringCloud配置中心_第3张图片
注意:
在zookeeper 所有的节点都需要先create创建, 然后再set赋值
由于项目中用的默认的动态配置中心配置, 所有config 表示固定目录、waiter-service 表示项目名称,其实在项目启动的时候通过日志已可以得知:
在这里插入图片描述

8)验证项目里是有有收到动态配置

如下图,表示已经通知到项目更新的值
Zookeeper作为SpringCloud配置中心_第4张图片
在验证接口中请求一下对应接口,发现值已经和zookeeper中动态设置的值相同了
Zookeeper作为SpringCloud配置中心_第5张图片

三、总结

1)在实战过程中,发现了,waiter-service 无法接收到zookeeper 值变更通知,经过排查是由于consul 卡住, consul 与项目间的watch 机制出现了问题,导致zookeeper与项目间的watch 机制也出现了问题, 大胆猜测一下, 在spring boot 中所有watch机制相关功能,都是用的一个线程池。
2)zookeeper 虽然可以实现动态配置中心,但是web界面不够优化, 实现按dev、test、pro 分配置文件,比较麻烦。
3)本次演示比较简单动态配置服务端都用的默认配置。 如果要投产还需要详细研究一下。

你可能感兴趣的:(SpringCloud,zookeeper)