Apache SkyWalking 动态配置(Dynamic Configuration)机制详解:从 application.yml 开关到 ZooKeeper/Etcd/Nacos 多实现 📅 发布时间:2026/9/20 7:17:21 👁 浏览次数: Apache SkyWalking 动态配置Dynamic Configuration机制详解从 application.yml 开关到 ZooKeeper/Etcd/Nacos 多实现【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sky/skywalkingSkyWalking 的绝大多数配置通过 OAP 后端的application.yml和操作系统环境变量设置但其中一部分关键配置慢 SQL 阈值、告警规则、APDEX 阈值、端点分组规则、日志配置、采样策略等支持从上游配置管理系统动态下发、热更新。本文基于 docs/en/setup/backend/dynamic-config.md 逐层展开并结合oap-server/server-configuration模块的源码讲清楚Single / Group 两种动态配置的结构与支持的配置项、各实现ZooKeeper、Etcd、Consul、Apollo、Nacos、K8s ConfigMap、gRPC DCS的连接参数以及底层观察者Watcher注册与通知机制的工作原理。读完本文你可以独立为生产集群开启并验证动态配置能力。1. 功能定位默认禁用依赖上游服务SkyWalking 的配置主要分两层静态层application.yml 环境变量进程启动时生效动态层某些配置项支持从上游管理系统ZooKeeper、Etcd、Consul、Apollo、Nacos、K8s ConfigMap 或自定义 gRPC 服务拉取并热更新。由于动态配置依赖外部服务该特性默认禁用。在发行版配置 application.yml 中开关即configuration.selectorconfiguration: selector: ${SW_CONFIGURATION:none} # 默认 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} maxInboundMessageSize: ${SW_DCS_MAX_INBOUND_MESSAGE_SIZE:4194304} # ... other implementationsselector的值决定加载哪个配置提供者Provider。设为none时加载的是 NoneConfigurationProvider——从源码可以看到它注册的DynamicConfigurationService的registerConfigChangeWatcher方法体是空的即所有 watcher 注册都是空操作OAP 行为与未启用动态配置完全一致。要启用只需设置环境变量例如SW_CONFIGURATIONzookeeper无需改文件、无需重启代码逻辑。2. Single 配置{configKey}:{configValue}单值键Single单值配置是一个配置键对应一个具体值的逻辑结构{configKey}:{configValue}例如为不同数据库类型设置不同的慢访问阈值agent-analyzer.default.slowDBAccessThreshold:{default:200,mongodb:50}键名遵循模块名.实现名.配置项名的三段式命名与 OAP 的模块化体系一一对应agent-analyzer是 agent 数据解析模块core是核心模块。当前支持的 Single 配置项如下表完整继承自官方文档Config Key值说明值格式示例agent-analyzer.default.slowDBAccessThreshold慢数据库语句阈值。覆盖application.yml中的agent-analyzer/default/slowDBAccessThresholddefault:200,mongodb:50agent-analyzer.default.uninstrumentedGateways未插桩网关列表。覆盖gateways.yml与 gateways.yml 配置格式 相同alarm.default.alarm-settings告警规则。覆盖alarm-settings.yml与 alarm-settings.yml 相同core.default.apdexThresholdAPDEX 阈值设置。覆盖service-apdex-threshold.yml与 service-apdex-threshold.yml 相同core.default.endpoint-name-grouping端点名分组规则。覆盖endpoint-name-grouping.yml与 endpoint-name-grouping.yml 相同core.default.log4j-xmllog4j XML 配置。覆盖log4j2.xml与 dynamical-logging.md 中 log4j2.xml 格式相同core.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-policy-settings.yml 相同configuration-discovery.default.agentConfigurationsConfigurationDiscovery 设置下发给 Java Agent 的配置格式同 SkyWalking Java Agent 的 configuration-discovery 文档这些配置项在 OAP 内部都有真实的消费者Watcher 实现源码中一一对应慢 SQL/缓存阈值DBLatencyThresholdsAndWatcher.java采样策略TraceSamplingPolicyWatcher.javaAPDEX 阈值ApdexThresholdConfig.java端点分组规则EndpointNameGroupingRuleWatcher.java告警规则AlarmRulesWatcher.java可搜索标签SearchableTracesTagsWatcher.javalog4j 动态日志LoggingConfigWatcher.javaAgent 配置下发AgentConfigurationsWatcher.java3. Group 配置一个键对应一组子项Group分组配置是一个配置键对应一组键值对子项的逻辑结构{configKey}: |{subItemKey1}:{subItemValue1} |{subItemKey2}:{subItemValue2} |{subItemKey3}:{subItemValue3} ...例如按 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 配置项Config KeySubItem Key 说明值说明值格式示例core.default.endpoint-name-grouping-openapi与 OpenAPI 定义文件关联的服务名如serviceA。若同一服务对应多个文件则为每个文件添加一个 subItem子项键用.分隔服务名与文件名如serviceA.API-file1、serviceA.API-file2用于创建端点分组规则的 OpenAPI 定义文件内容yaml 格式与 endpoint-grouping-rules.md 中的productAPI-v2.yaml相同从源码看Single 与 Group 的区分贯穿整个 API 层GroupConfigChangeWatcher 继承自ConfigChangeWatcher并将WatchType置为GROUP它禁用了单值的value()/notify()方法改用groupItems()返回MapString, String、notifyGroup(MapString, ConfigChangeEvent)接收整组变更对应地GroupConfigTable 用ConcurrentHashMap存储每个分组下的子项保证并发写入安全。OpenAPI 场景的消费者是 EndpointNameGroupingRule4OpenapiWatcher.java。4. 实现清单与各实现的连接参数SkyWalking 内置以下动态配置实现configuration.selector可选值Dynamic Configuration ServicegRPC DCSZooKeeper 实现Etcd 实现Consul 实现Apollo 实现Kubernetes ConfigMap 实现Nacos 实现每个实现对应oap-server/server-configuration下的独立 Maven 模块与*ConfigurationProvider类configuration-apiAPI 基座、configuration-zookeeper、configuration-etcd、configuration-consul、configuration-apollo、configuration-nacos、configuration-k8s-configmap、grpc-configuration-sync。它们的连接参数全部集中在application.yml的configuration块application.ymlconfiguration: 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} maxInboundMessageSize: ${SW_DCS_MAX_INBOUND_MESSAGE_SIZE:4194304} 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} zookeeper: period: ${SW_CONFIG_ZK_PERIOD:60} # 单位秒同步周期默认每 60 秒拉取一次 namespace: ${SW_CONFIG_ZK_NAMESPACE:/default} hostPort: ${SW_CONFIG_ZK_HOST_PORT:localhost:2181} # Retry Policy baseSleepTimeMs: ${SW_CONFIG_ZK_BASE_SLEEP_TIME_MS:1000} # 重试间初始等待时间 maxRetries: ${SW_CONFIG_ZK_MAX_RETRIES:3} # 最大重试次数 etcd: period: ${SW_CONFIG_ETCD_PERIOD:60} # 单位秒同步周期 endpoints: ${SW_CONFIG_ETCD_ENDPOINTS:http://localhost:2379} namespace: ${SW_CONFIG_ETCD_NAMESPACE:/skywalking} authentication: ${SW_CONFIG_ETCD_AUTHENTICATION:false} user: ${SW_CONFIG_ETCD_USER:} password: ${SW_CONFIG_ETCD_password:} consul: # Consul host and ports, separated by comma, e.g. 1.2.3.4:8500,2.3.4.5:8500 hostAndPorts: ${SW_CONFIG_CONSUL_HOST_AND_PORTS:1.2.3.4:8500} # Sync period in seconds. Defaults to 60 seconds. period: ${SW_CONFIG_CONSUL_PERIOD:60} # Consul aclToken aclToken: ${SW_CONFIG_CONSUL_ACL_TOKEN:} k8s-configmap: period: ${SW_CONFIG_CONFIGMAP_PERIOD:60} namespace: ${SW_CLUSTER_K8S_NAMESPACE:default} labelSelector: ${SW_CLUSTER_K8S_LABEL:appcollector,releaseskywalking} 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} # Nacos auth username username: ${SW_CONFIG_NACOS_USERNAME:} password: ${SW_CONFIG_NACOS_PASSWORD:} # Nacos auth accessKey accessKey: ${SW_CONFIG_NACOS_ACCESSKEY:} secretKey: ${SW_CONFIG_NACOS_SECRETKEY:}参数要点selector唯一的总开关none关闭功能periodZK/Etcd/Consul/Nacos/ConfigMap拉取式实现的同步周期默认 60 秒意味着这类实现的动态性体现在周期轮询变更后最迟一个周期生效namespace各实现存放 SkyWalking 配置的数据前缀/命名空间ZK 默认/default、Etcd 默认/skywalking、Nacos 默认为空gRPC DCSclusterName标识 OAP 集群period默认 20 秒maxInboundMessageSize默认 4MB4194304 字节用于接收大体积配置内容认证Etcd 支持authentication/user/passwordConsul 支持aclTokenNacos 支持账号密码或 accessKey/secretKeyK8s ConfigMap 通过labelSelector定位目标 ConfigMap。各实现的集成测试如 ZookeeperConfigurationIT.java、EtcdConfigurationIT.java、ConsulConfigurationIT.java 等展示了真实的验证方式启动对应中间件、写入{configKey}:{configValue}格式的 key再断言 OAP 中注册在案的 watcher 收到新值。5. 源码级原理Watcher 注册与通知链路动态配置的核心抽象全部位于 configuration-api 模块模块定义见 ConfigurationModule.java配置模块从远端服务同步配置。整个 OAP 后端的任何配置项都可以向 configuration 模块注册 watcher值变化时对应 watcher 会被调用。关键接口与类的职责DynamicConfigurationService唯一对外服务接口只有一个方法registerConfigChangeWatcher(ConfigChangeWatcher)。其他模块core、alarm、agent-analyzer 等在ModuleProvider初始化阶段通过模块服务注入拿到该服务并注册各自的 watcherConfigChangeWatcher抽象观察者。构造参数为(module, provider, itemName)即第 2 节键名的三段子类实现notify(ConfigChangeEvent)处理新值、value()读取当前值默认WatchType.SINGLEGroupConfigChangeWatcherGroup 类型的观察者基类用notifyGroup接收整组子项变更AbstractConfigurationProvider所有真实实现的基类。生命周期上prepare()阶段调用子类的initConfigReader()创建 ConfigWatcherRegister 并注册为DynamicConfigurationServicenotifyAfterCompleted()阶段才调用configWatcherRegister.start()开始与远端同步。从源码结构看这保证了先完成全模块 watcher 注册、再启动数据同步避免启动窗口期的变更丢失ConfigTable / GroupConfigTable分别在内存中维护全部 Single/Group 配置项的最新值快照注册器RegisterFetchingConfigWatcherRegister 面向周期拉取型实现ZK、Etcd、Consul、Nacos、ConfigMapListeningConfigWatcherRegister 面向长连接监听型实现如 gRPC DCS二者分别有对应单测 FetchingConfigWatcherRegisterTest.java 与 ListeningConfigWatcherRegisterTest.java 覆盖其分发逻辑。端到端链路可以概括为上游配置中心(ZK/Etcd/Nacos/...) ──period 轮询/长连接── ConfigWatcherRegister │ 拉取/收到 {configKey}:{configValue} ▼ ConfigTable / GroupConfigTable 更新快照 ▼ 按 (module, provider, itemName) 路由 ConfigChangeWatcher.notify() / GroupConfigChangeWatcher.notifyGroup() ▼ 各模块热更新 慢SQL阈值、采样策略、APDEX、告警规则、端点分组、log4j、searchableTags、Agent配置...6. 落地检查清单确认版本中包含对应实现模块当前仓库oap-server/server-configuration下 7 个实现均已内置设置SW_CONFIGURATION或其他实现的连接参数如SW_CONFIG_ZK_HOST_PORT在上游配置中心写入与第 2/3 节表格一致的键例如 ZooKeeper 中写入 keycore.default.apdexThreshold等待一个同步周期后验证 OAP 侧生效行为如按新 APDEX 阈值查询、按新告警规则触发各实现更详细的部署前提与操作差异参见第 4 节列出的各实现文档。适用前提与限制动态配置仅覆盖上表列出的配置项application.yml中其余项存储、集群、MQ 等仍是启动时静态配置拉取型实现的生效延迟受period控制功能依赖外部配置中心可用性配置中心不可达时 OAP 会使用内存快照中的最后已知值继续工作各实现通过period周期重试但不会产生新变更。【免费下载链接】skywalkingAPM, Application Performance Monitoring System项目地址: https://gitcode.com/gh_mirrors/sky/skywalking创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考