一塊兒來學Spring Cloud | 第八章:消息總線(Spring Cloud Bus) 一塊兒來學Spring Cloud | 第七章:分佈式配置中心(Spring Cloud Config)

上一章節,咱們講解了分佈式配置中心spring cloud config,咱們把配置項存放在git或者本地,當咱們修改配置時,須要從新啓動服務才能生效。可是在生產上,一個服務部署了多臺機器,從新啓動比較麻煩且會短暫影響用戶體驗。spring cloud生態在發展,確定有對應的解決之法,接下來將要講解的Spring Cloud Bus就是爲了解決這一難題而存在的。html

Spring Cloud Bus(消息總線)經過一個輕量級的消息中間件能夠鏈接分佈式系統中的各個節點。使用該總線來廣播某些狀態的改變(好比配置信息發生變動)或其餘管理指令。能夠說,消息總線是spring boot應用擴展「道路」上的推動器,並且也把它用來做應用間相互通訊的消息管道。java

1、項目搭建:git

1. 環境準備web

本章仍是基於上一章來實現的,上一章講解了git和本地配置兩種方式,配置刷新原理都是同樣的,此次咱們只講git配置修改後進行刷新。spring

上一章節內容能夠參考:一塊兒來學Spring Cloud | 第七章:分佈式配置中心(Spring Cloud Config)apache

2. 修改config-client
上一章節springcloud-feign-client模塊充當着咱們的config-client功能,因此在springcloud-feign-client模塊的pom.xml文件中加上依賴spring-cloud-starter-bus-amqp。
所以須要安裝rabbitMq,你們能夠本身去下載安裝。
<?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>

	<parent>
		<groupId>com.haly</groupId>
		<artifactId>springcloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<groupId>com.haly</groupId>
	<artifactId>springcloud-feign-client</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springcloud-ribbon-client</name>
	<description>新建一個springcloud項目</description>

	<dependencies>
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
           <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.haly</groupId>
            <artifactId>springcloud-config</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3. 在springcloud-feign-client模塊的application.properties中加上RabbitMq的配置,包括RabbitMq的地址、端口,用戶名、密碼。並加上spring.cloud.bus的三個配置:瀏覽器

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=young
spring.rabbitmq.password=young

spring.cloud.bus.enabled=true
spring.cloud.bus.trace.enabled=true
management.endpoints.web.exposure.include=bus-refresh

4. springcloud-feign-client模塊的啓動類上加上註解:@RefreshScopeapp

package com.haly;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@RefreshScope
public class SpringcloudFeignClientApplication {

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

}

5. springcloud-feign-client模塊的測試類FeignController,測試上一章節的/testconfig方法,具體內容能夠參考:一塊兒來學Spring Cloud | 第七章:分佈式配置中心(Spring Cloud Config) maven

package com.haly.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.haly.romote.FeignRemoteService;


@RestController
public class FeignController {
	
    @Autowired
    FeignRemoteService feignRemoteService;

    @Value("${configword}")
    String configword;
    
    @GetMapping(value = "/getHello")
    public String getHello(@RequestParam String name) {
        return feignRemoteService.hello(name);
    }

    @GetMapping(value = "/testzuul")
    public String testzuul(@RequestParam String name) {
        return name +",這是springcloud-feign-client的服務接口";
    }
	
    @GetMapping(value = "/testconfig")
    public String testconfig(@RequestParam String name) {
        return name +",git配置值:" + configword ;
    }
}
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

6. 運行項目分佈式

啓動springcloud-eureka-server,啓動springcloud-config-server,啓動springcloud-config,最後啓動springcloud-feign-client模塊

爲了測試配置修改,多個服務實例都能更新,就啓動兩個 springcloud-feign-client 實例,端口分別是9600,9601,sts啓動兩個實例(端口爲9600時啓動項目,而後將端口改爲9601,再啓動項目)。

瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農 或者輸入 http://localhost:9601/testconfig?name=young碼農

頁面展現結果young碼農,git配置值:NewConfig !

7. 修改git配置,從新運行項目

這時咱們去代碼倉庫將configword的值改成「update config」,即改變配置文件configword的值。若是是傳統的作法,須要重啓服務,才能達到配置文件的更新。

如今,咱們只須要發送post請求:http://localhost:8881/actuator/bus-refresh,你會發現springcloud-feign-client會從新讀取配置文件,接着咱們查看頁面運行結果。

瀏覽器輸入:http://localhost:9600/testconfig?name=young碼農 或者輸入 http://localhost:9601/testconfig?name=young碼農

頁面展現結果:young碼農,git配置值:update config !

 2、總結:

使用"destination"參數,/actuator/bus-refresh接口能夠指定服務,例如 「/actuator/bus-refresh?destination=client:**」, 即刷新服務名爲client的全部服務。

經過上面的測試,咱們能夠知道當git文件更改的時候,用post 向端口爲8882的config-client發送請求/bus/refresh/;此時8882端口會發送一個消息,由消息總線向其餘服務傳遞,從而使整個微服務集羣都達到更新配置文件。

引入程序猿DD 畫的一張圖片,簡單理解一下刷新原理:

最後項目目錄結構:

相關文章
相關標籤/搜索