文章目录

  • 1、概述
    • ①、工作流程
    • ②、什么是总线
    • ③、基本原理
  • 2、RabbitMQ环境配置
    • ①、Windows安装ErLang
    • ②、Windows安装RabbitMQ
    • ③、安装安装管理工具RabbitMQ-Plugins
    • ③、Docker安装
      • Ⅰ、拉取镜像
    • Ⅱ、运行容器
      • Ⅲ、访问web管理页面
  • 3、动态刷新全局广播
    • ①、创建新的module
    • ②、测试
    • ③、ConfigServer添加消息总线的支持
      • Ⅰ、POM
      • Ⅱ、YML
    • ④、ConfigClient添加消息总线的支持
      • Ⅰ、POM
      • Ⅱ、YML
    • ⑤、测试
  • 4、动态刷新的定点通知
    • ①、一个小公式
    • ②、测试

1、概述

在学习完Config之后,我们发现了一个问题就是每当配置中心配置发生变化以后,都需要将每个微服务重新启动一遍,这样对于某些大型项目而言是很痛苦的,然后我们就又引入了动态刷新功能,每当配置中心配置变化后,我们的运维小哥就手动给每一个微服务都发送一个POST请求用于更新配置,这样便免于重新启动服务,节约时间,但是这样的动态刷新还是不够彻底,我们如何才能彻底解放运维小哥的双手呢?那就是使用Spring Cloud Bus配合Spring Cloud Config使用实现动态刷新配置

Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架,它整合了Java的事件处理机制和消息中间件的功能,它能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当作微服务间的通信通道,目前支持RabbitMQKafka,本文便是使用RabbitMQ

①、工作流程

第一种方式(消息发送给一个客户端而刷新所有的配置)

  • 配置更新,推送到Git仓库
  • Config Server配置中心同步配置
  • 使用订阅了消息的主机给其中一个服务发送一个Post bus/refresh更新请求
  • 该服务向服务配置中心拉取最新配置,并将信息发送给消息总线
  • 这个消息将会通过消息总线广播出去,域内指定或所有服务收到消息就回去服务配置中心拉取最新配置

第二种方式(消息发送给服务配置中心来刷新所有配置)

  • 配置更新,推送到Git仓库
  • Config Server配置中心同步配置
  • 使用订阅了消息的主机给服务配置中心发送一个Post bus/refresh更新请求
  • 服务配置中心给消息总线发送通知请求刷新配置
  • 消息总线向域内指定或所有服务发送更新通知消息
  • 服务从服务配置中心拉取最新配置

相比之下,第二种应该更合理,图一不合理的原因如下

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。如果这个服务挂了,那是不是就会既影响订单服务,又影响通知服务,数罪并罚死得更惨
  • 破坏了微服务各节点的对等性
  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改

②、什么是总线

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

③、基本原理

ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

2、RabbitMQ环境配置

①、Windows安装ErLang

使用RabbitMQ时需要下载安装ErLang环境,因为RabbitMQ是用ErLang语言编写的

下载地址

官网下载速度特别快,所以我这就准备了两种方案

一份云盘链接,提取码:ppqi

又或者是RabbitMQ官网提供的下载链接

傻瓜式安装,就不贴图了,然后配置环境变量(这个不会的还是百度吧)

②、Windows安装RabbitMQ

根据前面下载的ErLang版本,选择对应正确的RabbitMQ版本,根据查阅,这里安装3.8.9

官方下载地址

官网下载速度同样不可恭维,可以从华为镜像仓库下载

华为镜像地址

同样再提供一个云盘链接,提取码:uput

同样傻瓜式安装,再配置个环境变量

太TM麻烦了

③、安装安装管理工具RabbitMQ-Plugins

进入RabbitMQ安装目录下的sbin目录,打开cmd,输入

rabbitmq-plugins enable rabbitmq_management

然后点击RabbitMQ Service - start

如果遇到服务启动失败,报错信息为1067,一般情况都是计算机名为中文,或者安装路径有中文或者其他非法字符,鄙人自以为不会犯这种低级错误,结果导致又查了一个小时,呵呵

如果无误,就会看到以下信息

但是如果你安装完后修改了计算机名称(比如你遇到了我得问题,计算机名为中文,然后改成了英文)即使你启动成功,你还是无法访问localhost://15672,网上又查了好一会,得出结论,简单粗暴重装一遍RabbitMQ

