SkyWalking OAP 动态配置 Apollo 实现详解:接入、配置存储与源码原理
SkyWalking OAP 动态配置 Apollo 实现详解接入、配置存储与源码原理【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalkingSkyWalking OAP 的大部分配置通过application.yml与系统环境变量设置同时部分配置支持从上游配置中心动态下发其中 Apollo携程开源配置中心是官方支持的一种实现。本文将围绕官方文档 dynamic-config-apollo.md 展开完整讲解 Apollo 接入的 YAML 配置、Single/Group 两类配置在 Apollo 中的存储模型并结合 configuration-apollo 模块的源码与集成测试说明其底层工作机制与可验证依据。读完本文你将能够独立完成 OAP 与 Apollo 的对接并理解动态配置从「Apollo 下发 → OAP 监听 → 配置项生效」的完整链路。前置说明动态配置能力边界SkyWalking 的动态配置依赖上游配置中心服务因此在默认情况下是**关闭DISABLED**的。完整能力说明见 dynamic-config.md目前 SkyWalking 支持两种动态配置类型——Single单值与Group分组Apollo 是其中一种实现其他实现还包括 Zookeeper、Etcd、Consul、Kubernetes Configmap、Nacos 以及自研的 DCS 服务等。接入 Apolloapplication.yml 配置详解将 OAP 的动态配置中心切换到 Apollo需要在application.yml的configuration模块下进行配置。官方文档给出的配置片段如下configuration: selector: ${SW_CONFIGURATION:apollo} apollo: apolloMeta: ${SW_CONFIG_APOLLO:http://localhost:8080} apolloCluster: ${SW_CONFIG_APOLLO_CLUSTER:default} apolloEnv: ${SW_CONFIG_APOLLO_ENV:} appId: ${SW_CONFIG_APOLLO_APP_ID:skywalking}这段配置与 OAP 发行版自带的 server-starter/src/main/resources/application.yml 中的默认内容完全一致。各配置项含义如下配置项环境变量覆盖默认值说明selectorSW_CONFIGURATIONnone默认关闭指定使用的动态配置中心实现此处必须设为apollo才会加载本模块apollo.apolloMetaSW_CONFIG_APOLLOhttp://localhost:8080Apollo Config Service 的 Meta Server 地址OAP 通过它发现配置服务apollo.apolloClusterSW_CONFIG_APOLLO_CLUSTERdefault使用的 Apollo 集群名对应 Apollo 侧的 Clusterapollo.apolloEnvSW_CONFIG_APOLLO_ENV空字符串Apollo 环境如DEV、PRO可为空apollo.appIdSW_CONFIG_APOLLO_APP_IDskywalking在 Apollo 中创建的应用AppID配置归属在此 App 下需要说明的是selector的默认值是none对应 dynamic-config.md 中的说明在本文档给出的示例中直接以${SW_CONFIGURATION:apollo}覆盖默认值而在发行版application.yml中selector: ${SW_CONFIGURATION:none}即未显式设置环境变量SW_CONFIGURATIONapollo时动态配置默认不启用。实际部署时可通过环境变量SW_CONFIGURATIONapollo覆盖或在 YAML 中直接修改selector。底层配置映射设置项如何变成 Apollo 客户端参数从源码角度看Apollo 实现模块位于 oap-server/server-configuration/configuration-apollo其核心类ApolloConfigurationProvider见 ApolloConfigurationProvider.java在initConfigReader()阶段会把上述 YAML 设置转换为 Apollo Java Client 读取的系统属性apolloCluster→ 系统属性apollo.clusterapolloMeta→ 系统属性apollo.metaappId→ 系统属性app.idapolloEnv→ 系统属性env只有当对应值非空时才会设置Strings.isNullOrEmpty判断随后创建ApolloConfigWatcherRegister作为配置读取器。这些系统属性正是com.ctrip.framework.apollo客户端依赖声明见 configuration-apollo/pom.xml用于定位 Config Service、识别 App 与 Cluster 的标准参数。此外设置模型类 ApolloConfigurationCenterSettings.java 中还定义了文档未直接展示的可选字段供高级场景使用字段默认值说明namespaceapplication读取的 Apollo Namespace为空时使用默认 NamespaceclusterNamedefault集群名period60配置同步周期秒与监听回调共同构成配置更新通道配置在 Apollo 中的存储模型SkyWalking 动态配置在 Apollo 中以键值对key/value pairs形式存放。官方文档将存储方式分为Single Config与Group Config两类。Single Config单值配置单值配置的逻辑结构为{configKey}:{configValue}在 Apollo 中即一个 key/value 对KeyValueconfigKeyconfigValue例如 SkyWalking 的慢数据库语句阈值配置{agent-analyzer.default.slowDBAccessThreshold}:{default:200,mongodb:50}在 Apollo 中对应存储为KeyValueagent-analyzer.default.slowDBAccessThresholddefault:200,mongodb:50......该配置键的作用是覆盖application.yml中agent-analyzer/default/slowDBAccessThreshold的取值见 dynamic-config.md 中的支持配置列表例如将default数据库的慢查询阈值设为 200ms、MongoDB 设为 50ms。Group Config分组配置分组配置同样以键值对存放但 key 由configKey与子项 keysubItemKey通过.拼接组成KeyValueconfigKey.subItemkey1subItemValue1configKey.subItemkey2subItemValue2......官方文档示例为 OpenAPI 端点名分组规则{core.default.endpoint-name-grouping-openapi}:|{customerAPI-v1}:{value of customerAPI-v1} |{productAPI-v1}:{value of productAPI-v1} |{productAPI-v2}:{value of productAPI-v2}在 Apollo 中对应存储为KeyValuecore.default.endpoint-name-grouping-openapi.customerAPI-v1value of customerAPI-v1core.default.endpoint-name-grouping-openapi.productAPI-v1value of productAPI-v1core.default.endpoint-name-grouping-openapi.productAPI-v2value of productAPI-v2即前缀core.default.endpoint-name-grouping-openapi是分组主键.之后的部分是组内子项 key每个子项对应一份 OpenAPI 定义文件的内容。分组配置允许一组配置键共享一个逻辑配置项非常适合「一个配置键对应多个同类子项」的场景如多个服务的 OpenAPI 规则文件。监听与生效机制源码级解析配置注册回调链ApolloConfigWatcherRegister见 ApolloConfigWatcherRegister.java继承自配置 API 模块的ListeningConfigWatcherRegister。该基类见 ListeningConfigWatcherRegister.java在注册 watcher 时要求子类实现startListening(WatcherHolder, ConfigChangeCallback)并通过回调把「单值变化」与「分组变化」分别派发给ConfigChangeWatcher与GroupConfigChangeWatcher。Apollo 实现借助 Apollo Java Client 的ConfigService与Config#addChangeListener建立监听构造阶段根据namespace是否为空调用ConfigService.getAppConfig()默认 Namespace或ConfigService.getConfig(namespace)指定 Namespace获取Config读取器。Single 配置的监听逻辑在startListening的SINGLE分支ApolloConfigWatcherRegister.java中先读初始值configReader.getProperty(key, null)读取键的当前值若存在则立即通过onSingleValueChanged回调注册方保证 OAP 启动即可拿到已有配置再挂监听addChangeListener(..., Collections.singleton(key))只监听该键变更回调中过滤出与key相等的 changedKey取getNewValue()触发单值变更通知。Group 配置的监听逻辑在GROUP分支ApolloConfigWatcherRegister.java中先读初始组通过configReader.getPropertyNames()拿到全部 key过滤出以key .为前缀的子项剥掉前缀得到子项名构造GroupConfigTable.GroupConfigItems一次性回调再挂监听addChangeListener(..., Collections.emptySet(), Collections.singleton(key))第三个参数即监听该 key 前缀interestedKeyPrefixes变更事件中每个 changedKey 同样通过去前缀提取子项名与最新值以分组形式回调。从源码结构可以推断Group 监听按「key 前缀」而非精确 key 匹配因此新增子项如新增一份 OpenAPI 文件无需重启 OAP只需在 Apollo 中追加configKey.subItemKey键并发布即可被监听捕获。另外ApolloConfigWatcherRegister继承的是「监听式」寄存器ListeningConfigWatcherRegister其start()为空实现意味着配置更新是事件驱动的实时推送而非周期轮询拉取这与FetchingConfigWatcherRegister类实现的周期拉取风格如部分其他配置中心实现存在本质差异。集成测试验证真实 Apollo 环境下的读写闭环模块自带的集成测试 ApolloConfigurationIT.java 通过 Testcontainers 拉起 Apollo 的apollo-config-and-portal容器暴露 8080/8070 端口并调用 Apollo OpenAPI 完成配置的创建、发布、删除闭环验证两类配置的完整链路Single 测试shouldReadUpdated初始断言provider.watcher.value()为null通过 OpenAPIPOST /openapi/v1/envs/DEV/apps/SampleApp/clusters/default/namespaces/application/items创建test-module.default.testKey3000并发布/releases随后自旋等待 watcher 值变为3000并断言相等再通过DELETE删除该键并重新发布断言 watcher 值回到null——验证了新增、变更、删除三种事件下的单值监听。Group 测试shouldReadUpdated4Group初始断言groupWatcher.groupItems()为{}创建test-module.default.testKeyGroup.item1100与.item2200并发布断言两个子项值分别为100、200随后删除item1并发布断言item1消失而item2仍为200——验证了分组子项的增删能被正确捕获。测试使用的ApolloConfigurationTestProvider见 ApolloConfigurationTestProvider.java注册了ConfigChangeWatcher键testKey与GroupConfigChangeWatcher键testKeyGroup并以EventType.DELETE区分删除与更新模拟了 OAP 内部业务模块注册动态配置监听的标准姿势——任何希望消费动态配置的 OAP 模块都需要通过DynamicConfigurationService#registerConfigChangeWatcher注册同类 watcher。实战要点小结启用前提将configuration.selector设为apollo或设置环境变量SW_CONFIGURATIONapollo否则动态配置整体处于关闭状态连接配置至少正确配置apolloMetaMeta Server 地址与appId并按需指定apolloCluster、apolloEnv这些值会映射为 Apollo 客户端系统属性apollo.meta、app.id、apollo.cluster、env键名规范Single 配置键即完整 configKeyGroup 配置键必须以configKey.开头子项名紧随其后两者用.分隔发布生效在 Apollo 中新建或修改配置项后需要发布Release监听机制才能收到变更事件新增 Group 子项无需重启 OAP验证手段可参考 ApolloConfigurationIT.java 的 OpenAPI 调用方式在自己的 Apollo 环境中模拟配置写入与发布观察 OAP 侧配置是否热更新。若需同时了解其他配置中心实现Zookeeper、Etcd、Consul、Nacos、Kubernetes Configmap 等以及完整动态配置键清单可继续阅读 dynamic-config.md 与 dynamic-config-service.md。【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sk/skywalking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考