1. 程式人生 > >springCloud(F版)(7)——config分散式配置中心及bus訊息匯流排

springCloud(F版)(7)——config分散式配置中心及bus訊息匯流排

前面我們已經建立了一個系統結構,包括Eureka配置中心,slueth(zipkin)服務追蹤,ribbon及feign負載均衡,zuul路由閘道器,hystrix斷路器、dashboard監控、turbine聚合監控等。下面來學習瞭解一下config配置中心,如何將配置中心註冊到eureka進行叢集化實現高可用,bus匯流排更新config配置。

一、部署一個簡單的config配置中心configServer及客戶端configclient

config配置中心的部署包括server和client兩部分。使用spring-cloud-config-server和spring-cloud-starter-config兩個依賴包

首先建立一個配置中心configserver,修改pom檔案(為了快速搭建,我只是在工程中新增了module,又開始使用前面博文中的父pom檔案了,我還是都粘出來吧)

父pom檔案內容(其實只是固定了springboot2.0版本和springcloud F版本,沒有什麼其他配置):

<?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.springcloud</groupId>
    <artifactId>testspringcloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>springcloud</name>
    <description>Demo project for Spring Cloud</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </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.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <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>

configserver的pom檔案(添加了web依賴包和configserver依賴包):

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

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

    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>testspringcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
</project>

修改application.properties配置檔案:

spring.application.name=config-server
server.port=8888

spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
spring.cloud.config.server.git.searchPaths=respo
spring.cloud.config.label=master
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=

用了別人的github地址,自己可以依據需要修改,後續我也會調整博文使用自己本地配置檔案資訊

修改**application.java入口類,新增@EnableConfigServer依賴

@SpringBootApplication
@EnableConfigServer
public class ConfigserverApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigserverApplication.class, args);
    }
}

啟動configserver服務,瀏覽器訪問http://localhost:8888/foo/dev檢視到下面的資訊就表示配置中心已經啟動成功了

然後建立一個configclient工程,修改pom檔案,引入spring-cloud-starter-config依賴包

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

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

    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>testspringcloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
</project>

修改配置檔案,將來configserver的服務地址告訴configclient

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri= http://localhost:8888/
server.port=8881

修改**application.java入口類,建立一個hi介面來反饋讀入的配置資訊,測試configclient是否能夠通過configserver得到配置資訊

@SpringBootApplication
@RestController
public class ConfigclientApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigclientApplication.class, args);
    }
    @Value("${foo}")
    String foo;
    @RequestMapping(value = "/hi")
    public String hi(){
        return foo;
    }
}

啟動configclient工程(當然這時候configserver要處於啟動狀態)

瀏覽器訪問剛剛配置好的hi介面 http://localhost:8881/hi 得到如下截圖資訊就表示configclient已成功從configserver得到配置資訊

二、將配置中心configserver註冊到eurekaserver註冊中心,通過叢集實現高可用。

啟動一個eurekaserver在我前面的博文裡有,就不贅述了,還是使用8761埠開通註冊中心

修改configserver的pom檔案,新增eureka client 的依賴包

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

修改application.properties配置檔案,新增eureka server的服務介面

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

啟動eureka server,瀏覽器訪問http://localhost:8761就可以看到eureka server 的視覺化頁面。

重新啟動剛剛修改好的configserver,然後重新整理eureka server的頁面看看是否註冊成功。

實現高可用無非是多臺裝置啟動一樣的configserver服務註冊到eureka server中形成服務叢集,本地測試沒有意義,我就開一個好了。

下面調整configclient,也配置成eureka client註冊到註冊中心,修改pom檔案新增eureka client的依賴包,上面有我就不貼上了。

修改configclient的application.properties配置檔案,新增eureka server的服務地址,同時將config server的服務地址識別方式從指定的ip+port改成註冊中心的serviceID(application name)。

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
#spring.cloud.config.uri= http://localhost:8888/
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server 
server.port=8881

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

