1. 程式人生 > >SpringCloud04 服務配置中心、訊息匯流排、遠端配置動態重新整理

SpringCloud04 服務配置中心、訊息匯流排、遠端配置動態重新整理

1 環境說明

  JDK:1.8

  MAVENT:3.5

  SpringBoot:2.0.5.RELEASE

  SpringCloud:Finchley.SR1

2 建立服務註冊中心(Eureka服務端)

  說明:本博文僅僅以一個單例的註冊中心為例,高可用的服務註冊中心請參見

  2.1 引入依賴

    利用IDEA建立服務註冊中心專案時只需要引入 spring-cloud-starter-netflix-eureka-server 一個依賴就可以啦

        <dependency>
            <groupId>org.springframework.cloud</
groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
<?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.example</groupId> <artifactId>eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>eureka</name> <description>Demo project for Spring Boot</
description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.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> <spring-cloud.version>Finchley.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</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> </project>
pom.xml

  2.2 配置檔案

    配置服務註冊中心埠以及服務服務註冊中心的應用名

    技巧01:單例模式下的服務註冊中心需要關閉向其他服務註冊中心註冊本服務資訊功能從其他服務註冊中心拉取註冊服務資訊功能

server:
  port: 8761

spring:
  application:
    name: eureka

eureka:
  client:
    fetch-registry: false # 關閉從其他服務註冊中心拉取服務資訊
    register-with-eureka: false # 不向其他服務註冊中心註冊本服務的資訊
application.yml

  2.3 引入服務註冊中心配置

    需要在啟動類上利用@EnableEurekaServerSpringBoot為我們提供的Eureka的相關配置引入到系統應用中,否則Eureka服務註冊中心不會生效

    技巧01:@EnableEurekaServer的作用就是將某個配置了Eureka相關配置的類引入到應用容器中

 

  2.4 啟動服務註冊中心

    通過IP和埠訪問的效果如果所示

3 建立Eureka客戶端

  3.1 引入依賴

    利用IDEA建立SpringBoot專案時引入 spring-boot-starter-web、spring-cloud-starter-netflix-eureka-client即可,我這裡同時引入了devtools、lombok只是為了開發方便而已

<?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.example</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.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>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>


</project>
pom.xml

   3.2 配置檔案

    需要配置應用名和應用埠、配置註冊中心連線資訊

  3.4 啟動Eureka客戶端

    啟動類上利用@EnableEurekaClientEureka客戶端的相關配置引入到應用容器中

  3.5 啟動Eureka客戶端

    Eureka客戶端啟動成功後就可以在Eureka服務端的控制頁面看到註冊成功的服務資訊,例如

4 建立ConfigServer

  技巧01:ConfigServer也是一個Eureka客戶端,同樣需要向Eureka服務端進行註冊;只不過這個服務專門負責管理一些配置檔案

  4.1 引入依賴

    利用IDEA建立SpringBoot專案時引入 spring-cloud-starter-netflix-eureka-client 、spring-cloud-config-server 依賴

<?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.example</groupId>
    <artifactId>config</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.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>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>


</project>
pom.xml

  4.2 配置檔案

    需要配置應用埠、應用名、服務註冊中心、遠端程式碼倉庫

  4.3 引入預設配置

    利用@EnableEurekaClient將Eureka客戶端的預設配置引入到應用容器中,利用@EnableConfigServer將配置中心的的預設配置引入到應用容器中

  4.4 啟動配置中心應用

    技巧01:啟動成功後可以在Eureka的控制面板中檢視到相關的服務註冊資訊,例如

  4.5 檢視遠端倉庫中的配置資訊

    技巧01:配置服務中心啟動時會暴露一些URL,可以利用這些URL訪問遠端倉庫中的配置檔案資訊,例如

    4.5.1 訪問規則說明

      /{name}-{profiles}  -> /配置檔案-環境

      /{label}/{name}-{profiles} -> /git分支/配置檔案-環境

      技巧01:以上兩種格式都同時支援 yml、json、properties三種資料格式

    4.5.2 git倉庫配置檔案命名

    4.5.3 通過配置中心訪問指定的配置檔案資訊

      技巧01:訪問任何一個consumer-xxx.yml 的配置檔案時都會和 consumer.yml 進行整合;可以將consumer.yml作為共有配置的存放檔案

      技巧02:使用 /{name}-{profiles}  訪問時預設訪問master分支,可以在配置中心的配置檔案中指定使用哪一個分支

 

  4.6 配置本地倉庫路徑和遠端倉庫分支

    技巧01:配置中心服務從遠端倉庫獲取到配置檔案後會存放到本地的一個預設目錄,可以在配置中心服務的配置檔案中配置這個本地倉庫地址

    技巧02:配置中心配置遠端倉庫地址資訊時可以指定使用遠端倉庫的哪一個分支;如果配置了分支後再使用  /{name}-{profiles}  這種格式獲取配置檔案資訊時就會返回配置分支中的配置檔案資訊;當然亦可以使用 /label/ /{name}-{profiles}  這種格式訪問指定分支的配置檔案資訊

