springcloud學習-16 springcloud bus 消息總線【周陽springcloud2020學習筆記】

Spring Cloud Bus 是用來將分佈式系統的節點與輕量級消息系統鏈接起來的框架,整合了java的事件處理機制和消息中間件功能。
目前支持RabbitMQ和Kafka兩種消息代理。
能管理和傳播分佈式系統間的消息,就像是一個分佈式執行器,可用於廣播狀態更改、事件推送等,也可以當做微服務間的通信通道。

1.分佈式自動刷新配置功能
2.Spring Cloud Bus配合Spring Cloud Config使用可以實現配置的動態刷新
3.Bus支持兩種消息代理:RabbitMQ和Kafka


rabbitMQ環境配置

1.下載安裝erlang。(因爲rabbitmq服務器是由erlang語言編寫的,所以需要先安裝erlang環境)
鏈接: https://pan.baidu.com/s/1aky1SZqcHuNkQBkMbQVCyA 提取碼: j6qm
2.下載安裝rabbitMQ。
https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
3.進入RabbitMQ安裝目錄下的sbin目錄,輸入以下命令啓動管理功能
【E:\DevSoftWare\RabbitMQ Server\rabbitmq_server-3.7.14\sbin】
rabbitmq-plugins enable rabbitmq_management

4.可視化插件,rabbitMQservice - start 點擊啓動服務
訪問地址查看是否安裝成功:http://localhost:15672/
默認賬號密碼都是 guest


Bus動態刷新全局廣播

一、在原有的基礎上,增加3366(直接copy3355就行了)

1.新建module: config-client3366
2.pom

<?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">
    <parent>
        <artifactId>demo2020</artifactId>
        <groupId>cn.chen.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-client3366</artifactId>

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

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

        <!--公共模塊-->
        <dependency>
            <groupId>cn.chen.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!-- lombok -->
        <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>

</project>

3.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    config: # config客戶端配置
      label: master # 分支名稱
      name: config # 配置文件名稱
      profile: dev # 讀取後綴名稱
      # 上述三個:master分支上的config-dev.yml的配置文件
      uri: http://config-3344.com:3344 # 配置中心地址
      #uri: http://localhost:3344 # 配置中心地址

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

management:
  endpoints:
    web:
      exposure:
        include: "*"

4.主啓動

@SpringBootApplication
public class ConfigClientApplication3366 {

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

}

5.業務類

 @RestController
 @RefreshScope
 @RequestMapping("/configClient")
 public class ConfigClientController {

 	@Value("${server.port}")
 	private String port;

 	@Value("${config.info}")
 	private String configInfo;

 	@GetMapping("/info")
 	public String getConfigInfo(){
 		String result = "來自 " + port + " 端的配置信息:" + configInfo;
 		return result;
 	}

 }
3355也更改一下,方便看信息是來自哪個端的

二、設計思想
兩種方式:
1.利用消息總線觸發一個客戶端/bus/refresh,從而刷新所有客戶端的配置
2.利用消息總線觸發一個服務端ConfigServer的/bus/refresh端點,而刷新所有客戶端的配置(更加推薦)

第一種方式不適合的原因:
1.打破了微服務的職責單一性,因爲微服務本身是業務模塊,它本不應該承擔配置刷新職責
2.破壞了微服務各節點的對等性
3.有一定的侷限性。例如,微服務在遷移時,它的網絡地址常常會發生變化,此時如果想要做到自動刷新,那就會增加更多的修改

三、給cloud-config-center-3344配置中心服務端添加消息總線支持
1.pom文件引入依賴

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

2.yml增加 ①rabbitmq配置(在spring下面) ②暴露端口

    #消息中間件rabbitmq
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

#暴露端口
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

四、給cloud-config-center-3355客戶端添加消息總線支持
1.pom添加依賴

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

2.yml文件添加rabbitmq配置

    #消息中間件rabbitmq
    rabbitmq:
      host: localhost
      port: 5672
      username: guest
      password: guest

五、給cloud-config-center-3366客戶端添加消息總線支持(同上)

六、測試啦啦啦
1.啓動7001、3344、3355、3366
2.改github上配置文件
3.發送post請求:

curl -X POST "http://localhost:3344/actuator/bus-refresh"

一次發送,處處生效

4.訪問
http://config-3344.com/config-dev.yml
http://localhost:3355/configClient/info
http://localhost:3366/configClient/info
總結:一次修改,廣播通知,處處生效


SpringCloud Bus動態刷新定點通知:不需要全部通知,局部通知
1.公式:http://localhost:配置中心的端口號/actuator/bus-refresh/{destination}
server並通過destination參數類指定需要更新配置的服務或實例:服務名:端口號
2.只通知3355:

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

springcloud學習系列目錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章