前言

本章基于Sermant2.0.0,分析dynamic-config插件为springboot宿主应用无侵入接入配置中心。
过程中涉及Sermant的两个核心通用能力(core):
1. Sermant自身如何接入配置中心:Sermant自身有众多插件需要动态配置能力,比如流控、负载均衡,不仅仅是dynamic-config插件为宿主提供动态配置;
2. 如何将插件类注入springboot环境:Sermant能够将插件中的类,放入spring.factories,并被springboot加载使用;
注:本篇配置中心采用Naocs(2.x)。
一、使用
1、客户端
使用Sermant-examples官方案例中的spring-provider模块。
pom
无需引入任何三方依赖,只需要是一个springboot项目。
xml
代码解读
复制代码
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> </dependencies>
用户代码
- 使用Value/ConfigurationProperties注解注入配置;
2. 使用RefreshScope标记需要刷新配置的类;
less
代码解读
复制代码
@Controller @ResponseBody @RefreshScope public class FlowController { @Value("${server.port}") int port; @Value("${sermant}") private String sermant; @RequestMapping(value = "/flow", method = RequestMethod.GET) public String flow(@RequestParam(required = false) Integer exRate, HttpServletRequest request) throws Exception { return "Hello, I am zk rest template provider, my port is " + port + ", sermant value is " + sermant; } }
agent配置
agent/config.properties:
开启动态配置,使用nacos配置中心,设置service.meta.project=sermant,这将来是nacos的namespaceId。
注:可以通过环境变量或-D参数设置。
ini
代码解读
复制代码
agent.service.dynamic.config.enable=true dynamic.config.serverAddress=127.0.0.1:8848 dynamic.config.dynamicConfigType=NACOS service.meta.project=sermant
插件配置
agent/plugins.yaml:加入dynamic-config
arduino
代码解读
复制代码
plugins: - dynamic-config
agent/pluginPackage/dynamic-config/config/config.yaml:
1. enableCseAdapter:关闭,是否适配华为云CSE;
2. enableDynamicConfig:开启,是否开启动态配置;
3. enableOriginConfigCenter:关闭,是否应用自己接入配置中心(如应用自己引入nacos配置中心spring.cloud.nacos.config.enabled=true);
yaml
代码解读
复制代码
dynamic.config.plugin: enableCseAdapter: false enableDynamicConfig: true enableOriginConfigCenter: false
挂载agent
diff
代码解读
复制代码
java -Dspring.application.name=spring-flow-provider -javaagent:/path/to/sermant-agent/agent/sermant-agent.jar -jar spring-provider.jar
2、服务端(sermant-backend)
application.properties:开启动态配置,使用nacos。
ini
代码解读
复制代码
dynamic.config.enable=true dynamic.config.serverAddress=127.0.0.1:8848 dynamic.config.dynamicConfigType=NACOS
3、使用控制台修改配置
插件类型:其他;
project:sermant,对应agent侧service.meta.project,对应nacos侧namespaceId;
group:格式service=服务名,对应应用侧dubbo.application.name或spring.application.name,对应nacos侧group;
key:任意值,动态配置插件都能读到,对应nacos侧dataId;
配置内容:仅支持yaml格式配置文件;

可以去Nacos看到配置变更。

验证配置生效:
csharp
代码解读
复制代码
curl localhost:8003/flow Hello, I am zk rest template provider, my port is 8003, sermant value is 配置值
二、sermant如何接入配置中心
sermant在core模块中定义动态配置服务入,在implement模块中实现,不同的plugin可以选择性使用:
1. dynamic-config:宿主配置中心插件,让宿主springboot应用通过Value和ConfigurationProperties注入配置中心配置;
2. flowcontrol:流控插件,获取流控规则配置;
3. loadbalancer:负载均衡插件,获取负载均衡规则配置;
4. tag-transmission:流量标签透传插件,获取标签透传配置;
...

1、 DynamicConfigService
DynamicConfigService是core中定义的BaseService SPI接口。

DynamicConfigService是一个常规的配置中心抽象类,可以对配置进行增删改查和订阅。
DynamicConfigService查询配置:
注:如果group为空,fixGroup会将group设置为dynamic.config.defaultGroup,默认为sermant。
typescript
代码解读
复制代码
@Override public String getConfig(String key) { return getConfig(key, null); } @Override public String getConfig(String key, String group) { return doGetConfig(key, fixGroup(group)).orElse(null); }
DynamicConfigService订阅配置有两种方式:
1. 组订阅:批量订阅一个group下的所有配置
typescript
代码解读
复制代码
@Override public boolean addGroupListener(String group, DynamicConfigListener listener) { if (listener == null) { LOGGER.warning("Empty listener is not allowed. "); return false; } return doAddGroup

最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



