SpringCloud Bus动态刷新全局广播

SpringCloud

Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新,通知一处,处处生效。而不用一个一个去通知。

Spring Cloud Bus是消息总线,广播通知都可以集成,不止用于实现配置的动态刷新。

简介

分布式自动刷新配置功能

SpringCloud Bus是用来将分布式系统的节点与轻量级消息连接起来的框架,它整合了Java的事件处理机制和消息中间件的功能。

SpringCloud Bus目前支持RabbitMQ和Kafka。

什么是总线:

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由该主题中产生的消息会所有的实例监听和消费,所以称它为消息总线,在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的商息。

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus).当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic们服务就能得到通知,然后去更新自身的配置。
https://www.bilibilicom/ideo/avss9767007from=search&seid=15010075915728605208

设计思想

2种:

一、利用消息总线触发一个客户端/bus/refesh,而刷新所有客户端的配置

二、利用消息总线触发一个服务端ConfigServer的/bus/refesh端点,而刷新所有客户端的配置

显然第二种方式更加适合,第一种不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责
  • 打破了微服务各节点的对等性
  • 有一定的局限性.例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做自动刷新,那就会增加更多的修改

实现配置的动态刷新

这里是运用rabbitmq消息中间件的,先搭建rabbitmq环境

客户端

创建多个客户端微服务,测试范例:

依赖配置:

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

bootstrap.yml

server:port: 3366spring:
#    application:
#      name: config-client3366cloud:config:label: master # 分支名称name: application # 配置文件名称,可自定义,最好application/configprofile: dev # 文件中的dev profile内容,上述三个综合,为master分支上的application.yml的配置文件中的dev内容被读取http://localhost:3344/application/dev/masteruri: http://localhost:3344 #配置中心的地址rabbitmq: #rabbitmq相关配置,15672是web管理端口,5672是mq访问端口port: 5672host: 192.168.169.135username: guestpassword: guesteureka:client:service-url:defaultZone: http://localhost:7001/eurekamanagement:endpoints:web:exposure:include: "*"

controller

/**** @author zzyy* @version 1.0* @create 2020/03/06*/
@RestController
@RefreshScope
public class ConfigClientController {@Value("${spring.application.name}")private String applicationName;@Value("${server.port}")private String serverPort;@GetMapping("/applicationName")public String getApplicationName(){return serverPort + ":  " + applicationName;}}

服务端

依赖配置:

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

application.yml

server:port: 3344spring:application:name: cloud-config-centercloud:config:server:git:uri: https://github.com/wzq-55552/springcloud-config.git #配置远程的仓库地址springcloud-configsearch-paths:- springcloud-configlabel: master #进到仓库的主分支rabbitmq:host: 192.168.169.135port: 5672username: guestpassword: guesteureka:client:service-url:defaultZone: http://localhost:7001/eureka# 暴露bus刷新配置的端点,bus-refresh
management:endpoints:web:exposure:include: "bus-refresh"

启动类加入注解@EnableConfigServer

测试

微服务全部启动

修改github上的配置文件内容:

spring:profiles: dev     #开发环境application: name: github-dev-config-bus-application-name-2

服务端可以同步改变,但是客户端得重新启动才可以同步修改,默认客户端是无法立即生效的,查看controller:

这时运维人员执行(3344是配置中心的端口):curl -X POST "http://localhost:3344/actuator/bus-refresh"可以cmd执行测试,这里我使用postman:

http://localhost:3344/actuator/bus-refresh 必须是post请求

再一次查看所有客户端controller(返回配置信息):

查看rabbitmq的交换机,这时默认有了springCloudBus交换机:

动态刷新定点通知

不想全部通知,只想定点通知,只通知3355,不通知3366。

指定具体一个实例生效而不是全部

http://localhost:配置中心端口号/actuator/bus-refresh/{destination}

/bus/refresh请求不再发送到具体的服务实例上,而是发给config server并通过destination参数类指定需要重新配置的服务或实例

curl -X POST “http://localhost:3344/actuator/bus-refresh/微服务名:微服务端口”

后面格式是微服务名:微服务端口

测试:

修改测试客户端:

    @Value("${server.port}")private String serverPort;@Value("${spring.config.info}")private String configInfo;@GetMapping("/configInfo")public String getConfigInfo(){return serverPort + ":  " + configInfo;}

微服务配置修改为获取test环境,全部启动

github修改内容,初始test:

