热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第六篇消息总线(SpringCloudBus)

一、实现原理1、ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)

一、实现原理

1、ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件;

2、当远端git仓库配置文件发生改变,ConfigServer如何通知到ConfigClient端,即ConfigClient如何感知到配置发生更新?

Spring Cloud Bus会向外提供一个http接口,即图中的/bus/refresh。我们将这个接口配置到远程的git的webhook上,当git上的文件内容发生变动时,就会自动调用/bus-refresh接口。Bus就会通知config-server,config-server会发布更新消息到消息总线的消息队列中,其他服务订阅到该消息就会信息刷新,从而实现整个微服务进行自动刷新

 


二:实现方式

实现方式一:某个微服务承担配置刷新的职责

1、提交配置触发post调用客户端A的bus/refresh接口

2、客户端A接收到请求从Server端更新配置并且发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接在总线上的客户端,所有总线上的客户端均能收到消息

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

存在问题:

1、打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。2、破坏了微服务各节点的对等性。3、有一定的局限性。WebHook的配置随着承担刷新配置的微服务节点发生改变。

改进如下方式二:配置中心Server端承担起配置刷新的职责,原理图如下:

1、提交配置触发post请求给server端的bus/refresh接口

2、server端接收到请求并发送给Spring Cloud Bus总线

3、Spring Cloud bus接到消息并通知给其它连接到总线的客户端

4、其它客户端接收到通知,请求Server端获取最新配置

5、全部客户端均获取到最新的配置

 


三:实现步骤

备注:这里给出方式二配置方法,方式一的区别在:因为是某个微服务承担配置刷新的职责,所以Server端不需要配置 Rabbitmq和添加bus-amqp的依赖。

<一>Config Server端配置&#xff08;提前安装rabbitmq移步链接&#xff1a;&#xff09;

1、添加依赖


my-springcloudorg.example1.0-SNAPSHOT4.0.0config-serverorg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.cloudspring-cloud-config-serverorg.springframework.cloudspring-cloud-starter-bus-amqp

2、修改配置文件Bootstrap.yml文件

server:port: 5000#指定服务注册到哪里
eureka:client:service-url:defaultZone: http://localhost:1111/eureka/instance:prefer-ip-address: truespring:application:name: config-servercloud:config:label: master #配置仓库的分支server:git:uri: https://gitee.com/xiaocheng12/my-springcloud.git/ #配置git仓库地址searchPaths: config #配置仓库路径username: 944954547&#64;qq.com #访问git仓库的用户名password: xiaocheng006 #访问git仓库的用户名密码rabbitmq:host: localhost #本地环境不需要配置mq&#xff0c;但是需要启动mq,Springboot会自动连接本地mqport: 5672username: guestpassword: guest#所有端点开放
management:endpoints:web:exposure:include: "*"

3、启动类注解

&#64;SpringBootApplication
&#64;EnableConfigServer
&#64;EnableDiscoveryClient
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}}

<二>Config Client端配置

1、添加依赖


my-springcloudorg.example1.0-SNAPSHOT4.0.0config-clientorg.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframework.cloudspring-cloud-starter-configorg.springframework.cloudspring-cloud-starter-bus-amqp

2、修改配置文件Bootstrap.yml文件

server:port: 5001#指定服务注册到哪里
eureka:client:service-url:defaultZone: http://localhost:1111/eureka/instance:prefer-ip-address: truespring:application:name: myconfig #对应配置文件规则中的{application}部分cloud:config:label: test #指明远程仓库的分支,对应配置文件规则中的{label}部分profile: dev #指明远程仓库的分支下的环境,对应配置文件规则中的{profile}部分discovery:enabled: true #是从配置中心读取文件serviceId: config-server #配置中心的serviceId&#xff0c;即服务名 和之前通过url访问一样

3、添加注解&#xff1a; &#64;RefreshScope添加在需要刷新的配置文件上

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

&#64;RestController
&#64;RefreshScope
public class TestController {&#64;Value("${from}")private String from;&#64;Autowiredprivate Environment environment;/*** 从配置文件中获取属性* &#64;return*/&#64;RequestMapping("/from")public String from(){return this.from;}/*** 从环境变量中获取属性* &#64;return*/&#64;RequestMapping("/from/environment")public String fromEnvironment(){String from &#61; environment.getProperty("from");return from;}
}

到这里Config-Server端和Client端已经配置完毕&#xff0c;先后启动Server端和Client端&#xff0c;post请求方式进行测试&#xff1a;http://localhost:5000//actuator/bus-refresh  发现客户端的配置文件&#xff0c;成功实现了动态刷新


推荐阅读
author-avatar
手机用户2502895987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有