1. 程式人生 > >Spring Cloud構建微服務架構(三)訊息匯流排

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