700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > springcloud之bus消息总线

springcloud之bus消息总线

时间:2024-02-29 17:27:55

相关推荐

springcloud之bus消息总线

目录

`bus` 简介`bus` 工作架构`bus` 消息总线的实现`config` 配置中心服务端`Maven` 添加依赖`application.properties` 配置文件`config` 配置中心客户端`Maven` 添加依赖远程 `git` 仓库配置文件`eureka-client-consumer``eureka-client-producer`添加 `@RefreshScope` 注解`/bus-refresh` 接口测试测试一测试二测试三

bus简介

从 上一篇 文章可以得知config client服务从config server端获取自己对应的配置文件,但是目前的问题是:当远程git仓库配置文件发生改变时,每次都是需要重启config client服务,如果有上百上千个微服务呢?我想我们不会一个个去重启每个微服务,也就是说如何让config server端通知到config client?config client端如何感知到配置发生更新?

这时候就该bus上场了,使用springcloud bus(国人很形象的翻译为消息总线)可以完美解决这一问题

bus工作架构

大家可以将它理解为管理和传播所有分布式项目中的消息既可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有KafkaRabbitMQ。利用bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述bus在配置中心使用的机制

提交配置触发post请求给server端的bus/refresh接口server端接收到请求并发送给springcloud bus总线springcloud bus接到消息并通知给其它连接到总线的客户端其它客户端接收到通知,请求server端获取最新配置全部客户端均获取到最新的配置

它的特点:config配置中心server端承担起配置刷新的职责

bus消息总线的实现

项目结构依然使用上一篇的,如下

config配置中心服务端

Maven添加依赖

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

application.properties配置文件

完整配置如下,主要增加了rabbitmq的配置与健康检查

server.port=8070#注册进eureka的名称spring.application.name=eureka-client-configeureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/eureka.instance.prefer-ip-address=true#gitee的仓库地址spring.cloud.config.server.git.uri=/chaojiangcj/springcloud-learn-config.gitspring.cloud.config.server.git.username=你的用户名spring.cloud.config.server.git.password=你的密码#配置仓库需要找的文件路径spring.cloud.config.server.git.search-paths=eureka-client-*spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest#健康检查management.endpoints.web.exposure.include=*

config配置中心客户端

Maven添加依赖

eureka-client-consumer,eureka-client-producer两个项目都要引入

<!--springcloud bus消息总线--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency><!--使用springboot的健康检查--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

远程git仓库配置文件

eureka-client-consumer

完整配置如下,增加了rabbitmq的配置

spring.profiles.active=devserver.port=8090#注册进eureka的名称spring.application.name=eureka-client-consumereureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/eureka.instance.prefer-ip-address=true#Feign默认整合了Hystrix,要想为Feign打开Hystrix支持,需要此项设置#在springcloud Dalston之前的版本中,Feign默认开启Hystrix支持,无需设置feign.hystrix.enabled=true#从springcloud Dalston版本开始,Feign的Hystrix支持默认关闭,需要手动设置开启feign.hystrix.enabled=true#配ribbon的超时时间,默认二者都是1000#ribbon.ConnectTimeout=2000#ribbon.ReadTimeout=2000#第一次启动时,请求接口查询数据库有点耗时,会进入降级策略,所以将hystrix的超时时间设置为3s,默认是1s,这是全局设置mand.default.execution.isolation.thread.timeoutInMilliseconds=3000spring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest#自定义配置,用于测试congfig.version=config-version 1.0

eureka-client-producer

完整配置如下,增加了rabbitmq的配置

server.port=8080#注册进eureka的名称spring.application.name=eureka-client-producer#JDBC 配置spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/shiro?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTCspring.datasource.druid.username=rootspring.datasource.druid.password=123456spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driverspring.datasource.type=com.alibaba.druid.pool.DruidDataSource#druid 连接池配置spring.datasource.druid.initial-size=3spring.datasource.druid.min-idle=3spring.datasource.druid.max-active=10spring.datasource.druid.max-wait=60000#指定 mapper 文件路径mybatis.mapper-locations=classpath:org/example/mapper/*.xmlmybatis.configuration.cache-enabled=true#开启驼峰命名mybatis.configuration.map-underscore-to-camel-case=true#打印 SQL 语句mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpleureka.client.service-url.defaultZone=http://eureka7001:8761/eureka/eureka.instance.prefer-ip-address=truespring.rabbitmq.host=localhostspring.rabbitmq.port=5672spring.rabbitmq.username=guestspring.rabbitmq.password=guest

添加@RefreshScope注解

该注解我们添加在eureka-client-consumer项目的controller层,增加了一个测试接口,如下

@RefreshScope@Slf4j@Controller@RequestMapping(path = "/UserConsumer")public class UserConsumerController {@Autowiredprivate UserConsumerService userConsumerService;@Value(value = "${congfig.version}")private String configVersion;/*** ribbon 实现负载均衡*/@GetMapping(path = "/findOneById")@ResponseBodypublic ResultVo findOneById(Integer id) {return userConsumerService.findOneById(id);}/*** feign 进行远程调用*/@GetMapping(path = "/queryOneById")@ResponseBodypublic ResultVo queryOneById(@RequestParam(name = "id") Integer id) {return userConsumerService.queryOneById(id);}/*** 测试springcloud bus获取配置*/@GetMapping(path = "/getConfigVersion")@ResponseBodypublic String getConfigVersion() {log.info("configVersion的值为:" + configVersion);return configVersion;}}

自动刷新只能刷新@RefreshScope注解下的配置,一些特殊配置,如数据库等,需要同样先设置数据库链接ConfigServer类,然后通过加@RefreshScope注解方式自动刷新

/bus-refresh接口

要实现配置自动刷新,需要调用/bus-refresh接口通知config server端,有两种方式

手动调用(post请求):http://ip:port/actuator/bus-refreshconfig server端地址)配置gitwebhook,当git端配置发生改变,自动调用/bus-refresh接口

测试

分别启动rabbitmqeureka-client-consumereureka-client-producereureka-client-config以及eureka的服务端项目

测试一

启动上述服务之后,首先来请求接口http://127.0.0.1:8090/UserConsumer/getConfigVersion获取这个变量

测试二

修改变量如下

再次请求接口http://127.0.0.1:8090/UserConsumer/getConfigVersion获取这个变量,如下

测试三

首先请求接口http://127.0.0.1:8070/actuator/bus-refreshconfig服务端的ip,port),注意是post请求方式。它什么都没有返回 这里看看请求http://127.0.0.1:8070/actuator接口,它返回了健康监控的一些信息,如下 再一次请求接口http://127.0.0.1:8090/UserConsumer/getConfigVersion获取这个变量,如下 同时,看rabbitmq的管理页面,创建的交换机如下

创建的队列如下

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。