在实现springcloud的配置中心后,咱们须要考虑的就是动态刷新配置。若是考虑只有一个客户端,咱们能够在配置文件发生push操做的时候添加webhook,使用webhook发送刷新的post请求到客户端。但当客户端不少的状况,就须要请求多个客户端,这是不现实的。因此咱们就想到直接刷新配置中心,直接由配置中心通知各个客户端获取最新的配置。下面就记录一下今天搞了一天的使用springcloud bus整合kafka(或者rabbitmq)实现动态刷新,本地本身搞的玩的,因此是windows环境哈,linux大同小异。由于以前项目就用到kafka,新项目启动项直接拿过来用,因此就没使用rabbitmq,想用rabbitmq的同窗能够另行百度哈。node
1、由于kafka强依赖zookeeper,因此首先要安装zookeeper和kafkalinux
安装zookeeperweb
1.下载压缩包https://www.apache.org/dyn/closer.cgi/zookeeper并解压到D盘,我下载的是最新的稳定版zookeeper-3.4.12.tar.gzspring
2.修改环境变量,添加变量ZOOKEEPER_HOME变量值D:\zookeeper-3.4.12 修改变量Path变量值添加%ZOOKEEPER_HOME%\bin;apache
3.在D:\zookeeper-3.4.12下新建文件夹data和log,而后将D:\zookeeper-3.4.12\conf下的zoo_sample.cfg复制一份到当前目录命名为zoo.cfg并添加windows
dataDir=D:/zookeeper-3.4.12/data
dataLogDir=D:/zookeeper-3.4.12/logapp
4.用管理员身份打开cmd窗口,输入zkServer,即启动zk服务spring-boot
安装kafkapost
1.下载压缩包http://kafka.apache.org/downloads任意下载二进制文件并解压到D盘,我下载的是kafka_2.12-1.1.0。测试
2.在kafka目录下新建文件夹kafka_logs,而后打开config目录下的server.properties配置文件,修改log.dirs=D:/kafka_2.12-1.1.0/kafka_logs。
(有的文章里有说要执行bin\windows\zookeeper-server-start.bat config\zookeeper.properties,这是在第一步中没有cmd运行zkServer,若是有运行,这里就不须要这一步了)
3.打开cmd窗口在kafka目录下输入bin\windows\kafka-server-start.bat config\server.properties启动kafka。
4.再打开一个cmd窗口(第三个了),在kafka目录下输入bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testNew建立topic,建立成功是这个样子:
5.继续输入bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic testNew建立生产者
6.再打开一个cmd窗口(第四个额),再kafka目录下输入bin\windows\kafka-console-consumer.bat --zookeeper localhost:2181 --topic testNew --from-beginning建立消费者
7.测试,在生产者输入,在消费者能够显示
例如:生产者输入welcome to kafka
消费者便可收到消息:
2、更改config-server项目和eureka-client项目(能够是config-client,同样,我只是把eureka-client改形成了config-client)
config-server改造:
1.pom添加依赖:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-actuator</artifactId> 4 </dependency> 5 <!-- kafka依赖 --> 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-bus-kafka</artifactId> 9 </dependency>
2.application.properties配置文件添加:
1 spring.cloud.stream.kafka.binder.zk-nodes=localhost:2181 2 spring.cloud.stream.kafka.binder.brokers=localhost:9092
3 management.security.enabled=false
eureka-client改造:
1.pom添加依赖:
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-actuator</artifactId> 4 </dependency> 5 <!-- kafka依赖 --> 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-bus-kafka</artifactId> 9 </dependency>
2.获取配置的controller上添加注解:@RefreshScope
3、重启config-server和eureka-client项目,而后修改配置文件内容后,用postman调用config-server的bus/refresh请求:配置中心ip:端口/bus/refresh。这个时候能够发现eureka-client使用的配置是最新的。
注:刷新过程总结下
1.config-server接收到bus/refresh请求后会下载最新配置并通知消息总线bus
2.消息总线通知各个客户端配置有更新
3.各个客户端会从新请求config-server获取最新配置