Spring Cloud学习|第七篇:分布式配置中心+Bus总线

1.前言

一提到微服务,那么离不开的就是配置中心,而对于多个服务共用的配置我们总希望有一个配置中心进行保存。Springcloud提供的Spring Cloud Config就为我们提供了这个能力,下边我们从零开始搭建一个分布式配置中心。

2.分布式配置中心搭建

服务端口作用
eureka-service8761注册中心
config-service8888配置中心服务端
producer-client9001客户端
producer-client9002客户端
  • 码云上创建配置文件件保存配置文件

注意:配置文件名称需根据规则进行设置:如config-client-dev.yml,其中config-client:表示定义的服务名,dev:表示激活何种模式,主要针对不同的场景设置不同的配置文件,如生产、开发、测试等环境

  • 创建注册中心eureka-service
  • 创建分布式配置中心服务端
    (1)引入依赖
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-config-server</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>

(2) 配置application.yml

在此以码云为例进行配置,大家也可以使用github账户或svn账号配置均可

spring:
 cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxx/spring-cloud-config.git
          search-paths:
            - config
          default-label: master
          username: admin
          password: admin

配置说明:

配置说明
urigit中配置文件仓库地址
search-paths配置文件夹
default-label配置文件所在分支
username码云用户名
password码云密码

(3)启动配置中心
访问http://localhost:8888/config-producer-dev.yml出现如下界面表示配置中心服务端配置成功,下图中userAge=22即为第一步中配置文件配置信息
在这里插入图片描述

  • 创建分布式配置中心客户端
    (1)引入依赖
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-client</artifactId>
 </dependency>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

注意:一定要引入spring-boot-starter-web依赖,否则配置不成功
(2)配置bootstrap.yml

spring:
  cloud:
    config:
      name: config-producer
      label: master
      profile: dev
      discovery:
        service-id: config-server
        enabled: true
      fail-fast: false
      retry:
        max-attempts: 6

配置说明:

配置说明
spring.cloud.config.name表示配置文件中配置的前缀名称,本例中配置文件在git中名为config-producer-dev.yml
spring.cloud.config.profile配置选择那一个配置文件,根据配置文件名选择
spring.cloud.config.label选择分支
spring.cloud.config.discovery.service-id表示配置中心服务端名称
spring.cloud.config.discovery.enabled表示可发现配置中心
spring.cloud.config.fail-fast表示是否快速失败
spring.cloud.config.retry.max-attempts表示失败重试次数

(3)启动测试
当启动客户端时,获取配置文件中变量 ,则能正常获取到配置文件变量值表示配置中心客户端配置成功
在这里插入图片描述
通过上述配置,我们在启动时能正常获取配置文件中的值,但当配置文件中值被修改时,我们此时只能通过重启服务的方式来获取配置文件中的值 ,在实际生产中我们不可能每次修改配置文件就重启服务,因此我们需要下边的属新配置文件。

3.手动刷新配置

-客户端增加服务监控依赖

<!-- actuator监控中心 -->
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
  • 客户端修改配置文件bootstrap.yml
management:
  endpoints:
    web:
      exposure:
        include: "*"
  • 获取配置文件处类上增加@RefreshScope
@RestController
@RefreshScope
public class ProducerController {

  @Value("${userAge}")
  private String userAge;

  @GetMapping("/test1")
  public String test1(){
    return userAge;
  }
}
  • 当修改配置文件后,需手动执行如下POST请求,ip及端口为客户端配置端口
$ http://localhost:9001/actuator/refresh

通过上述配置,我们修改完配置中心配置后,在手动请求一次上述更新接口,则会将服务获取到的配置进行更新。但上述手动刷新配置存在问题,如果服务有成百上千个,那么我们就要对每个服务进行刷新,显然是不可取的,因此我们需要配置Bus消息总线进行动态刷新配置

4.消息总线动态刷新配置

  • 配置中心服务端、客户端均增加消息总线依赖
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-bus-amqp</artifactId>
 </dependency>
  • 配置文件中增加rabbitmq配置,默认为本机mq,且账户名密码均为guest,mq 可选择rabbitmqkafka
spring:
  rabbitmq:
    host: 192.168.1.100
    port: 5672
    username: admin
    password: admin
  • 配置刷新
management:
  endpoints:
    web:
      exposure:
        include: bus-refresh
  • 启动测试
    上述配置完成后,我们启动多个客户端,同时修改配置文件,当我们访问客户端请求时发现配置依然没有更新,我们还需要手动执行如下请求:
$ http://localhost:9001/actuator/bus-refresh

当执行完上述请求后,我们在访问启动的两个客户端发现配置已经更新,虽然结合Bus消息总线进行消息刷新也需要手动触发一次,但是触发一次就已经将配置更新至所有服务,因此此种方式也是可取的。至此,我们的分布式配置中心搭建以及整合Bus进行配置动态刷新已经整合完毕。

5.消息总线刷新配置原理解析

  • 当配置搭建完毕,启动服务时,我们登录rabbitmq发现会多一个exchange,同时启动的客户端均有一个队列绑定该exchange

在这里插入图片描述

  • 当配置中心文件进行修改后,我们手动发送一次刷新请求,实质以消息形式发送至上述构建的exchange中。
  • 当消息发送至exhange中时,根据路由键路由至绑定的队列中,由于路由键为通配符#表示任何请求均发送至队列中,通过一次请求刷新所有服务配置。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值