# 动态配置功能
本文介绍如何在开发中使用Sermant提供的动态配置功能。
# 功能介绍
动态配置功能允许Sermant对动态配置中心下发的配置进行配置管理和监听等操作,以实现丰富多样的服务治理能力。
说明:如何部署动态配置中心以及使用动态配置功能可参考Sermant动态配置中心使用手册。
# 开发示例
本开发示例基于创建首个插件文档中创建的工程,以动态配置的获取来演示开发过程:
在工程中
template\template-plugin
下的com.huaweicloud.sermant.template.TemplateDeclarer
类中新增变量dynamicConfigService
获取Sermant框架提供的动态配置服务,用于实现动态配置的监听器的创建、配置的获取等:DynamicConfigService dynamicConfigService = ServiceManager.getService(DynamicConfigService.class);
获取服务实例之后,可以调用
DynamicConfigService
提供的API进行相应的动作。本示例以动态配置的直接获取为例,可通过如下代码来实现:@Override public ExecuteContext before(ExecuteContext context) throws Exception { System.out.println("Good morning!"); // test_group为用户分组,test_key为监听的键,对zookeeper来说,配置获取的路径相当于: /test_group/test_key System.out.println(dynamicConfigService.getConfig("test_key", "test_group")); return context; }
开发完成后,可参照创建首个插件时的打包构建流程,在工程根目录下执行 mvn package后生成构建产物。
以Zookeeper部署为动态配置中心为例,相关参数配置请参考Sermant动态配置中心使用手册。在Zookeeper的
/test_group/test_key
节点中下发示例配置:create /test_group/test_key "This is a dynamic config!"
开启Zookeeper服务并且在
agent/config/config.properties
中设置dynamic.config
相关配置,并且将动态配置开关agent.service.dynamic.config.enable
设置为true
,主要配置示例如下:# 动态配置服务开关 agent.service.dynamic.config.enable=true # 指定配置中心的服务端地址 dynamic.config.serverAddress=127.0.0.1:2181 # 指定动态配置中心类型, 取值范围为NOP(无实现)、ZOOKEEPER、KIE、NACOS dynamic.config.dynamicConfigType=ZOOKEEPER
执行完成后在项目的根目录执行
cd agent/
,并在其中携带Sermant运行测试应用,执行如下命令 java -javaagent:sermant-agent.jar -jar Application.jar$ java -javaagent:sermant-agent.jar -jar Application.jar [xxxx-xx-xxTxx:xx:xx.xxx] [INFO] Loading god library into BootstrapClassLoader. [xxxx-xx-xxTxx:xx:xx.xxx] [INFO] Building argument map by agent arguments. [xxxx-xx-xxTxx:xx:xx.xxx] [INFO] Loading core library into SermantClassLoader. [xxxx-xx-xxTxx:xx:xx.xxx] [INFO] Loading sermant agent, artifact is: default [xxxx-xx-xxTxx:xx:xx.xxx] [INFO] Load sermant done, artifact is: default Good morning! This is a dynamic config! Good afternoon! Good night!
可以看到在动态配置中心下发的配置可以通过getConfig
函数获取得到,并在步骤2中输出到控制台。
其他接口的使用示例此处不一一列出,可参考下文的API描述。
# API&配置
# API
动态配置功能的服务功能API
由DynamicConfigService (opens new window)抽象类提供,其实现三个接口,见于API (opens new window)目录中。
# 获取动态配置服务
- 获取动态配置服务,用于实现动态配置的监听器的创建、配置的获取等
DynamicConfigService dynamicConfigService = ServiceManager.getService(DynamicConfigService.class);
下面介绍的API接口需要明确三个概念:
key
,单指某个动态配置的键group
,指一系列动态配置的分组,通常用于区分使用者content
,指动态配置的具体内容
说明:下列API示例中的参数中统一将
key
配置为test_key
,group
配置为test_group
,content
配置为test_content
。
# 对某个配置键的相关操作
获取动态配置中心某个键的配置值
dynamicConfigService.getConfig("test_key")
设置动态配置中心某个键的配置值
dynamicConfigService.publishConfig("test_key", "test_content")
移除动态配置中心某个键的配置值
dynamicConfigService.removeConfig("test_key")
获取动态配置中心所有配置值
dynamicConfigService.listKeys();
为动态配置中心某个键添加监听器,监听器
process
函数可在监听到事件后执行自定义操作dynamicConfigService.addConfigListener("test_key", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } });
为动态配置中心某个键添加监听器,根据第三个入参
ifNotify
决定是否触发添加监听器后的初始化事件,监听器process
函数可在监听后对初始化事件和后续其他事件执行自定义操作dynamicConfigService.addConfigListener("test_key", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } }, true);
移除动态配置中心某个键的监听器
dynamicConfigService.removeConfigListener("test_key");
# 对某个分组下的所有配置键的相关操作
获取动态配置中心某个组中所有键
dynamicConfigService.listKeysFromGroup("test_group")
为动态配置中心某个组下的所有键添加监听器,监听器
process
函数可在监听到事件后执行自定义操作dynamicConfigService.addGroupListener("test_group", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } });
为动态配置中心某个组下的所有键添加监听器,根据第三个入参
ifNotify
决定是否触发添加监听器后的初始化事件,监听器process
函数可在监听后对初始化事件和后续其他事件执行自定义操作dynamicConfigService.addGroupListener("test_group", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } }, true);
移除动态配置中心某个组下所有键的监听器
dynamicConfigService.removeConfigListener("test_group");
# 对某个分组下的某个配置键的相关操作
获取动态配置中心某个分组下的某个键的配置值
dynamicConfigService.getConfig("test_key", "test_group")
设置动态配置中心某个分组下的某个键的配置值
dynamicConfigService.publishConfig("test_key", "test_group", "test_content")
移除动态配置中心某个分组下的某个键的配置值
dynamicConfigService.removeConfig("test_key", "test_group")
为动态配置中心某个分组下的某个键添加监听器,监听器
process
函数可在监听到事件后执行自定义操作dynamicConfigService.addConfigListener("test_key", "test_group", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } });
为动态配置中心某个分组下的某个键添加监听器,根据第三个入参
ifNotify
决定是否触发添加监听器后的初始化事件,监听器process
函数可在监听后对初始化事件和后续其他事件执行自定义操作dynamicConfigService.addConfigListener("test_key", "test_group", new DynamicConfigListener() { @Override public void process(DynamicConfigEvent dynamicConfigEvent) { // do something } }, true);
移除动态配置中心某个分组下的某个键的监听器
dynamicConfigService.removeConfigListener("test_key", "test_group");
# 说明
以上的API
主要分为数据的增删查改操作,以及监听器的DynamicConfigListener (opens new window)增删操作,其中后者的事件回调是动态配置服务得以实现功能中至关重要的一环,也是插件中使用动态配置服务的主要功能。
另外,对某个配置键的相关操作的所有API
都是不带Group
的API
,它们在DynamicConfigService (opens new window)中其实都会使用默认Group
,这点需要注意。默认Group
可以通过sermant-agent的配置文件/config/config.properties
的dynamic.config.defaultGroup
修改,参数说明可参考Sermant-agent使用手册。
最后,除了以上的服务接口以外,开发者还需要关注一些其他接口、配置或实体:
动态配置监听器DynamicConfigListener (opens new window),其中包含的接口方法如下:
方法 解析 void process(DynamicConfigEvent (opens new window)) 处理配置改变事件的回调接口 动态配置改变事件DynamicConfigEvent (opens new window),其成员属性如下:
类型 属性 解析 String key 配置键 String group 配置分组 String content 配置信息 DynamicConfigEventType (opens new window) eventType 事件类型 动态配置改变事件类型DynamicConfigEventType (opens new window),含以下四种:
枚举值 解析 INIT 添加监听器时的初始化事件 CREATE 新增配置的事件 MODIFY 修改配置内容的事件 DELETE 删除配置的事件
# 配置
动态配置功能相关的配置可参考Sermant动态配置中心使用手册参数配置相关章节。