可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载Nacos 2.x 可以作为 SkyWalking OAP 的动态配置中心Dynamic Configuration Center, DCC让application.yml中的部分配置项在上游管理系统中被动态修改而无需重启 OAP 服务。本文以 dynamic-config-nacos.md 为主体结合configuration-nacos模块的源码与测试完整讲解 Nacos 接入配置、Single/Group 两种配置存储模型以及底层监听与轮询机制。读完本文你将能够独立完成 Nacos 与 OAP 的对接、正确发布单条与分组动态配置并理解配置生效的全链路原理。动态配置机制与 Nacos 接入前提SkyWalking 的大多数配置通过application.yml和操作系统环境变量设置但其中一部分配置支持由上游管理系统动态下发。动态配置能力由configuration模块提供该特性依赖上游服务因此默认处于关闭状态selector 默认值为none相关说明见 dynamic-config.md。configuration: selector: ${SW_CONFIGURATION:none} none: grpc: host: ${SW_DCS_SERVER_HOST:} port: ${SW_DCS_SERVER_PORT:80} clusterName: ${SW_DCS_CLUSTER_NAME:SkyWalking} period: ${SW_DCS_PERIOD:20} # ... other implementations在oap-server/server-configuration下SkyWalking 为每种配置中心提供了独立实现模块Nacos 对应configuration-nacos模块模块目录configuration-nacos依赖com.alibaba.nacos:nacos-client见其 pom.xml。接入 Nacos 只需两步在application.yml的configuration段选择nacos实现并填写连接参数然后在 Nacos 控制台中按约定的 Data Id / Group 发布配置。application.yml 完整配置项与参数说明要启用 Nacos 实现在application.yml的configuration段下配置如下完整块原样继承自官方文档configuration: selector: ${SW_CONFIGURATION:nacos} nacos: # Nacos Server Host serverAddr: ${SW_CONFIG_NACOS_SERVER_ADDR:127.0.0.1} # Nacos Server Port port: ${SW_CONFIG_NACOS_SERVER_PORT:8848} # Nacos Configuration Group group: ${SW_CONFIG_NACOS_SERVER_GROUP:skywalking} # Nacos Configuration namespace namespace: ${SW_CONFIG_NACOS_SERVER_NAMESPACE:} # Unit seconds, sync period. Default fetch every 60 seconds. period: ${SW_CONFIG_NACOS_PERIOD:60} # the name of current cluster, set the name if you want to upstream system known. clusterName: ${SW_CONFIG_NACOS_CLUSTER_NAME:default}各配置项的取值语义与默认值如下配置项环境变量覆盖默认值说明serverAddrSW_CONFIG_NACOS_SERVER_ADDR127.0.0.1Nacos Server 主机地址portSW_CONFIG_NACOS_SERVER_PORT8848Nacos Server 端口groupSW_CONFIG_NACOS_SERVER_GROUPskywalking所有动态配置使用的 Nacos 配置分组namespaceSW_CONFIG_NACOS_SERVER_NAMESPACE空字符串Nacos 命名空间为空表示 publicperiodSW_CONFIG_NACOS_PERIOD60同步周期单位秒即每 60 秒轮询拉取一次clusterNameSW_CONFIG_NACOS_CLUSTER_NAMEdefault当前集群名称从源码 NacosServerSettings.java 可以看到实际支持的字段比文档示例更丰富还包括可选的安全与扩展参数username、password用户名密码认证、contextPathNacos 服务上下文路径以及accessKey、secretKeyAccessKey/SecretKey 认证。这些字段会在构造 NacosConfigService时被转换为 Nacos 客户端的PropertyKeyConst属性见下文源码解析有认证需求时可自行补充到nacos段。启动期参数校验逻辑NacosConfigurationProvider.initConfigReader()见 NacosConfigurationProvider.java在模块启动时会执行如下校验任一不满足会抛出ModuleStartException导致启动失败serverAddr不能为空port必须是正整数group不能为空username与accessKey不能同时配置——认证方式二选一否则报错 Nacos Auth method should choose either username or accessKey, not both。随后通过new NacosConfigWatcherRegister(settings)建立与 Nacos 的连接连接失败NacosException同样会转化为ModuleStartException。源码原理监听、轮询与配置读取Nacos 实现的运行时核心是NacosConfigWatcherRegister见 NacosConfigWatcherRegister.java它继承自FetchingConfigWatcherRegister配置 API 模块中的周期拉取注册器工作方式可以概括为“长轮询监听 周期兜底”建立连接构造函数用serverAddr:port、namespace等属性调用NacosFactory.createConfigService(properties)创建 NacosConfigService若配置了username/password或accessKey/secretKey会一并写入客户端属性。注册监听registerKeyListeners(keys)对每个关心的 Data Id 调用configService.addListener(dataId, group, listener)注册 Nacos 原生 Listener配置在 Nacos 侧变更时receiveConfigInfo回调触发onDataIdValueChanged把新值写入内存缓存configItemKeyedByNameConcurrentHashMap并打印Nacos config changed: dataId: value日志。首读与周期轮询首次注册监听后立即getConfig(dataId, group, 1000)读取一次同时由于继承自FetchingConfigWatcherRegister每个period默认 60 秒会周期执行readConfig/readGroupConfig兜底刷新避免遗漏变更。失效清理removeUninterestedKeys(keys)会对比当前监听集合与感兴趣的键集合对已不再关心的 Data Id 调用configService.removeListener并移除缓存保证监听器不泄漏。单元测试 NacosConfigWatcherRegisterTest.java 用 Mockito 模拟ConfigService验证了readConfig能按 Data Id 正确组装ConfigTable。配置存储模型一Single Config单条配置Single Config 是最简单的形态一个 Data IdconfigKey对应一个配置值configValue逻辑结构为{configKey}:{configValue}。落到 Nacos 中的存储映射为Data IdGroupConfig ValueconfigKey{group}configValue例如动态配置项{agent-analyzer.default.slowDBAccessThreshold}:{default:200,mongodb:50}当group skywalking时在 Nacos 中的存储为Data IdGroupConfig Valueagent-analyzer.default.slowDBAccessThresholdskywalkingdefault:200,mongodb:50在 Nacos 控制台新建配置时Data ID 填agent-analyzer.default.slowDBAccessThresholdGroup 填skywalking配置内容填default:200,mongodb:50注意配置类型建议选择 TEXT即可。发布后 OAP 会在下一个同步周期内或通过监听器即时感知并应用该阈值用于覆盖application.yml中agent-analyzer/default/slowDBAccessThreshold的慢数据库语句阈值设置。配置存储模型二Group Config分组配置Group Config 是一个 configKey 对应一组“子项 key-value”的集合逻辑结构为{configKey}: |{subItemkey1}:{subItemValue1} |{subItemkey2}:{subItemValue2} |{subItemkey3}:{subItemValue3} ...落到 Nacos 中的存储需要两类配置条目配合Data IdGroupConfig ValueConfig TypeconfigKey{group}subItemkey1subItemkey2...TEXTsubItemkey1{group}subItemValue1subItemkey2{group}subItemValue2.........即分组主配置configKey的值是一份“子项清单”列出该分组下所有子项 Data Id每个子项 Data Id 再单独存放自己的值。重要约束当增删某个子项时必须同步修改分组主配置configKey的值子项清单即Data IdGroupConfig ValueConfig TypeconfigKey{group}subItemkey1subItemkey2...TEXT如果只发布/删除子项而不更新主配置的清单OAP 侧无法感知该子项的存在。子项清单的分隔约定子项 key 之间使用\n或\r\n分隔并会去除首尾空白通过Nacos UI设置时每个子项 key 应单独占一行subItemValue1 subItemValue2 ...通过Nacos Open API设置时子项 key 之间用\n或\r\n分隔configService.publishConfig(test-module.default.testKeyGroup, skywalking, subItemkey1\n subItemkey2));源码侧readGroupConfig正是按此约定解析的先configService.getConfig(key, group, 1000)读取分组主配置再用config.split(\\n|\\r\\n)切分并对每个子项执行String::trim去空白然后逐个getConfig(itemName, group, 1000)读取子项值并组装成GroupConfigTable。完整示例OpenAPI 端点名分组以动态配置{core.default.endpoint-name-grouping-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}当group skywalking时需要在 Nacos 中创建如下 4 条配置Data IdGroupConfig ValueConfig Typecore.default.endpoint-name-grouping-openapiskywalkingcustomerAPI-v1productAPI-v1productAPI-v2TEXTcustomerAPI-v1skywalkingvalue of customerAPI-v1productAPI-v1skywalkingvalue of productAPI-v1productAPI-v2skywalkingvalue of productAPI-v2该配置用于动态下发 OpenAPI 定义文件内容以生成端点名分组规则Endpoint Name Grouping子项 key 可用serviceName.fileName形式区分不同服务的多个定义文件具体格式可参考 endpoint-grouping-rules.md。分组变更行为来自集成测试NacosConfigurationIT.java 以真实 Nacos 容器nacos/nacos-server:v2.3.2-slimstandalone 模式验证了分组配置的完整生命周期新增发布分组主配置test-module.default.testKeyGroup内容item1\n item2与子项item1、item2后watcher 能读到item1100、item2200删除子项removeConfig(item1, group)后watcher 中item1变为null修改子项重新发布item1300后watcher 值更新为300删除分组主配置移除testKeyGroup后其所有子项如item2在 watcher 中一并被清空。这印证了“分组主配置是子项集合的入口”这一关键设计主配置被删除时整个分组随之失效。同一测试类中的shouldReadUpdated用例还验证了单条配置的发布publishConfig(test-module.default.testKey, skywalking, 500)与删除removeConfig均能被实时感知。支持动态下发的配置键清单并非所有配置都支持动态下发当前支持的单条与分组配置键完整清单如下摘自 dynamic-config.md其中application.yml指 OAP 的 application.yml 相关配置Single Configuration单条Config Key值含义值格式示例agent-analyzer.default.slowDBAccessThreshold慢数据库语句阈值覆盖application.yml的agent-analyzer/default/slowDBAccessThresholddefault:200,mongodb:50agent-analyzer.default.uninstrumentedGateways未插桩网关配置覆盖gateways.yml同 uninstrumented-gateways.mdalarm.default.alarm-settings告警规则覆盖alarm-settings.yml同 backend-alarm.mdcore.default.apdexThresholdApdex 阈值覆盖service-apdex-threshold.yml同 apdex-threshold.mdcore.default.endpoint-name-grouping端点名分组规则覆盖endpoint-name-grouping.yml同 endpoint-grouping-rules.mdcore.default.log4j-xmllog4j2 XML 配置覆盖log4j2.xml同 dynamical-logging.mdcore.default.searchableTracesTags可检索 Trace 标签覆盖application.yml的core/default/searchableTracesTagshttp.method,http.status_code,rpc.status_code,db.type,db.instance,mq.queue,mq.topic,mq.brokeragent-analyzer.default.traceSamplingPolicy默认与服务维度的采样策略覆盖trace-sampling-policy-settings.yml同 trace-sampling.mdconfiguration-discovery.default.agentConfigurationsConfigurationDiscovery 设置参见 Java Agent 的 configuration-discovery 文档Group Configuration分组Config Key子项 Key 描述值描述值格式示例core.default.endpoint-name-grouping-openapi与 OpenAPI 定义文件相关的服务名如serviceA若一个服务对应多个文件则每个文件一个子项子项 key 用.拼接服务名与文件名如serviceA.API-file1、serviceA.API-file2用于生成端点名分组规则的 OpenAPI 定义文件内容YAML 格式同 endpoint-grouping-rules.md 中的productAPI-v2.yaml发布以上任一 Data Id 到 Nacos 的{group}默认skywalking分组后OAP 无需重启即可热更新对应模块行为例如动态调低slowDBAccessThreshold可立即收紧慢 SQL 告警口径动态下发log4j-xml可实现日志级别热切换。验证与排障建议启动校验若serverAddr、port、group非法OAP 启动日志会打印ModuleStartException并终止启动先从 NacosConfigurationProvider.java 的校验规则排查。连接与变更日志NacosConfigWatcherRegister在配置变更时会输出Nacos config changed: {dataId}: {value}可在 OAP 日志中确认监听是否生效。对照集成测试复现仓库内的 NacosConfigurationIT.java 使用 Testcontainers 拉起真实 Nacos 2.3.2 并跑通发布/修改/删除全流程是验证你本地接入行为的最佳参考用例。配置未生效排查确认 Data Id、Group 与application.yml中group完全一致Group 配置请检查分组主配置的子项清单是否包含目标子项并确认子项配置类型为 TEXT。与其它动态配置实现的关系Nacos 只是 SkyWalking 动态配置中心的一种实现仓库内还提供了以下等价实现接入方式与存储模型完全一致仅连接参数不同Dynamic Configuration Service, DCSZookeeper 实现Etcd 实现Consul 实现Apollo 实现Kubernetes Configmap 实现选择哪一实现取决于你已有的基础设施若团队已运维 Nacos 注册/配置中心将其同时作为 OAP 的动态配置中心是最小改动的方案否则可参考 dynamic-config.md 的总体说明选择合适的实现。赞分享可观测性APM链路追踪指标监控日志分析微服务【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址https://gitcode.com/gh_mirrors/sk/skywalking点击查看免费下载相关推荐SkyWalking OAP 动态配置中心接入 Consul 完整指南配置、存储模型与源码实现SkyWalking OAP 动态配置中心接入 Consul 完整指南配置、存储模型与源码实现 本文以 Apache SkyWalking OAP 后端内置的可观测性后端微服务云原生SkyWalking OAP 动态配置 Apollo 实现详解接入、配置存储与源码原理SkyWalking OAP 动态配置 Apollo 实现详解接入、配置存储与源码原理 SkyWalking OAP 的大部分配置通过 application可观测性APM链路追踪指标监控日志分析微服务SkyWalking OAP 集成 Nacos 2.x 实现动态配置中心Dynamic Configuration实战指南SkyWalking OAP 集成 Nacos 2.x 实现动态配置中心Dynamic Configuration实战指南 SkyWalking OAP 的可观测性后端微服务云原生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考