一切就绪,进入管理页面查看,账号密码都是guest

③、Docker安装

怎么样,Windows的环境问题搞得是不是头大,按道理实际开发也不会用WindowsRabbitMQ啊,所以Docker才是针不戳

Ⅰ、拉取镜像

#management版本的自带web管理页面
docker pull rabbitmq:3.8.3-management

Ⅱ、运行容器

强调需要映射两个端口一个5672,一个15672,因为RabbitMQ会开启3个端口,56721567225672,其中5672是提供消息队列服务所用,15672是开启后台http访问所用,

docker run -d -p 15672:15672 -p 5672:5672 --name myRabbitMQ rabbitmq:3.8.3-management

Ⅲ、访问web管理页面

访问之前记得打开安全组(云服务器)

(拍桌)这TMWindows好用太多了

3、动态刷新全局广播

①、创建新的module

基于上一篇文章,再次创建一个与3344相同的3355,步骤省略,区别仅在于配置文件端口号声明为3366

为了便于区分,两个ConfigClientController修改为:

/*** @author PengHuAnZhi* @createTime 2021/2/16 15:30* @projectName SpringCloudDemo* @className ConfigClientController.java* @description TODO*/
@RestController
@Slf4j
@RefreshScope
public class ConfigClientController {// 因为config仓库以rest形式暴露,所以所有客户端都可以通过config服务端访问到github上对应的文件信息@Value("${config.info}")private String configInfo;@Value("${server.port}")private String serverPort;@GetMapping("/configInfo")public String getConfigInfo() {return "ServerPort : " + serverPort + "\t"+"configInfo : "+configInfo;}
}

②、测试

服务没有问题

③、ConfigServer添加消息总线的支持

这里采用第二种通知方式,直接通知配置中心,更加合理

Ⅰ、POM

3344POM文件中新增依赖坐标

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

Ⅱ、YML

新增RabbitMQmanagement节点配置

server:port: 3344spring:application:name: config-centercloud:config:server:git:uri: https://github.com/PengHuAnZhi/CloudDemoConfig #Github上的git仓库地址##搜索目录.这个目录指的是github上的目录search-paths:- CloudDemoConfig##读取分支label: main#rabbitmq相关设置rabbitmq:host: 39.105.43.3port: 5672username: guestpassword: guesteureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/#暴露 bus刷新配置的端点
management:endpoints:web:exposure:include: 'bus-refresh'

④、ConfigClient添加消息总线的支持

33553366配置相同

Ⅰ、POM

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

Ⅱ、YML

server:port: 3355spring:application:name: config-clientcloud:#Config客户端配置config:label: main #分支名称name: config #配置文件名称profile: dev #读取后缀名称 上诉3个综合就是 master分支上 config-dev.ymluri: http://localhost:3344#rabbitmq相关设置rabbitmq:host: 39.105.43.3port: 5672username: guestpassword: guest
eureka:client:service-url:defaultZone: http://eureka7001.com:7001/eureka/#暴露监控端点
management:endpoints:web:exposure:include: "*"

⑤、测试

如果服务运行期间一直循环报java.net.SocketException: socket closed,那就是你云服务器的安全组没有开,又或者是docker镜像的端口映射不对,特别注意是要配置两个映射端口

重启服务,访问测试

git仓库version改为5

再次查看3344,发现正常更新

发送Post请求

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

再次访问33553366

查看RabbitMQTopic订阅主题,发现确有一个名叫springCloudBusTopic

4、动态刷新的定点通知

在配置更新后,我们有时候有这种需求,只希望某一部分服务更新配置,另一部分不更新,那么就需要进行定点通知,放在本文中,也就是只通知3355或者3366,另一个不通知

①、一个小公式

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

请求就会发给config server并通过destination参数类指定需要更新配置的服务或实例

如:

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355" #只通知3355,config-client为服务名
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3366" #只通知3366

②、测试

修改version

发送通知

再次访问

