Spring Cloud構建微服務架構(三)訊息匯流排
注:此文不適合0基礎學習者直接閱讀,請先完整的將作者關於微服務的博文全部閱讀一遍,如果還有疑問,可以再來閱讀此文,地址:http://blog.csdn.net/sosfnima/article/details/53178157,推薦讀者去找作者的書籍《Spring Cloud微服務實戰》進行詳細的學習
序:
接著上一篇博文《Spring Cloud構建微服務架構(二)分散式配置中心》往下說,上一篇博文中,我們分析了分散式配置中心如何去git倉中讀取配置資訊,以及客戶端如何去獲取配置資訊。但是,之前的分析都是需要人工手動維護的,假如我們有100個叢集服務,難道我們要通過手動去分別維護這些資訊嗎?這樣維護的成本太太了,此篇文章則是對上一篇博文的延續,希望通過一次維護,整個叢集中所有服務進行動態更新,大大簡化維護成本。其實,這就是我經常說的熱部署,即不需要重啟伺服器就可以更新系統配置。
訊息中介軟體rabbitMQ:
目前,spring cloud bus訊息匯流排集成了兩種中介軟體,分別是rabbitMQ以及Kafka。而我們專案組用的是rabbitMQ,因此我這一篇的訊息匯流排主要是基於rabbitMQ展開敘述的,至於rabbitMQ的安裝和說明,請參照《Spring Boot中使用RabbitMQ》 一文。
按照上一篇博文配置,其實現原理結構圖如下:
而按此篇博文進行配置,其實現結構如如下:
對比兩張圖,好處一目瞭然。
修改配置中心伺服器:
我們公司已經安裝好了一套完整的rabbitMQ環境,因此我就基於此服務進行說明:
上一篇文章中,我們說到了兩個服務,一個是分散式配置中心伺服器(config-server),還有一個是分散式配置中心客戶端(zuul_serviceA、zuul_serviceC),這裡兩個客戶端程式碼,除了埠不一樣,其他內容一模一樣,你們可以將按照上一篇構建的客戶端程式複製一份,改下服務名以及埠號即可。
首先將config-server配置檔案application.properties修改成如下:
#這些是之前的配置 spring.application.name=configServer server.port=7001 eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/ spring.cloud.config.server.git.uri=http://10.10.10.236/spring/cloud-config.git spring.cloud.config.server.git.searchPaths=cloud-config-repo #由此往下是後新增的RabbitMQ配置資訊 management.security.enabled=false spring.rabbitmq.host=10.10.10.201 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
新增依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</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-eureka</artifactId> </dependency> <!-- 配置中心依賴包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </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>
主程式:
package com.net; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; @EnableDiscoveryClient @EnableConfigServer @SpringBootApplication public class App { public static void main( String[] args ) { new SpringApplicationBuilder(App.class).web(true).run(args); } }
將配置中心註冊到eureka中,這樣後面的客戶端服務zuul_serviceA、zuul_serviceC等等,就可以簡化配置了,具體的資訊在後面說;
至此,我們就可以說已經將訊息匯流排與配置中心進行了整合,此時放在後面說。
修改配置中心客戶端
以zuul_serviceA為例,其他服務具體操作和本服務一致。
新增依賴包:
<!-- eureka服務註冊 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</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-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!-- mysql 驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.0.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.6</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <!-- 訊息匯流排rabbitMQ --> <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> <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
修改配置檔案bootstrap.properties:
spring.application.name=ServiceA server.port=2001 eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/ #spring.cloud.config.hostname=127.0.0.1 #spring.cloud.config.discovery.enabled=true #spring.cloud.config.uri=http://${spring.cloud.config.hostname}:${config.port:7001} #spring.cloud.config.name=lz-hr #spring.cloud.config.profile=aaa,bbb #add bus later spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=configServer spring.cloud.config.name=lz-hr spring.cloud.config.profile=bbb,aaa spring.cloud.config.failFast=true #spring cloud bus management.security.enabled=false spring.rabbitmq.host=10.10.10.201 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest
至此,rabbitMQ在配置中心服務端與客戶端全部配置完畢。
下面一次啟動eurake服務、config-server服務,zuul_serviceA服務以及zuul_serviceC,檢視配置註冊中心資訊:
下面分別檢視zuul_serviceA服務以及zuul_serviceC服務對應的介面資訊:
下面對git倉中的lz-hr-bbb.properties檔案中的bbb屬性進行修改:
按照 上一篇博文《Spring Cloud構建微服務架構(二)分散式配置中心》配置,要分別取重新整理zuul_serverA和zuul_serverC,假如有100個服務,那就要去刷100次,維護成本巨大。
而按照此篇博文配置,只需要重新整理其中一個客戶端服務即可,其他的服務自動進行重新整理,大大降低了維護成本。
下面重新整理zuul_serverA服務,然後分別檢視zuul_serverA服務於zuul_serverC服務,結果檢視的資訊都是最新的:
注:重新整理URL工具為 fiddler