使用SpringCloud實現Java分散式開發【part-7】:Spring Cloud Bus訊息匯流排的介紹及使用

Piconjo_Official發表於2020-09-25

SpringCloud簡介

Spring Cloud是Spring旗下的專案之一
Spring Cloud並不是一個元件 而是許多元件的集合
其將當下非常流行的一些技術整合到了一起 實現了多個分散式開發中的重要功能
協調了分散式環境中各個系統 並且為各類服務提供模板性的配置

其主要涉及的元件包括:

  • Eureka:註冊中心
  • Zuul或Spring Cloud Gateway:服務閘道器
  • Ribbon:負載均衡
  • Feign:服務呼叫
  • Hystrix或Resilience4j:熔斷器

除此之外 還有一些很有用的元件 比如Spring Cloud ConfigSpring Cloud Bus

【在本篇中 將介紹Spring Cloud Bus訊息匯流排】

Spring Cloud Bus訊息匯流排

若修改Spring Cloud Config的配置 不重啟服務的話 則無法讀取到最新修改後的配置項
Spring Cloud Bus可以在不重啟系統的情況下實現及時同步更新配置項

Spring Cloud Bus是用輕量的訊息代理將分散式的節點連線起來 可以用於廣播配置檔案的更改或者服務的監控管理
也就是訊息匯流排可以為微服務做監控 也可以實現應用程式之間的相互通訊

Spring Cloud Bus可選的訊息代理有RabbitMQ和Kafka

使用步驟

Spring Cloud Bus底層是基於RabbitMQ實現的 預設使用本地的訊息佇列服務 因此需要提前安裝RabbitMQ 然後啟動本地的RabbitMQ服務

安裝教程請參看我的另一篇部落格:手把手演示Windows環境下安裝RabbitMQ

1、首先在[配置中心工程]進行配置:

在配置中心工程的pom檔案中新增相關的依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

然後進行相關配置:

spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        # 指定git倉庫的地址
        git:
          uri: https://gitee.com/zhangsan/spring-cloud-config.git
          username: zhangsan
          password: 123456789
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
management:
  endpoints:
    web:
      exposure:
        # 暴露觸發訊息匯流排的地址
        # 訪問該地址即可立即重新整理配置檔案
        include: bus-refresh

2、[服務提供工程]也需要進行相應配置

(服務提供工程 也就是將配置檔案託管到git的工程)

同樣 需要新增相關的依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置檔案也要進行修改:

spring:
  cloud:
    config:
      name: user
      profile: dev
      label: master
      discovery:
        enabled: true
        service-id: config-server
  # RabbitMQ配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

在控制器類上新增@RefreshScope註解以使當有最新的配置項時 重新整理配置:

@RestController
@RequestMapping("/user")
// 當有最新的配置項時 重新整理配置
@RefreshScope
public class UserController {

    @Autowired
    private UserService userService;

    @Value("${test.name}")
    private String name;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id)
    {
        System.out.println("name : "+name);
        return userService.queryById(id);
    }
}

測試:
當修改了git上的配置檔案之後 傳送一個Post請求給localhost:12000/actuator/bus-refresh
(12000埠為我的配置中心專案的埠 bus-refresh為設定的路徑名稱 可以在配置檔案中修改)
在這裡插入圖片描述
此時 在專案中顯示的是配置檔案中最新的資料了

測試成功


相關文章