• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SpringCloud學習筆記【十三】Spring Cloud Bus消息總線

    標簽: SpringCloud  rabbitmq  java  分布式

    本片要點

    • 簡要介紹總線的概念,以及分布式系統解決的問題。
    • 介紹Docker安裝RabbitMQ的基本命令。
    • SpringCloud Bus+ RabbitMQ實現全局動態刷新。

    Spring Cloud Bus簡介

    https://spring.io/projects/spring-cloud-bus

    概述

    SpringCloud Bus是將分布式系統的節點與輕量級消息系統鏈接起來的框架,它整合了Java的事件處理機制和消息中間件的功能。目前支持RabbitMQ和Kafka。【本篇文章使用RabbitMQ作為消息代理】

    管理和傳播分布式系統間的消息,像一個分布式執行器,用于廣播狀態更改,事件推送等,也可以作為微服務間的通信通道。

    SpringCloud Bus可以配合SpringCloud Config實現配置的動態刷新。

    什么是總線

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

    基本原理

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

    Docker安裝RabbitMQ

    可以參考:SpringBoot整合RabbitMQ以及Rabbit隊列學習

    $ docker pull rabbitmq:3-management # management帶web界面管理
    $ docker images  # 查看image ID
    
    $ docker run -d --name myrabbit -p 5672:5672 -p 15672:15672 cc86ffa2f398 #啟動  最后跟著 image ID
    
    $ systemctl status firewalld #查看防火墻的狀態【(running)意思是打開,我們需要設置開放的端口】
    $ firewall-cmd --list-ports #查看防火墻開放的端口
    $ firewall-cmd --zone=public --add-port=15672/tcp --permanent # 開放15672,15672是Web管理界面的端口
    $ firewall-cmd --zone=public --add-port=5672/tcp --permanent # 開放5672,5672是MQ訪問的端口
    $ firewall-cmd --reload # 使修改生效
    

    訪問15672端口即可進入RabbitMQ的web管理界面,賬號密碼默認都是guest。

    演示動態刷新全局廣播前置準備

    前提條件:RabbitMQ環境已成功安裝。

    接下來,仿照3355結構,再新建一個3366。

    新建模塊,引入依賴

            <!--添加消息總線RabbitMQ支持-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bus-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>	
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    

    配置bootstrap.yml

    server:
      port: 3366
    
    spring:
      application:
        name: config-client
      cloud:
        #Config客戶端配置
        config:
          label: master #分支名稱
          name: config #配置文件名稱
          profile: dev #讀取后綴名稱   
          uri: http://localhost:3344 #配置中心地址
    
      #rabbitmq相關配置 15672是Web管理界面的端口;5672是MQ訪問的端口
      rabbitmq:
        host: [your hostname]
        port: 5672
        username: guest
        password: guest
    
    #服務注冊到eureka地址
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:7001/eureka
    
    # 暴露監控端點
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    

    編寫主啟動類

    @EnableEurekaClient
    @SpringBootApplication
    public class ConfigClientMain3366 {
        public static void main(String[] args) {
            SpringApplication.run(ConfigClientMain3366.class, args);
        }
    }
    

    編寫接口

    @RestController
    @RefreshScope
    public class ConfigClientController {
        @Value("${server.port}")
        private String serverPort;
    
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/configInfo")
        public String configInfo() {
            return "serverPort: " + serverPort + "\t\n\n configInfo: " + configInfo;
        }
    }
    

    設計思想

    設計思想主要是以下兩種:

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

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

    相比之下,圖二的架構【通知服務端ConfigServer】更加合理,圖一不合理的原因如下:

    1. 打破了微服務的職責單一性,微服務本身為業務模塊,不應該擔任刷新配置的職責。
    2. 破壞了微服務各節點的對等性。
    3. 存在局限,如微服務遷移時,網絡地址時常發生變化,這時如果希望自動刷新,會作更多的修改。

    開始演示動態刷新全局廣播

    前提:前置準備已經完成,此時擁有3344ConfigServer,3355和3366Client,和Eureka配置中心7001。

    為三個模塊都添加消息總線支持

            <!--添加消息總線RabbitMQ支持-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bus-amqp</artifactId>
            </dependency>
    

    為三個模塊配置yml

    #rabbitmq相關配置
      rabbitmq:
        host: [your hostname]
        port: 5672
        username: guest
        password: guest
    

    為ConfigServer配置yml

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

    為ConfigClient配置yml

    # 暴露監控端點
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    

    測試

    依次啟動7001,3344,3355,3366模塊,進行測試,依次訪問:

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

    暫時是沒有任何問題的,配置信息能夠成功從Gitee上獲取得到。

    此時改變配置信息的版本號,并向ConfigServer發送一次POST請求:

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

    再次測試3355和3366config client,已經成功實現一次通知,處處更新。

    原理回顧

    ConfigClient 實例都監聽RabbitMQ中同一個topic【默認是SpringCloudBus】。當一個服務刷新數據的時候,它會把這個消息放入Topic中,這樣其他監聽同一Topic的服務就能夠得到通知,然后去更新自身的配置。

    動態刷新定點通知

    我們已經通過Spring Cloud Bus + RabbitMQ實現了一處通知,全局廣播,處處更新。那,如果我只想通知其中某個client更新呢?如何定點通知只指定某個實例生效呢?

    我們可以通過通知的url指定實例的destination:http://localhost:3344/actuator/bus-refresh/{destination},此時bus/refresh通知會通過destination參數類指定需要更新配置的服務或實例。

    比如,只通知3355可以發送下面這個請求:

    $ curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
    
    • config-client為spring.application.name。
    • 3355為對應的端口號。

    源碼下載

    本系列文章為《尚硅谷SpringCloud教程》的學習筆記【版本稍微有些不同,后續遇到bug再做相關說明】,主要做一個長期的記錄,為以后學習的同學提供示例,代碼同步更新到Gitee:https://gitee.com/tqbx/spring-cloud-learning,并且以標簽的形式詳細區分每個步驟,這個系列文章也會同步更新。

    版權聲明:本文為Sky_QiaoBa_Sum原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Sky_QiaoBa_Sum/article/details/110352081

    智能推薦

    spring cloud bus消息總線

    解決的痛點: 當git倉庫的配置更新后, cloud config 客戶端不能獲取到配置信息的問題, 需要手動發送請求,刷新配置。 可以參照 spring cloud config cloud bus bus 消息總線使用rabbitMQ推送消息 原理架構 實現 使用curl命令刷新客戶端的配置 bus bus配合config可以實現配置的動態刷新。 Spring Cloud Bus是用來將分布式...

    Spring Cloud Bus消息總線

    目錄 一、概述簡介 1.1. Bus是什么 1.2. Bus能干嘛 1.3. 為何被稱為總線 二、RabbitMQ環境配置 2.1. windows下載與安裝 2.2. 使用RabbitMQ 三、Bus動態刷新全局廣播 3.1. Bus設計思想 3.2. 代碼實現 3.2.1. 調整3344config服務端 3.2.2. 調整3355config客戶端 3.2.3. 搭建3366config客戶...

    SpringCloud(8 消息總線(Spring Cloud Bus))

    本篇內容主要來自于互聯網,僅供參考 基于本人的上一篇博客:  https://blog.csdn.net/aa15237104245/article/details/81284878     Spring Cloud Bus Spring Cloud Bus 將分布式的節點用輕量的消息代理連接起來。它可以用于廣播配置文件的更改或者服務之間的通訊,也可以用于監控。本文要...

    SpringCloud - (七)消息總線(Spring Cloud Bus)

    簡介 Spring Cloud Bus 將分布式的節點用輕量的消息代理連接起來。它可以用于廣播配置文件的更改或者服務之間的通訊,也可以用于監控。 本文要講述的是用Spring Cloud Bus實現通知微服務架構的配置文件的更改。 前提 你的電腦的提前安裝好RabbitMq 改造Ahut-Config-Client項目 項目pom文件添加依賴 完整的pom.xml文件代碼如下: 在讀取配置文件的類...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