# 动态配置

本文介绍如何使用动态配置插件 (opens new window)

# 功能介绍

Spring Cloud Config动态配置已广泛应用于企业开发项目,为用户更方便使用配置中心,切换配置中心类型更便捷,动态配置插件基于Sermant动态配置中心的能力实现应用配置的动态更新。该插件可屏蔽应用原配置中心,应用在挂载Sermant运行时,通过动态配置中心对宿主应用的配置进行刷新。

# 参数配置

# Sermant Agent配置

动态配置插件依赖动态配置中心,需要在Sermant Agent中配置动态配置中心的地址(dynamic.config.serverAddress),动态配置中心的类型(dynamic.config.dynamicConfigType),具体参考Sermant-agent使用手册

# 插件配置

动态配置插件需打开是否开启适配CSE(dynamic.config.plugin.enableCseAdapter),是否开启动态配置插件(dynamic.config.plugin.enableDynamicConfig)等开关,可在${path}/sermant-agent-x.x.x/agent/pluginPackage/dynamic-config/config/config.yaml找到插件的配置文件,配置如下所示:

dynamic.config.plugin:
  enableCseAdapter: false # 是否开启适配CSE
  enableDynamicConfig: true # 是否开启动态配置插件
  enableOriginConfigCenter: false # 是否开启原配置中心, 默认关闭
参数键 说明 默认值 是否必须
enableCseAdapter 是否开启适配CSE;
true:根据应用配置,服务配置,自定义标签配置进行配置订阅;
false:根据服务名进行订阅;见详细治理规则说明
true
enableDynamicConfig 是否开启动态配置插件 false
enableOriginConfigCenter 是否开启原配置中心;
false:屏蔽原配置中心,只能通过Sermant下发配置;
true:不屏蔽原配置中心,可通过原配置中心下发配置,注意:若不屏蔽应用原配置中心可能会影响动态配置中心下发配置
false

# 详细治理规则

动态配置插件基于框架提供的动态配置能力进行配置发布,配置发布可以参考动态配置中心使用手册

动态配置主要基于group进行匹配配置订阅,该标签组由多个键值对组成,根据适配开关配置enableCseAdapter的不同,group的值将会有所区别,如下:

  • 若关闭适配,即enableCseAdapter: false

    此时插件将根据宿主应用的服务名进行订阅, 即应用配置的spring.applicaton.name, 插件订阅配置的group为service=${spring.applicaton.name}

  • 若开启适配, 即enableCseAdapter: true

    此时插件将根据应用配置服务配置以及自定义配置三项数据进行配置同时订阅, 而这三类配置可参考${path}/sermant-agent-x.x.x/agent/config/config.properties, 相关配置如下:

    # 服务app名称
    service.meta.application=default
    # 服务版本
    service.meta.version=1.0.0
    # serviceComb 命名空间
    service.meta.project=default
    # 环境
    service.meta.environment=development
    # 自定义标签,按需配置,用于后续的配置订阅
    service.meta.customLabel=public
    service.meta.customLabelValue=default
    

    应用配置,服务配置,自定义配置说明参考CSE配置中心概述 (opens new window)

    • 应用配置:由service.meta.applicationservice.meta.environment组成, 对应的groupapp=default&environment=development
    • 服务配置:由service.meta.applicationservice.meta.environment以及服务名组成,此处服务即spring.application.name, 对应的groupapp=default&environment=development&service=DynamicConfigDemo
    • 自定义配置:由service.meta.customLabelservice.meta.customLabelValue组成, 对应的grouppublic=default

以上为group的配置介绍,下面说明content配置,当前动态配置仅支持yaml格式, 例如配置如下内容:

server:
  port: 8004
sermant: sermant
spring:
  application:
    name: DynamicConfigDemo
  cloud:
    zookeeper:
      enabled: true

# 支持版本和限制

# 支持版本

