zeus00456

导航

微服务架构 | 配置中心 - [Config]

@

§1 简介

config + bus 构成 Springcloud 的配置中心,也可以通过 nacos/apollo 实现
用于给多个微服务的每个实例涉及到的公用配置,提供集中的、动态的配置服务
作用

  • 集中管理配置文件
  • 不同环境下的区别化配置
  • 动态化配置生效与热更新
  • 配置信息以 rest 接口形式暴露

§2 搭建

Config 分为服务端和客户端,并且依赖一个作为配置仓库的远程库
通常使用 git 作为配置仓库存放各种配置文件
通过 config-server 连接配置仓库,可以读取配置仓库里的内容
通过config-client访问config-server,拉取自己对应的配置内容
在这里插入图片描述

§2.1 使用一个代码仓库作为配置库

在这里插入图片描述

§2.2 config-server

依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

配置

server:
  port: 3344

spring:
  application:
    name:  config-server #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: git@gitee.com:unfixed/sprcloudlearning-config.git #GitHub上面的git仓库名字
          ####搜索目录
          search-paths:
            - sprcloudlearning-config
          username: 用户名
          password: 密码
      ####读取分支
      label: master

#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka-1.com:7001/eureka/,http://eureka-2.com:7002/eureka/,http://eureka-3.com:7003/eureka/

启动类

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

配置文件访问路径
令 :

标识符 含义 简称 说明
配置文件名 A 由 spring.application.name 配置指定
环境名 B 常见有 dev/test/release/prod
分支名 C

则,合法的 config 路径为:

  • /C/A-B.yml
  • /C/A-B.properties
  • /A-B.yml
  • /A-B.properties
  • /A/B/C

§2.3 config-client

依赖

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

bootstrap.yml
说明:

  • bootstrap.yml 由 BootstrapApplicationListener 加载,生成 bootstrap context 作为 application context 的父级上下文
  • bootstrap.yml 是系统级配置文件,用于应用程序上下文的引导阶段
  • bootstrap.yml 具有比 application.yml 更高的优先级,其中的配置不能被本地配置覆盖
  • bootstrap.yml 适合放置引导应用启动的、不随应用或不同时间场景下应用变化的配置(比如配置中心信息)

可以理解为 application.yml 是用来配置应用的bootstrap.yml 是用来配置应用启动和启动环境的

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://192.168.3.7.com:3344/master/config-dev.yml
      uri: http://192.168.3.7:3344 #配置中心地址k


#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://eureka-1.com:7001/eureka/,http://eureka-2.com:7002/eureka/,http://eureka-3.com:7003/eureka/

§3 配置热更新

§3.1 半自动热更新(actuator 支持)

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置

# 打开 actuator 功能端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

@RefreshScope
添加 @RefreshScope 注解,此注解可以添生效于

  • 直接引用配置值(@value("${}"))的类上
  • 通过 @ConfigurationProperties 引用配置的配置类上

通过 actuator 接口刷新配置
调用 /actuator/refresh 接口即可刷新配置,也可以使用下面命令实现

curl -X POST "http://192.168.3.7:3355/actuator/refresh"

服务多实例时,可以结合脚本实现批量刷新

§3.2 自动热更新(bus 支持)

原理
添加微服务消息总线 BUS 后,系统中的任意服务可以向 BUS 中发布消息,并由其他所有服务消费,已达到广播的目的

  1. 可以通过接口触发某个服务刷新配置
  2. 接到请求的服务会将刷新配置的消息发布到 BUS
  3. 各个服务消费到 BUS 中对应消息后自动完成配置更新
    在这里插入图片描述

技术上,只要配置正确,通知任意服务都能实现全服务实例的配置热更新
但通常只由 config-server 处理:

  • 热更新配置本身就是 config-server 的职责范围
  • 作为 config-client 的业务模块,应该尽量职责单一
  • 作为触发点的 config-client 的业务服务实例,破坏了服务节点的对等性(更不可能让所有业务服务实例都具有此能力)
  • 作为触发点的 config-client 的业务服务实例,可能具有一定的局限,比如 ip 变动等

依赖

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

配置

spring:
  rabbitmq:
    host: 192.168.3.7
    port: 5672
    username: guest
    password: guest

打开 Actuator 的 endpoint
只在负责发送消息的服务中配置即可,通常是 config-server

management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh"

触发刷新配置

全局刷新
curl -X POST "http://192.168.3.7:3344/actuator/bus-refresh"
局部刷新
curl -X POST "http://192.168.3.7:3344/actuator/bus-refresh/服务名:端口号"

消息内容

================================================================================
2022-07-16 8:40:02:256: Message published

Node:         rabbit@Vm0
Connection:   192.168.3.7:53827 -> 192.168.3.10:5672
Virtual host: /
User:         guest
Channel:      1
Exchange:     springCloudBus
Routing keys: [<<"springCloudBus">>]
Routed queues: [<<"springCloudBus.anonymous.aVuxMbBrSz6Hz4PDZ6Eyow">>,
                <<"springCloudBus.anonymous.jFggjeHkRAqEmY6jNaWyhQ">>,
                <<"springCloudBus.anonymous.qXWGsEcVTxiDnh0zAuUQXg">>]
Properties:   [{<<"timestamp">>,signedint,1657960798},
               {<<"message_id">>,longstr,
                <<"a897332e-5100-2700-1685-f4205df294c3">>},
               {<<"priority">>,signedint,0},
               {<<"delivery_mode">>,signedint,2},
               {<<"headers">>,table,[]},
               {<<"content_type">>,longstr,<<"application/json">>}]
Payload: 
{"type":"RefreshRemoteApplicationEvent","timestamp":1657960798252,"originService":"config-server:3344:6444f3135345955eefa18e2b8f21c99e","destinationService":"**","id":"6c5ddaa1-3036-4ab4-b36d-387af53faec1"}

传送门:
微服务架构 | 组件目录

posted on 2022-07-28 15:37  问仙长何方蓬莱  阅读(115)  评论(0编辑  收藏  举报