然後啟動config client(這時eureka server 和 config server應處於啟動狀態),瀏覽器再次呼叫hi介面看看效果

至此,高可用的配置中心部署完成。我們已經可以通過configserver為所有的configclient系統提供統一的配置資訊。下面來學習一下如何在配置中心修改配置資訊,然後通知configclient去及時更新配置資訊。

三、調整配置中心讀取本地配置

前面為了快速搭建學習config元件,使用了別人教程裡的github配置,企業部署系統的時候想必沒多少人願意把自己的配置放到別人的伺服器上,尤其是一些敏感資訊。那麼下面我們調整configserver的配置檔案,將配置資訊的讀取從github上遷回本地。

spring.application.name=config-server
server.port=8888
#從github上讀取配置資訊
#spring.cloud.config.server.git.uri=https://github.com/forezp/SpringcloudConfig/
#spring.cloud.config.server.git.searchPaths=respo
#spring.cloud.config.label=master
#spring.cloud.config.server.git.username=
#spring.cloud.config.server.git.password=
#從本地檔案讀取配置資訊
spring.profiles.active=native
spring.cloud.config.server.native.search-locations=D:/conf

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

我只是註釋掉了原來github的地址,新增了本地地址D:/conf。然後在該地址上放一個配置檔案config-client-dev.properties

檔名是用來識別給哪個serviceID用的配置檔案,弄懂了再修改,不然config client啟動的時候可就讀不到配置資訊了。

config-client-div.properties檔案中寫入 foo=test-foo-info 

重新看一下config client的配置檔案

spring.application.name=config-client
spring.cloud.config.label=master
spring.cloud.config.profile=dev
#指定配置中心uri
#spring.cloud.config.uri= http://localhost:8888/
#指定配置中心serviceID
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.serviceId=config-server 
server.port=8881

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

沒有修改config client的配置,只是確認一下資原始檔對映

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

確保在配置中心的config-client-dev.properties會被識別到。

重新啟動config server和config client。瀏覽器呼叫hi介面 http://localhost:8881/hi

讀取配置中心配置資訊成功。

四、bus匯流排實現配置資訊的更新通知。

前面第三節我們修改配置中心的配置到本地之後,config server和config client都要重啟才能讀入我新的配置檔案資訊,那麼當微服務眾多時候,想統一修改配置資訊我們當然不希望幹掉程序重新啟動所有的微服務。下面通過bus訊息匯流排實現配置資訊變化的通知。

由於bus訊息匯流排使用rabbitMQ訊息佇列進行訊息推送,因此要先下載安裝並啟用rabbitMQ server。可以參考我的教程:

https://blog.csdn.net/qq_15903671/article/details/82754025 下載安裝之後需要啟動rabbitMQ server,然後進行下面的調整。

其實只需要在config client開發的時候引入spring-cloud-starter-bus-amqp和spring-boot-starter-actuator依賴包,修改配置檔案引用rabbitMQ,入口類加上相應註解就可以了。OK,調整config client程式,pom檔案新增依賴包。

<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>

修改配置檔案,新增rabbitmq和bus訊息匯流排的配置

#配置rabbitmq
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#配置bus訊息匯流排
spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=bus-refresh

修改入口類,添加註解

@SpringBootApplication
@RestController
@EnableEurekaClient
@EnableDiscoveryClient
@RefreshScope

maven下將configclient專案打包,執行8881和8882兩個埠進行測試

然後修改D:/conf下儲存的config-client-dev.properties配置檔案中的資訊,修改成foo=test-new-info

啟動postmen,使用post方式呼叫http://localhost:8881/actuator/bus-refresh通知8881這個服務,配置資訊已更改。

body裡什麼也不要寫,不然會報錯。再次呼叫8881和8882的hi介面看看效果

測試顯示,配置檔案的修改已經通過bus訊息匯流排通知到所有config-client服務進群中的每個服務,配置更新成功。