96-java-springcloud(09)-配置中心和消息总线-configbus

    技术2023-07-20  88

    springcloud config

    一.概述

    1.是什么?

    参考官网: https://cloud.spring.io/spring-cloud-static/spring-cloud-config/2.2.3.RELEASE/reference/html/ 产生原因 由于分布式微服务将大的服务拆分成了一个个小的服务,而且由于微服务的规模小,通常一个项目可能产生及时上百个微服务,而就会有上百个配置文件,怎么样统一管理这些配置文件?

    springcloud-config是什么? springcloud-config为微服务架构中的微服务提供集中式的外部支持,配置服务器为各个不同的微服务应用提供一个中心话的服务配置管理.

    2.能干嘛?

    springcloud-config的作用是什么?

    集中管理配置文件不同环境不同配置,动态化的配置更新,分环境部署比如dev/test/prod/beta/release运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置将配置信息以REST接口的形式暴露,#post、curl访问刷新均可…

    3.怎么干?

    springcloud的架构如图

    角色
    git仓库 统一存放配置文件的地方,我们把配置文件通常统一存放在git仓库中.config server 配置中心,负责按照约定去克隆远程仓库(通常是git)到server中,然后等待client来读取配置文件;或者主动去分发配置文件给连接他的客户端.config client 这就是一个个的微服务,他们会访问server端去获取对应的配置文件.

    二.服务端配置

    1.git准备

    可参考文章: https://blog.csdn.net/weixin_45449911/article/details/106193212

    (1) 申请gitHub账号(2) 在远程的git仓库创建一个本项目的仓库(3) 本地安装git(4) idea中集成git/github

    2.server module创建

    建module 略改pom 引入springcloud-config的依赖 <!--config-server端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> 写yml

    配置远程git库的地址

    spring: application: name: cloud-config-center cloud: config: #config配置中心 server: git: uri: https://github.com/gulong-qk/cloud2020.git skipSslValidation: true #表示关闭ssl证书验证.如果报错无法连接上git,则可加此配置 search-paths: - cloud2020 label: master 主启动 @EnableConfigServer //启动config-server端 @SpringBootApplication @EnableConfigServer //启动config-server端 public class ConfigCenterMain3344 { public static void main(String[] args) { SpringApplication.run(ConfigCenterMain3344.class,args); } }

    5.测试 访问: http://localhost:3344/master/application-dev.yml 显示出github仓库中对应的application-dev.yml中的文件,及表示正确.

    3.读取github上文件的格式

    label:分支名 application:文件名 profile:微服务active profile激活的配置文件(dev/prod/test等等)

    /{application}/{profile}[/{label}]/{application}-{profile}.yml/{label}/{application}-{profile}.yml #这种方式最好/{application}-{profile}.properties/{label}/{application}-{profile}.properties

    例如: http://config-3344.com:3344/master/config-dev.yml http://config-3344.com:3344/master/config-test.yml http://config-3344.com:3344/dev/config-dev.yml http://config-3344.com:3344/dev/config-test.yml在这里插入图片描述

    三.客户端配置

    1.建module 略 2.改pom

    <!--配置config的客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>

    3.写bootstrap.yml

    说明: 1.bootstrap.yml是系统级别的,加载优先级要高于application.yml 2.application.yml是用户及级别的,加载优先级要低于bootstrap.yml 3.我们通常约定bootstrap.yml用于读取外部的配置信息,他并不会被application.yml覆盖

    spring: application: name: config-client cloud: config: #springcloud config的配置 label: master #分支名 name: config #文件名 profile: dev #激活得文件 uri: http://localhost:3344 #读取文件: http://localhost:3344/master/config-dev.yml或者是http://localhost:3344/master/config-dev.properties

    4.主启动 没有特别的注解

    @SpringBootApplication public class ConfigClientMain3355 { public static void main(String[] args) { SpringApplication.run( ConfigClientMain3355.class,args); } }

    5.业务类

    @RestController public class ConfigClientController { //这个config.info配置在远程的github仓库中,如果读取远程配置成功了,证明我们可以搭建成功 @Value("${config.info}") private String configInfo; /** *测试能都读取到配置文件中的信息 */ @GetMapping("/configInfo") public String getConfigInfo(){ return configInfo; } }

    6.测试

    启动eureka启动config server启动config client访问client端,读取远程github上的配置信息,是否成功

    7.出现问题 如果远程库github上的文件修改变动了,检查config server配置信息是否发生变动,检查client是否配置更新.

    server端配置刷新及时client端无法刷新配置,除非重启

    怎样再不重启client端的情况下,让client端刷新配置?

    四.config客户端配置动态刷新(单个通知client端)

    1.修改client端的pom

    增加actuator的监控依赖

    <!--增加健康检查--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

    2.修改bootstrap.yml

    暴露监控端点

    #暴露监控端点 management: endpoints: web: exposure: include: "*"

    3.修改controller

    controller类上添加注解@RefreshScope

    4.修改配置并刷新文件的步骤

    步骤:

    1.启动所有的项目eureka,server端和client端2.修改github远程库文件3.post请求格式,发送刷新请求 http://hostname:port/actuator/refresh4.验证config server端读取到的配置5.验证config client的配置

    重点: 运维人员在修改了github远程库之后,一定要发送一个post格式请求去刷新client端的配置. 请求格式:http://hostname:port/actuator/refresh

    springcloud bus(消息总线)

    一.简介

    1.什么是消息总线? 在微服务架构系统中,通常会使用轻量级的消息代理来构建一个共享的消息平台,并且在这个平台通道上构建一个消息主题,让所有的微服务实例都连接上消息这个总线,一旦本消息主题有消息发布了,则所有的微服务实例都可以收到这个消息.

    总之,消息总线其实就是一种消息通知机制,由消息队列实现.

    2.能干什么?

    3.实现机制 springcloud Bus支持两种消息代理:RabbitMQ和Kafka. 也就是两种消息队列实现.

    二.rabbitMQ环境准备

    参考文章: https://blog.csdn.net/weixin_45449911/article/details/106901842

    三.Bus全局广播动态更新所有client的配置

    1.全局动态刷新架构设计思想

    (1) 通知config client,让客户端再去通知其他客户端 #利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置 (2) 通知config server端,让server再去通知其他客户端(推荐) #利用消息总线触发服务端/bus/refresh,而刷新所有客户端的配置

    2.修改前面的config server端和config client端

    (1) pom文件增加bus的依赖 amqp这里的amqp协议springboot的默认实现是rabbitmq

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

    (2) yml 增加 config server是修改application.yml config client 是修改bootstrap.yml

    rabbitmq: #rabbitMQ的地址 host: localhost port: 5672 username: guest password: guest

    (3)修改更新配置文件的流程

    修改github远程库文件

    (2选1)发送post请求到config server端(client全部更新) curl -X POST "http://localhost:3344/actuator/bus-refresh"

    (2选1)发送post请求到你指定修改的config client端(指定更新client) curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

    Processed: 0.011, SQL: 9