在實現springcloud的配置中心后,我們需要考慮的就是動態刷新配置。如果考慮只有一個客戶端,我們可以在配置文件發生push操作的時候添加webhook,使用webhook發送刷新的post請求到客戶端。但當客戶端很多的情況,就需要請求多個客戶端,這是不現實的。所以我們就想到直接刷新配置中心,直接由配置中心通知各個客戶端獲取最新的配置。下面就記錄一下今天搞了一天的使用springcloud bus整合kafka(或者rabbitmq)實現動態刷新,本地自己搞的玩的,所以是windows環境哈,linux大同小異。因為之前項目就用到kafka,新項目啟動項直接拿過來用,所以就沒使用rabbitmq,想用rabbitmq的同學可以另行百度哈。
一、因為kafka強依賴zookeeper,所以首先要安裝zookeeper和kafka
安裝zookeeper
1.下載壓縮包https://www.apache.org/dyn/closer.cgi/zookeeper並解壓到D盤,我下載的是最新的穩定版zookeeper-3.4.12.tar.gz
2.修改環境變量,添加變量ZOOKEEPER_HOME變量值D:\zookeeper-3.4.12 修改變量Path變量值添加%ZOOKEEPER_HOME%\bin;
3.在D:\zookeeper-3.4.12下新建文件夾data和log,然后將D:\zookeeper-3.4.12\conf下的zoo_sample.cfg復制一份到當前目錄命名為zoo.cfg並添加
dataDir=D:/zookeeper-3.4.12/data
dataLogDir=D:/zookeeper-3.4.12/log
4.用管理員身份打開cmd窗口,輸入zkServer,即啟動zk服務
安裝kafka
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
消費者即可收到消息:
二、更改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
三、重啟config-server和eureka-client項目,然后修改配置文件內容后,用postman調用config-server的bus/refresh請求:配置中心ip:端口/bus/refresh。這個時候可以發現eureka-client使用的配置是最新的。
注:刷新過程總結下
1.config-server接收到bus/refresh請求后會下載最新配置並通知消息總線bus
2.消息總線通知各個客戶端配置有更新
3.各個客戶端會重新請求config-server獲取最新配置