5 配置中心客戶端

  技巧01:需要從配置中心服務獲取配置資訊的服務都可叫作配置中心客戶端

  5.1 引入依賴

    修改第三節的Eureka客戶端,只需要再引入  spring-cloud-config-client 即可

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-client</artifactId>
        </dependency>

  5.2 修改配置

    將原有的配置全部剪下到遠端倉庫中對應的consumer.yml配置檔案中,並將這個cnsumer.yml多複製幾份並制定環境

  5.3 配置啟動配置檔案

    場景:config服務配置中心、consumer一個需要從config服務中獲取配置資訊的服務、eureka服務註冊中心

    技巧01:config和consumer都必須在eureka中心註冊,consumer是通過eureka從config中獲取服務的;所以不能直接將配置中心的連線資訊配置到application.yml中,而是需要新建一個啟動配置檔案bootsttap.yml,需要將應用名、配置中心資訊、註冊中心資訊中心配置到bootstrap.yml中

    技巧02:在bootstrap.yml中配置的應用名必須和遠端倉庫中的配置檔案保持一致,因為需要通過應用名到配置中心去獲取該應用的配置資訊

  5.4 啟動consumer服務

    技巧01:啟動consumer服務時控制檯會打印出配置中心的資訊,例如

  5.4 使用遠端git中的配置檔案  

    技巧01:和使用在 application.yml 中配置的資訊一樣,例如

  5.5 高可用配置中心搭建

    將配置中心打包後分別部署就可以啦,版案例利用IDEA通過不同埠啟動實現

    啟動了兩個配置中心後,多次重啟consumer服務時就會從不同的配置中心獲取資料,例如

6 整合訊息中線

  說明:雖然consumer可以通過配置中心獲取到遠端倉庫中的配置資訊,但是我們修改遠端倉庫中的配置檔案時並不能生效;想用時遠端倉庫的配置生效我們必須一起重啟config服務和consumer服務;如果不想通過從前來實現的話就需要使用訊息匯流排來實現。

  6.1 整合訊息匯流排

    6.1.1 安裝RabbitMQ

      參考博文

      rabbitMQ控制檯

     6.1.2 新增依賴

      分別在consumer和config服務中新增依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

    6.1.3 新增RabbitMQ配置

      技巧01:consumer服務可以配置到遠端服務的consumer.yml檔案中

      技巧02:config服務必須在application.yml中進行配置

    6.1.4 配置config服務

      開啟config服務的所有對映埠,想要讓修改遠端倉庫中的倉庫生效,在修改後必須向config服務傳送一個post請求,請求路徑為: /actuator/bus-refresh

    6.1.5 新增@RefreshScope

      在用到了遠端配置的類級別新增@RefreshScope註解,否則修改遠端倉庫後及時向config的 /actuator/bus-refresh 傳送了post請求也不會進行更新

    6.1.6 啟動config和consumer服務

      啟動服務後會自動在RabbitMQ中建立每個服務各自的queue,和一個springcloudbus對應exchange

    6.1.7 修改重新整理

      》修改遠端倉庫的配置資訊,修改後通過config可以獲取到最新的配置,但是其他服務不會拿到配置;這時ocnfig服務必須觸發一個事件將配置更新放到匯流排佇列中去

      》想config服務的 /actuator/bus-refresh 傳送一個post請求就可以讓consumer服務也獲取到最新的配置資訊

    6.1.8 利用遠端倉庫向config服務的 /actuator/bus-refresh 傳送POST請求

      》利用natapp在遠端倉庫配置webhooks

      》在config服務中引入依賴(如果不引入這個依賴就不會自動重新整理,必須手動向config服務傳送post請求才能實現動態重新整理)

<!--自己新增的依賴:解決了利用github+rabbitmq實現配置動態重新整理的功能-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>

       》修改倉庫配置資訊並提交後config控制檯會輸出日誌資訊,同時rabbitMQ中也會出現訊息的推送和訂閱

7 本博文原始碼

  點選獲取