postman 发送post请求http://localhost:3344/actuator/bus-refresh/config-client3355:3355 修改3355微服务的配置:

定点通知只能修改一个微服务的配置

SpringCloud微服务(七)——Bus服务消息总线相关推荐

  1. SpringCloud微服务-服务注册发现-负载均衡-服务调用-服务降级-服务网关-配置中心-消息总线-消息驱动-链路追踪-alibaba-nacos-sentinel-seata理论原理分析

    SpringCloud理论技术 概述 ​ Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总 ...

  2. SpringCloud04 服务配置中心、消息总线、远程配置动态刷新

    1 环境说明 JDK:1.8 MAVENT:3.5 SpringBoot:2.0.5.RELEASE SpringCloud:Finchley.SR1 2 创建服务注册中心(Eureka服务端) 说明 ...

  3. springcloud(九):配置中心和消息总线(配置中心终结版)

    我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端 ...

  4. springcloud微服务架构开发实战:分布式消息总线

    消息总线的定义 前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制. 在3.6节中也详细介绍了消息通信的实现方式.消息总线就是一种基于消息的通信机制. 消息总线是 ...

  5. SpringCloud Bus消息总线

    目录 是什么? 如何使用? Docker安装RabbitMQ SpringCloud Bus动态刷新全局广播 SpringCloud Bus动态刷新定点通知 是什么? SpringCloud Bus是 ...

  6. 多项目如何高效协同合作 | springcloud系列之bus消息总线

    前言 在springcloud config章节中我们完成了配种中心的搭建,以及通过配置中心完成配置的抽离通过springcloud config模块我们将配置抽离到git仓库中我们不必要每次为了改配 ...

  7. SpringCloud - 微服务架构系统

    过渡分布式微服务 以前的架构还是最原始阶段,官网.论坛.云平台等应用即一台服务器搞定一切.对应的web服务器.数据库.静态文件资源等,部署到一台服务器上即可.一般每秒几百请求没啥问题,结合内核参数调优 ...

  8. Spring Cloud Bus消息总线

    目录 一.概述简介 1.1. Bus是什么 1.2. Bus能干嘛 1.3. 为何被称为总线 二.RabbitMQ环境配置 2.1. windows下载与安装 2.2. 使用RabbitMQ 三.Bu ...

  9. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

最新文章

  1. python sanic_sanic中文文档
  2. linux cp命令 前面,盘点Linux命令之Linux cp命令使用大全
  3. 使用CEfSharp之旅(1) 加载网络页面
  4. ant更改主题色报错Inline JavaScript is not enabled. Is it set in your options? vue ant主题色更改 vue-cli3
  5. 自动生成业务单据流水号方案
  6. UNIX(多线程):20---生产者消费者实例
  7. android 屏幕坐标色彩,Android自定义View实现颜色选取器
  8. 高级语言中的关键字:const用法分析
  9. 最全面的AndroidStudio配置指南总结-包括护眼模式
  10. Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?
  11. 《自己动手写网络爬虫》笔记2-Http状态码
  12. php redis 令牌桶算法
  13. MSP430 F5529 单片机 串口 万年历 电子时钟 数字时钟 Digital clock
  14. github搭建php,在github规范开发以及持续构建php项目
  15. 计算机触摸板设置方法,笔记本电脑触摸板设置
  16. Android隐藏app应用图标
  17. win7万能声卡驱动_驱动精灵万能网卡版下载-驱动精灵万能网卡版免费下载
  18. 为什么游戏流畅需要60帧,而电影流畅只需要24帧?
  19. 20个免费的webservice接口(测试人员必须知道)
  20. 查查自己五行属什么命_ywyuan_新浪博客

热门文章

  1. 大创小组讨论会议纪要2
  2. ABBYY15免费版直接编辑PDF格式文件
  3. centos6 搭建hdwiki
  4. arch linux 2014 安装教程,Arch Linux 2014.03.01 硬盘安装 Win + Grub4dos + Arch
  5. java calendar 2月份_Calendar.MONTH 2月29号加一个月 问题
  6. 第十届(2022年)全国大学生机械创新设计大赛参赛须知
  7. storm32和pixhawk_STORM32云台板调参教程 新人可参考 大师请指点
  8. easyui datagrid编辑时修改其它列的数值.
  9. 活用WINDOWS,彻底保护隐私
  10. 仿QQ空间的评论编辑器实现