官网地址:https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/
在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置
注意:RabbitMQ是依赖于Erlang的,需要先安装,并且两者之间是有对应的版本关系的,需要官网查询
官网下载地址:http://www.erlang.org/downloads
指定下载地址:http://erlang.org/download/otp_win64_21.3.exe
在终端执行语句检查erl是否安装成功,看到版本号就是成功了
erl
GIT下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.14
下载
rabbitmq-server-3.7.14.exe
,推荐在虚拟机或云服务器上通过docker容器进行安装
安装后检查系统变量的配置,是否有,没有就手动修改,一定要确保安装成功erl,否则安装rabbitmq会失败
在终端输入命令
rabbitmq-plugins enable rabbitmq_management
查看本地会出现一些可视化程序
rabbitmq-server.bat
# 也可以点击上面2.3说到的可视化程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2blMdG4R-1666837162791)(image/78、启动rabbitmq.png)]
账号:guest
密码:guest
必须完成上面的RabbitMQ环境的安装才能正常的使用下面的功能
cloud-config-client-3366
客户端模块<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
server:
port: 3366
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址
#服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: "*"
package com.zcl.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* 描述:配置中心客户端2
*
* @author zhong
* @date 2022-09-21 22:03
*/
@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3366 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3366.class, args);
}
}
package com.zcl.springcloud.controller;
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;
/**
* 描述:业务控制器
*
* @author zhong
* @date 2022-09-21 22:04
*/
@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;
}
}
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bus-amqpartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
在配置文件中添加如下的内容
spring:
application:
name: cloud-config-center #注册进Eureka服务器的微服务名
cloud:
config:
...
#rabbitmq相关配置
rabbitmq:
host: localhost
port: 5672
username: zcl
password: xxxx
# 暴露bus刷新配置的端点
management:
endpoints: #暴露bus刷新配置的端点
web:
exposure:
include: 'bus-refresh' # 暴露的端点看之前的架构图
与上面的服务端一样
spring:
application:
name: config-client
cloud:
#Config客户端配置
config:
label: master #分支名称
name: config #配置文件名称
profile: dev #读取后缀名称 上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
uri: http://localhost:3344 #配置中心地址
#rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
修改内容与步骤【6】一样
启动7001Eureka服务注册中心
启动3344、3355、3366
分别测试各自的功能是否正常
连接Eureka查看服务中心是否正常
查看RabbitMQ管理页面:http://localhost:15672/#/connections
测试原来的连接是否可以获取到配置文件【都能读取到配置表示正常】
http://localhost:3344/config-prod.yml
http://localhost:3345/config-prod.yml
http://localhost:3346/config-prod.yml
修改gitee中的配置文件,然后通过curl
进行配置服务中心广播各个客户端刷新
刷新3344服务是否刷新配置
通过curl
向配置服务中心发送修改通知,所有的客户端都可以监听到
curl -X POST "http://localhost:3344/actuator/bus-refresh"
再次刷新3355、3366客户端查看配置是否刷新
如果需要虚拟机的或云服务器的一定要保证
网络畅通
,否则可能会出现后端连接监听消息队列报错,解决办法重新启动项目或RabbitMQ,再测试
服务端以及客户端都可以监听到仓库代码的修改就是成功了
不想全部通知,只想定点通知。指定具体某一个实例生效而不是全部
维护人员发布的定点通知格式
公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
{destination}就是微服务名称:端口号。例如:
server:
port: 3355
spring:
application:
name: config-client
发送请求
curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"