1. 程式人生 > 實用技巧 >SpringCloud Bus訊息匯流排

SpringCloud Bus訊息匯流排

在微服務架構中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題來連線各個微服務例項,它廣播的訊息會被所有在註冊中心的微服務例項監聽和消費,也稱訊息匯流排。

SpringCloud中也有對應的解決方案,SpringCloud Bus 將分散式的節點用輕量的訊息代理連線起來,可以很容易搭建訊息匯流排,配合SpringCloud config 實現微服務應用配置資訊的動態更新。

訊息代理屬於中介軟體。設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作。開源產品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支援RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。

搭建分散式配置中心

Config架構

當一個系統中的配置檔案發生改變的時候,我們需要重新啟動該服務,才能使得新的配置檔案生效,spring cloud config可以實現微服務中的所有系統的配置檔案的統一管理,而且還可以實現當配置檔案發生變化的時候,系統會自動更新獲取新的配置。

訊息代理屬於中介軟體。設計代理的目的就是為了能夠從應用程式中傳入訊息,並執行一些特別的操作。開源產品很多如ActiveMQ、Kafka、RabbitMQ、RocketMQ等
目前springCloud僅支援RabbitMQ和Kafka。本文采用RabbitMQ實現這一功能。

Git環境搭建

使用碼雲環境搭建git伺服器端

碼雲環境地址:https://gitee.com/yushengjun/events

Git伺服器上傳配置檔案

命名規範 服務名稱-版本.yml 例如configclient_dev.yml

搭建Eureka 註冊中心

搭建config-server

Maven依賴

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.2.RELEASE</version

>

</parent>

<dependencies>

<!-- SpringBoot整合Web元件 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<!--spring-cloud 整合 config-server -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-config-server</artifactId>

<version>2.0.2.RELEASE</version>

</dependency>

<!-- SpringBoot整合eureka客戶端 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

<version>2.0.2.RELEASE</version>

</dependency>

</dependencies>

<!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->

<repositories>

<repository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>https://repo.spring.io/libs-milestone</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

application.yml

###服務註冊到eureka地址

eureka:

client:

service-url:

defaultZone:http://localhost:8100/eureka

spring:

application:

####註冊中心應用名稱

name:config-server

cloud:

config:

server:

git:

###git環境地址

uri:https://gitee.com/itmayi/config_003.git

####搜尋目錄

search-paths:

- config

####讀取分支

label:master

####埠號

server:

port:8888

啟動config-server

@SpringBootApplication

@EnableEurekaClient

@EnableConfigServer

publicclassAppConfigServer {

publicstaticvoidmain(String[] args) {

SpringApplication.run(AppConfigServer.class, args);

}

}

讀取配置檔案http://127.0.0.1:8888/configclient-dev.yml

搭建config-client

Maven依賴

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.0.1.RELEASE</version>

</parent>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-bus-parent</artifactId>

<version>2.0.0.RC2</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<dependencies>

<!-- SpringBoot整合Web元件 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-config-client</artifactId>

<version>2.0.2.RELEASE</version>

</dependency>

<!-- SpringBoot整合eureka客戶端 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

<version>2.0.2.RELEASE</version>

</dependency>

<!--核心jar包 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-bus-amqp</artifactId>

</dependency>

<!-- actuator監控中心 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

</dependencies>

<!-- 注意: 這裡必須要新增, 否者各種依賴有問題 -->

<repositories>

<repository>

<id>spring-milestones</id>

<name>Spring Milestones</name>

<url>https://repo.spring.io/libs-milestone</url>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>

application.yml

spring:

application:

####註冊中心應用名稱

name:configclient

cloud:

config:

####讀取字尾

profile:dev

####讀取config-server註冊地址

discovery:

service-id:config-server

enabled:true

##### eureka服務註冊地址

eureka:

client:

service-url:

defaultZone:http://localhost:8100/eureka

server:

port:8882

啟動config-client

@RestController

publicclassConfigClientController {

// 年齡

@Value("${userAge}")

privateString userAge;

@RequestMapping("/userAge")

publicString userAge() {

returnuserAge;

}

}

@SpringBootApplication

@EnableEurekaClient

publicclassAppConfigClient {

publicstaticvoidmain(String[] args) {

SpringApplication.run(AppConfigClient.class, args);

}

}

重新整理配置檔案

1.手動採用actuator端點重新整理資料

2.採用bus廣播通知

手動actuator端點重新整理資料

Maven依賴資訊

<!-- actuator監控中心 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

Bootstrap.xml新增

開啟監控斷點

management:

endpoints:

web:

exposure:

include:"*"

生效前提

在需要重新整理的Bean上新增@RefreshScope註解。

@RestController

// @SpringBootApplication

@RefreshScope

publicclassConfigClientController {

http://127.0.0.1:8882/actuator/refresh

@Value("${itmayieduInfo}")

privateString itmayieduInfo;

當配置更改時,標有@RefreshScope的Bean將得到特殊處理來生效配置

手動重新整理介面

Post請求手動重新整理

http://127.0.0.1:8882/actuator/refresh啟動重新整理器 從cofnig server讀取

http://127.0.0.1:8882/actuator/bus-refresh

使用訊息匯流排

三個專案中都加上該依賴資訊

Maven依賴

<!--核心jar包 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-bus-amqp</artifactId>

</dependency>

<!-- actuator監控中心 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-actuator</artifactId>

</dependency>

配置檔案

###開啟bus重新整理

management:

endpoints:

web:

exposure:

include:bus-refresh

重新整理介面http://127.0.0.1:8882/actuator/bus-refresh