史上最簡單的SpringCloud教程 | 第八篇: 消息匯流排(Spring Cloud Bus)

Spring Cloud Bus 將分散式的節點和輕量的消息代理連接起來。這可以用於廣播配置文件的更改或者其他的管理工作。一個關鍵的思想就是,消息匯流排可以為微服務做監控,也可以作為應用程序之間相互通訊。本文要講述的是用AMQP實現通知微服務架構的配置文件的更改。

一、準備工作

本文還是基於上一篇文章來實現。按照官方文檔,我們只需要在配置文件中配置 spring-cloud-starter-bus-amqp ;這就是說我們需要裝rabbitMq,點擊rabbitmq下載。至於怎麼使用 rabbitmq,搜索引擎下。

二、改造config-client

在pom文件加入spring-cloud-starter-bus-amqp,完整的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.forezp</groupId> <artifactId>config-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>config-client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories></project>

在配置文件中加入:

spring.rabbitmq.host=localhostspring.rabbitmq.port=5672# spring.rabbitmq.username=# spring.rabbitmq.password=

如果rabbitmq有用戶名密碼,輸入即可。

依次啟動eureka-server、confg-cserver,啟動兩個config-client,埠為:8881、8882。

訪問localhost:8881/hi 或者localhost:8882/hi 瀏覽器顯示:

foo version 3

這時我們去代碼倉庫將foo的值改為「foo version 4」,即改變配置文件foo的值。如果是傳統的做法,可以需要重啟服務,才能達到配置文件的更新。此時,我們只需要用post請求:localhost:8881/bus/refr

重新讀取配置文件:

這時我們再訪問localhost:8881/hi 或者localhost:8882/hi 瀏覽器顯示:

foo version 4

另外,/bus/refresh介面可以指定服務,即使用」destination」參數,比如 「/bus/refresh?destination=customers:**」 即刷新服務名為customers的所有服務,不管ip。

三、分析

此時的架構圖:

當Git文件更改的時候,通過pc端用post 向埠為8882的config-client發送請求/bus/refresh/;此時8882埠會發送一個消息,由消息匯流排向其他服務傳遞,從而使整個微服務集群都達到更新配置文件。

四、其他

可以用作自定義的Message Broker,只需要spring-cloud-starter-bus-amqp, 然後再配置文件寫上配置即可,同上。

Tracing Bus Events:

需要設置:spring.cloud.bus.trace.enabled=true,如果那樣做的話,那麼Spring Boot TraceRepository(如果存在)將顯示每個服務實例發送的所有事件和所有的ack,比如:(來自官網)

{ "timestamp": "2015-11-26T10:24:44.411+0000", "info": { "signal": "spring.cloud.bus.ack", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "stores:8081", "destination": "*:**" } }, { "timestamp": "2015-11-26T10:24:41.864+0000", "info": { "signal": "spring.cloud.bus.sent", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "customers:9000", "destination": "*:**" } }, { "timestamp": "2015-11-26T10:24:41.862+0000", "info": { "signal": "spring.cloud.bus.ack", "type": "RefreshRemoteApplicationEvent", "id": "c4d374b7-58ea-4928-a312-31984def293b", "origin": "customers:9000", "destination": "*:**" }}

本文源碼下載:

forezp/SpringCloudLearning

五、參考資料

spring_cloud_bus

轉載請標明出處:

史上最簡單的SpringCloud教程 | 第八篇: 消息匯流排(Spring Cloud Bus)

本文出自方誌朋的博客

推薦閱讀:

Spring Boot中使用Flyway來管理資料庫版本
Spring Security源碼分析五:Spring Security實現簡訊登錄
用小說的形式講解Spring(1) —— 為什麼需要依賴注入
周末薦書 | 《Spring實戰》(第4版)

TAG:SpringCloud | Spring | Java |