1. 程式人生 > 實用技巧 >SpringCloud bus

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。