SpringCloud bus
Spring cloud bus 通過輕量級的訊息代理連線各個微服務,可以用來廣播配置檔案的修改,或者管理服務監控
安裝RabbitMQ
Docker中RabbbitMQ安裝命令:
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 5672:5672
rabbitmq:3-management
首先給config-server和config-client分別加上Spring Cloud Bus依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
然後,給兩個分別配置,使之都連線到RabbitMQ上
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
同時,由於configserver將提供重新整理介面,所以給configserver加上actuator依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.3.3.RELEASE</version> </dependency>
然後記得在config-server中,新增開啟bus-refresh端點:
management.endpoints.web.exposure.include=bus-refresh
由於給 config-server 中的所有介面都添加了保護,所以重新整理介面將無法直接訪問,此時,可以通過修
改 Security 配置,對端點的許可權做出修改:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .httpBasic() .and() .csrf().disable(); } }
在這段配置中,開啟了HttpBasic登入,這樣,在傳送重新整理請求時,就可以直接通過HttpBasic配置認證資訊了
最後分別啟動config-server和config-client,然後修改配置資訊提交給GitHub,重新整理config-client介面,檢視是否有變化。然後傳送如下post請求
http://localhost:8082/actuator/bus-refresh
這個 post 是針對 config-server 的,config-server 會把這個重新整理的指令傳到 rabbitmq ,然後
rabbitmq 再把指令傳給 各個 client。
逐個重新整理
如果更新配置檔案之後,不希望每個微服務都去重新整理配置檔案,那麼可以通過如下配置解決問題
首先,給每一個config-client新增一個instance-id:
eureka.instance.instance-id=${spring.application.name}:${server.port}
然後,對config-client進行打包,打包完成後,通過如下命令啟動兩個config-client例項:
java -jar config-client-0.0.1-SNAPSHOT.jar --server.port=8082
java -jar config-client-0.0.1-SNAPSHOT.jar --server.port=8083
修改配置檔案,並且提交到 GitHub 之後,可以通過如下方式只重新整理某一個微服務,例如只重新整理 8082
的服務。
http://localhost:8081/actuator/bus-refresh/client1:8082
client1:8082 表示服務的 instance-id。