在實現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獲取最新配置