SpringCloud——中級(四)消息總線 Bus(含RabbitMQ)

消息總線Bus(含RabbitMQ)

一、概述

1、對Config的加深和擴充

分佈式自動刷新配置功能

Spring Cloud Bus 配合 Spring Cloud Config
使用可以實現配置的動態刷新

2、是什麼

Bus支持兩種消息代理:RabbitMQ和Kafka
在這裏插入圖片描述
Spring Cloud Bus 是用來將分佈式系統的節點與輕量級消息系統鏈接起來的框架,
它整合了Java的事件處理機制和消息中間件的功能。
Spring Cloud Bus目前支持RabbitMQ和Kafka.

3、能幹嘛

Spring Cloud Bus能管理和傳播分佈式系統間的消息,就像一個分佈式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通信通道
在這裏插入圖片描述

4、爲何被稱爲總線

1)什麼是總線

在微服務架構的系統中,通常會使用輕量級的消息代理來構建一個共用的消息主題,並讓系統中所有微服務實例都連接上來。由於該主題中產生的消息會被所有實例監聽和消費,所以稱它爲消息總線。在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息

2)基本原理

ConfigClient 實例都監聽MQ中同一個topic(默認是springCloudBus)。當一個服務刷新數據的時候,它會把這個信息放入到Topic中,這樣其他監聽同一Topic的服務就能得到通知,然後去更新自身的配置。

二、RabbitMQ環境配置

直接使用docker命令安裝
此處省略。。。
運行成功進入RabbitMQ Web管理界面
在這裏插入圖片描述
默認賬號密碼都是 guest

三、SpringCloud Bus動態刷新全局廣播

1、演示廣播效果,增加複雜度,再以3355爲模板再創建3366

Controller:

package com.atguigu.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RefreshScope
public class ConfigClientController {

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

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

    @GetMapping("/configInfo")
    public String getConfigInfo(){
        return "serverPort: "+serverPort+"\t\n\n configInfo: "+configInfo;
    }
}

2、設計思想

1)利用消息總線觸發一個客戶端/bus/refresh,而刷新所有客戶端的配置

在這裏插入圖片描述

2)利用消息總線觸發一個服務單ConfigServer的/bus/refresh端點,而刷新所有客戶端的配置

在這裏插入圖片描述

3)顯然圖二的架構更加合適,圖一不適合的原因

1、破壞了微服務的職責單一性,因爲微服務本身是業務模塊,它本不應該承擔配置刷新的職責。
2、破壞了微服務各節點的對等性
3、有一定的侷限性。例如,微服務再遷移時,它的網絡地址常常會發生變化,此時如果想要做到自動刷新,那就會增加更多的修改
故使用第二種思想,通知總控

3、給cloud-config-center-3344配置中心添加消息總線支持

POM:

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

YML:

server:
  port: 3344

spring:
  application:
    name: cloud-config-center #註冊進Eureka服務器的微服務名
  cloud:
    config:
      server:
        git:
          uri: https://github.com/18735171447/springcloud-config #GitHub上面的git倉庫名字
          #搜索目錄
          search-paths:
            - springcloud-config
          #basedir: D:\GitCode\SpringCloud2020\springcloud-config

      #讀取分支
      label: master

  ##rabbitmq相關配置
  rabbitmq:
    host: 101.200.198.216
    port: 5672
    username: guest
    password: guest

#服務器註冊到eureka的地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

##rabbitmq相關 配置,暴露bus刷新配置的端點
management:
  endpoints: #暴露bus配置的端點
    web:
      exposure:
        include: 'bus-refresh'

4、給cloud-config-client-3355客戶端添加消息總線支持

Pom:同上

YML:

  ##rabbitmq相關配置
  rabbitmq:
    host: 101.200.198.216
    port: 5672
    username: guest
    password: guest

5、給cloud-config-client-3366客戶端添加消息總線支持

同上。。。

6、測試

1)修改GitHub上 配置文件增加版本號

2)發送post請求http://localhost:3344/actuator/bus-refresh ,一次發送,處處生效

http://config-3344.com:3344/master/config-dev.yml
http://localhost:3355/configInfo
http://localhost:3366/configInfo

7、一次修改,廣播通知,處處生效

四、SpringCloud Bus動態刷新定點通知

1、不想全部通知,只想定點通知

只通知3355,不通知3366

2、一句話

指定具體某一個實例生效而不是全部生效
公式:http://localhost:3344/actuator/bus-refresh/{destination}
destination=微服務名:端口號
/bus/refresh請求不再發送到具體的服務實例上,而是發給config server並通過destination參數類指定需要更新配置的服務或實例

3、案例

post請求只刷新3355:http://localhost:3344/actuator/bus-refresh/config-client:3355

4、總結:

在這裏插入圖片描述

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