SpringCloud系列之服务总线(Bus)相关推荐

  1. SpringCloud系列之服务注册中心(Eureka)

    文章目录 0.前言 1.搭建第一个Eureka服务 ①.简介 ②.组成 ③.创建Eureka Server模块 ④.编写POM ⑤.YML ⑥.主启动 ⑦.测试 2.注册服务 ①服务提供者 Ⅰ.添加依 ...

  2. SpringCloud系列之服务消费Ribbon和Feign区别

    在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构.基于Spring Cloud的微服务架构.从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个 ...

  3. 【SpringCloud系列】服务注册与发现 - Eureka Server源码分析(2)

    3.6.Eureka Server 源码分析 上一篇文章简单介绍了 Eureka 的一些概念,今天咱们来看看其原理和源码,首先先看 Eureka Server 的原理. 3.6.1.Eureka Se ...

  4. 【SpringCloud】微服务笔记

    写在前面 官方代码地址:https://github.com/zzyybs/atguigu_spirngcloud2020 本文地址:https://blog.csdn.net/hancoder/ar ...

  5. SpringCloud停更服务一览表

    参考文章:SpringCloud组件的停更和替换说明 SpringCloud的Hoxton版本,和之前的版本相比,用新的组件替换掉了原来大部分的组件,老的组件现在处于 停更不停用 的状况. 详情见下图 ...

  6. SpringCloud系列——Zuul 动态路由

    前言 Zuul 是在Spring Cloud Netflix平台上提供动态路由,监控,弹性,安全等边缘服务的框架,是Netflix基于jvm的路由器和服务器端负载均衡器,相当于是设备和 Netflix ...

  7. SpringCloud系列之Nacos+Dubbo+Seata应用篇

    SpringCloud系列之Nacos+Dubbo+Seata应用篇 原文链接:https://www.cnblogs.com/chinaWu/p/13671620.html ---------- 源 ...

  8. SpringCloud config 配置中心集群配置以及整合消息总线BUS实现关联微服务配置自动刷新

    一.SpringCloud Config 基本配置中的问题 在上一章节<SpringCloud config 配置中心介绍与基本配置使用>中我们现实了配置中心的配置集中管理.调用微服务应用 ...

  9. 499、Java分布式和集群12 -【SpringCloud视图微服务 - 消息总线Bus】 2021.06.01

    目录 0.RabbitMQ 1.先运行,看到效果,再学习 2.pom.xml 3.bootstrap.yml 4.application.yml 5.ProductDataServiceApplica ...

  10. SpringCloud教程-消息总线Bus 客户端(client)刷新(SpringCloud版本Greenwich.SR4)

    文章目录 消息总线(Bus)介绍 项目示例 config-client-bus 代码地址:github-spring-cloud地址 前言:前面文章讲了Spring Cloud Config配置中心如 ...

最新文章

  1. hibernate与mybatis的区别和应用场景
  2. 在Kaggle上赢得大数据竞赛的技巧和窍门
  3. A humble heart2019-11-09
  4. .NET运行时中的监测和可观测性
  5. [毕业生的商业软件开发之路]系列文章目录规划
  6. 65lbc184应用电路原理_75lbc184应用电路
  7. linq拼接where语句_C# 10. LINQ 的三种查询语句写法
  8. 使用BAPI批量修改采购信息记录的税率
  9. 【PTA L2-012】关于堆的判断(堆的建立和特殊字符串的读入)
  10. python读取、保存npy文件
  11. 四十个鹏城春夏,一场数字繁花
  12. MySQL增删改查及备份恢复
  13. printf 打印结构体成员函数出错原因分析
  14. 解决js newDate()苹果手机日期格式显示NaN
  15. 码云联合实训邦推出高校软件工程视频实训课程
  16. java中gui_java中GUI是什么意思?详细图解
  17. mysql sha256 示例_SHA256简介
  18. MySQL学习笔记(四)
  19. 月薪2万的Java工程师简历是这样的
  20. Demond Page的原理和作用(By Walle@ARMCE)

热门文章

  1. blos硬盘启动台式计算机,最新戴尔台式机bios设置硬盘启动图解
  2. 3 Robotics: Mobility 课程学习记录及课后习题解答
  3. 打印菱形图案C语言详解
  4. ZK宕机重启数据恢复
  5. Stata:多元回归中控制其他因素不变的含义
  6. 我对计算机的看法英语作文,我对创新的看法英语作文7篇作文
  7. Android APP极限瘦身—— WebP 图片优化
  8. MySQL事务的保证机制
  9. 笔记本无网络计算机,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
  10. ReactNative 导航栏Navigator的使用及参数navigator的传递