框架类型 版本
SpringBoot 1.5.x - 2.6.2
spring-cloud-starter-alibaba-nacos-config 1.5.0.RELEASE+
spring-cloud-starter-zookeeper-config 1.2.0.RELEASE+

# 限制

  1. 屏蔽应用原配置中心(目前仅支持zookeepernacos
  2. 需配合注解@Value, @ConfigurationProperties以及@RefreshScope使用,以下示范@Value注解使用,@ConfigurationProperties注解同理
/**
 * @Value配置示范
 * 需配合注解@RefreshScope
 */
@Component
@RefreshScope
public class ValueConfig {
    @Value("${sermant}")
    private Object sermant;

    @Value("${server.port}")
    private int port;

    @Override
    public String toString() {
        return "ValueConfig{" +
            "sermant=" + sermant +
            ", port=" + port + '\'' +
            '}';
    }

    public Object getSermant() {
        return sermant;
    }
}

# 操作和结果验证

下面将演示如何使用动态配置插件,验证使用Sermant动态配置中心(ZooKeeper)更新SpringBoot应用配置的场景。

# 1 准备工作

# 2 获取Demo二进制产物

解压Demo二进制产物压缩包,即可得到spring-provider.jar

# 3 修改插件配置

参考插件配置 修改${path}/sermant-agent-x.x.x/agent/pluginPackage/dynamic-config/config/config.yaml文件为以下内容:

dynamic.config.plugin:
  enableCseAdapter: false # 是否开启适配CSE
  enableDynamicConfig: true # 是否开启动态配置插件
  enableOriginConfigCenter: false # 是否开启原配置中心, 默认关闭

说明:${path}为sermant所在路径。

# 4 启动Demo应用

参考如下命令启动Demo应用

# windwos
java -javaagent:${path}\sermant-agent-x.x.x\agent\sermant-agent.jar -Dspring.application.name=spring-flow-provider -Dspring.cloud.zookeeper.connectString=127.0.0.1:2181 -jar spring-provider.jar

#linux mac
java -javaagent:${path}/sermant-agent-x.x.x/agent/sermant-agent.jar -Dspring.application.name=spring-flow-provider -Dspring.cloud.zookeeper.connectString=127.0.0.1:2181 -jar spring-provider.jar

说明: ${path}为sermant实际安装路径,x.x.x代表sermant某个版本号。

# 5 查看原配置

浏览器或curl工具访问localhost:8003/flow,查看控制台日志是否打印sermant日志

Demo应用配置如下:

# Demo 应用配置
server:
  port: 8003
sermant: sermant
spring:
  application:
    name: spring-flow-provider
  cloud:
    zookeeper:
      enabled: true

当调用flow接口时,Demo应用将返回如下信息,此时返回sermant的值为"sermant"(该对象通过@value方式注入):

Hello, I am zk rest template provider, my port is 8003, sermant value is sermant

# 6 修改应用配置

参考使用动态配置中心使用手册 进行配置发布

以ZooKeeper为例,利用ZooKeeper提供的命令行工具来来发布动态配置:

  1. ${path}/bin/目录执行以下命令创建节点/service=spring-flow-provider
# linux mac
./zkCli.sh -server localhost:2181 create /service=spring-flow-provider

# windows
zkCli.cmd -server localhost:2181 create /service=spring-flow-provider
  1. ${path}/bin/目录执行以下命令创建创建节点/service=spring-flow-provider/config和数据sermant: sermant1
# linux mac
./zkCli.sh -server localhost:2181 create /service=spring-flow-provider/config "sermant: sermant1"

# windows
zkCli.cmd -server localhost:2181 create /service=spring-flow-provider/config "sermant: sermant1"

说明:${path}为ZooKeeper的安装目录。

# 7 验证

再次通过浏览器或curl工具访问localhost:8003/flow,Demo应用将返回如下信息,此时返回sermant的值为"sermant1":

Hello, I am zk rest template provider, my port is 8003, sermant value is sermant1
上次更新: 2024/12/13 02:38:15