【Spring Cloud】Spring Cloud之整合Spring Cloud Bus以及最佳實踐


一、整合步驟

1)加入Maven坐標

       <!-- actuator監控模塊 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>2.0.3.RELEASE</version>
            </dependency>
            <!--amqp-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
                <version>2.0.3.RELEASE</version>
            </dependency>
            <!--spring cloud bus-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bus-amqp</artifactId>
                <version>2.0.2.RELEASE</version>
            </dependency>

2) 添加配置

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# 開放actuator/bus-refresh斷點 management: endpoints: web: exposure: include: bus
-refresh

 

3)程序代碼引入配置參數的地方,添加@RefreshScope 注解,如下:

/**
 * @author zhangboqing
 * @date 2019-09-03
 */
@RestController
@RefreshScope
public class UserController {

    @Value("${pro1}")
    private String pro1;

    @ApiOperation(value = "用戶模塊-GET操作")
    @GetMapping(value = "get")
    public ApiResponseT get() {

        return ApiResponseT.builder().setData(pro1);
    }

}

 

4)啟動程序,訪問打印參數。然后修改參數,post方式請求http://localhost:10802/actuator/bus-refresh來刷新程序參數值,再訪問參數發現值自動就更新來。
在同一個程序多實例的情況下,刷新其中一個實例,其他實例也會自動被刷新。

 

二、Spring Cloud Bus整合最佳實踐

1)上面的整合步驟,在整個架構上如下圖所示,這些微服務應用的實例中都引入了Spring Cloud Bus,所以它們都連接到了RabbitMQ的消息總線上。

我們可以從Git倉庫中配置的修改到發起actuator/bus-refresh的POST請求這一步可以通過Git倉庫的Web Hook來自動觸發。由於所有連接到消息總線上的應用都會接收到更新請求,所以在WebHook中就不需要維護所有節點內容來進行更新,這樣就不用通過Web Hook來逐個進行刷新每個程序配置的問題。

注意:actuator/bus-refresh斷點有提供destination參數,用來定位具體要刷新的應用程序。此時總線上的各應用實例會根據destination屬性的值來判斷是否為自己的實例名,

,實例的默認命名按此規則生成:${spring.cloud.client.hostname}:${spring.applica-tion.name}:${spring.application.instance_id:${server.port}}};

若符合才進行配置刷新,若不符合就忽略該消息。比如,我們可以請求actuator/bus/refresh?destination=user:9000或者actuator/bus/refresh?destination=user:**

 

 

 2)基於上面的架構優化及最佳實踐,如下圖:

 

 相關改動如下:

1. 在Config Server中也引入Spring Cloud Bus,將配置服務端也加入到消息總線中來。

2. actuator/bus/refresh請求不再發送到具體服務實例上,而是發送給Config Server,並通過destination參數來指定需要更新配置的服務或實例。
通過上面的改動,我們的服務實例不需要再承擔觸發配置更新的職責。同時,對於Git的觸發等配置都只需要針對ConfigServer即可,從而簡化了集群上的一些維護工作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM