Apollo 2.0.0 版本解析:从 Java 17 支持到灰度发布、安全加固与 OpenAPI 重构
2026/9/19 15:10:26 网站建设 项目流程

Apollo 2.0.0 版本解析:从 Java 17 支持到灰度发布、安全加固与 OpenAPI 重构

【免费下载链接】apolloApollo is a reliable configuration management system suitable for microservice configuration management scenarios.项目地址: https://gitcode.com/gh_mirrors/apoll/apollo

Apollo 2.0.0 是配置中心 Apollo 的一个里程碑式大版本,本篇文章基于官方changes/changes-2.0.0.md的 Release Notes,结合仓库源码逐项解读 2.0.0 的核心变更,覆盖运行环境升级(Java 17、Spring Boot 2.6)、安全能力增强(Access Key 时间戳可配置、密码策略)、灰度发布维度扩展、公共 Namespace、按 Item 搜索、按环境导入导出配置、软删除重构与 OpenAPI 易用性改造等主题。读完你可以掌握 Apollo 2.0.0 的升级要点、关键配置项和对应源码位置,为实际部署与二次开发提供直接参考。

版本定位与升级总览

根据 changes/changes-2.0.0.md,Apollo 2.0.0 是一次"能力扩展 + 平台加固"的大版本,Release Notes 中列出的 Pull Request 超过 50 项,大致可归为六类:

类别代表性变更
运行环境升级支持 Java 17、升级 Spring Boot 2.6.6 / Spring Cloud 2021.0.1、Flyway 8.0.5、Guava 31.0.1,并移除 Java 1.7 支持
安全加固Access Key 时间戳校验可配置、密码策略落地且规则可配置、修复用户改密失败、处理 SSL 握手异常
配置治理能力公共 Namespace 基础能力、按 Item 搜索、按环境导出/导入配置、Namespace 对比仅显示差异键
灰度发布扩展灰度规则支持除 IP 之外的多维度(label),修复灰度发布刷新 Item 状态问题
工程与架构重构软删除设计重构、移除 ctrip 内部 profile、内部代码去除 Spring 依赖、OpenAPI 易用化重构
缺陷修复与体验优化首页与顶部导航样式优化、创建 Namespace 页面优化、发布/回滚弹窗滚动条、非 properties 类型 Namespace 的发布历史展示评论与时间等

下面按主题深入展开,每个主题都会给出对应的源码佐证路径,方便你在仓库中进一步核验。

运行环境升级:Java 17 与 Spring 生态版本对齐

2.0.0 最引人注目的变化是升级到 Java 17 并放弃 Java 1.7(对应 PR #4015、#4060)。这意味着:

  • 运行 Apollo 2.0.0 各服务的 JVM 至少应为 Java 8(更推荐 Java 17),Java 1.7 已不再被支持;
  • 为适配 Java 17 的强封装模块系统与编译工具链,2.0.0 同步升级了 Maven 插件版本(PR #4333),并升级了 Spring Boot 到 2.6.6、Spring Cloud 到 2021.0.1(PR #4295);
  • 依赖层面做了多处 Bump:xstream 1.4.17 → 1.4.18(PR #3916)、Guava 29.0 → 31.0.1(PR #4182)、Flyway → 8.0.5(PR #4312),并移除了对内部代码的 Spring 依赖(PR #3937)。

升级依赖的同时也修复了若干由此暴露出的兼容性问题:

  • Portal 启动失败问题(PR #4298);
  • javax.net.ssl.SSLHandshakeException: No appropriate protocol(PR #4308),该问题常见于 JDK 与远程服务 TLS 协议版本协商不一致的场景;
  • 使用EnableApolloConfig且配合 Spring 3.1.1 时出现的 NPE(PR #4180);
  • property placeholder 在 dubbo reference bean 上不生效的问题(PR #4175)。

升级提示:若你当前运行的是 1.x 版本,升级前需重点核对运行 JVM 版本(≥ Java 8)、Spring Boot/Spring Cloud 版本兼容性,以及数据库迁移(Flyway 版本变化)带来的影响。

安全加固:Access Key 时间戳校验可配置化

Apollo 客户端与 ConfigService 之间通过Access Key + 签名进行身份认证。在 2.0.0 之前,请求头时间戳的校验窗口是硬编码的 60 秒;2.0.0 将其改造为可配置项(PR #3908)。

认证核心逻辑位于 ClientAuthenticationFilter.java,其中doCheck方法按顺序执行两步校验:

  1. 时间戳校验checkTimestamp):读取请求头Timestamp,若与服务器时间偏差过大则直接返回 401RequestTimeTooSkewed
  2. 签名校验checkAuthorization):结合 URI、QueryString、时间戳与 AccessKey 的 Secret 计算签名并比对。

对应的配置项定义在 BizConfig.java,相关配置项如下:

配置项默认值说明
apollo.access-key.auto-provision.enabledfalse是否允许 Access Key 自动创建
apollo.access-key-cache-scan.interval1(秒)Access Key 缓存扫描间隔
apollo.access-key-cache-rebuild.interval60(秒)Access Key 缓存重建间隔
apollo.access-key.auth-time-diff-tolerance60(秒)认证允许的时间戳偏差窗口(2.0.0 新增)

其中apollo.access-key.auth-time-diff-tolerance即本次"Make Access Key Timestamp check configurable"的核心产物,默认值 60 秒与旧版本硬编码行为保持一致。对于存在客户端与服务器时钟偏差、或使用负载均衡导致多节点时钟不一致的部署环境,可以适当调大该值以减少误杀;在安全要求更高的场景下也可调小以收紧校验窗口。时间戳校验的具体逻辑与 401 响应路径可对照 ClientAuthenticationFilter.java 查看。

安全加固:密码策略与规则可配置化

2.0.0 引入了内置密码策略,用于在**内建用户体系(Spring Security 本地账号)**下避免弱密码(PR #4008、#4207、#4212),同时修复了用户修改密码失败的缺陷。

密码校验实现位于 AuthUserPasswordChecker.java,其默认规则为:

^(?=.*[0-9].*)(?=.*[a-zA-Z].*).{8,20}$

即:密码必须同时包含数字和字母,长度在 8~20 个字符之间;同时会检查密码是否属于常见弱密码(如连续字符、纯字母/数字序列等,例如abcd12341234qwer1q2w3e4r)。

为避免"规则硬编码",2.0.0 还支持通过 Portal 配置自定义禁止使用的密码列表(PR #4207),配置项为:

apollo.portal.auth.user-password-not-allow-list=abcd1234,1234qwer,...

该配置由 PortalConfig.getUserPasswordNotAllowList() 读取,未配置时使用内置默认禁止列表;AuthUserPasswordChecker在校验时会将用户输入的密码小写化后与列表逐项比对。密码策略同时作用于 Portal 的 UserInfoController.java 与 OpenAPI 的 UserController.java 用户管理接口,相关测试见 UserControllerTest.java。

灰度发布:从 IP 维度扩展到 Label 维度

灰度发布是 Apollo 的核心能力之一。2.0.0 之前灰度规则只支持按客户端 IP匹配,2.0.0 将其扩展为IP + Label(客户端打标)多维度匹配(PR #4013),从而支持了按机房、环境、自定义标签等场景的灰度。

灰度规则项的匹配模型定义在 GrayReleaseRuleItemDTO.java:

private String clientAppId; // 目标客户端 AppId private Set<String> clientIpList; // 目标 IP 列表 private Set<String> clientLabelList; // 目标 Label 列表(2.0.0 新增) public boolean matches(String clientAppId, String clientIp, String clientLabel) { return (appIdMatches(clientAppId) && ipMatches(clientIp)) || (appIdMatches(clientAppId) && labelMatches(clientLabel)); }

可以看到,匹配规则为:AppId 匹配且 IP 命中,或 AppId 匹配且 Label 命中,二者满足其一即可命中灰度。服务端负责加载与维护灰度规则的组件是 GrayReleaseRulesHolder.java,它实现ReleaseMessageListener,通过监听ReleaseMessage在本地缓存灰度规则,供 ConfigService 下发配置时进行分支选择。

同一主题还修复了灰度发布后 Item 状态刷新不正确的问题(PR #4128),保证灰度分支上的配置项在发布后界面状态与数据一致。

配置治理:公共 Namespace、按 Item 搜索与导入导出

公共 Namespace 基础能力

2.0.0 引入公共 Namespace(public namespace)基础功能(PR #3850),允许将部分 Namespace 声明为公共类型,供其他应用关联复用,这是平台级配置复用能力的基础,与此前"关联公共 Namespace"的用法一致。相关的核心实体与规则可结合 Namespace 及 Portal 的 Namespace 相关 Controller 查看。

按 Item 搜索配置项

2.0.0 支持按配置项(Item)搜索(PR #3977),即通过 Key 或 Value 进行全局配置检索,而不再局限于按 Namespace/应用名搜索。该功能默认开启,可通过配置关闭:

searchByItem.switch=true

配置由 PortalConfig.supportSearchByItem() 读取,接口实现位于 GlobalSearchController.java,提供了按 key 或 value 检索配置项信息的端点,并校验至少输入一个搜索条件(key 或 value 二选一)。

按环境导出 / 导入配置

2.0.0 支持按 Apollo 环境(Env)批量导出/导入配置(PR #3947,以及后续优化 PR #4231、修复 PR #4262),便于多环境之间的配置迁移与备份。

导出相关端点集中在 ConfigsExportController.java:

端点功能
GET /apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces/{namespaceName}/items/export导出指定 Namespace 的配置项
GET /apps/{appId}/envs/{env}/clusters/{clusterName}/export导出指定环境、集群下的应用配置
GET /apps/{appId}/.../export?envs=DEV,FAT按逗号分隔的 envs 参数一次性导出多个环境

其他配置治理体验优化

  • Namespace 对比仅显示差异键(PR #4165):对比两个 Namespace 时支持只展示差异项,减少信息噪音;
  • 非 properties 类型的 Namespace 发布历史也展示评论与发布时间(PR #4198);
  • 文本模式下已删除配置项的显示问题修复(PR #4279)、文本视图中关联 Namespace 显示错误修复(PR #4219);
  • 超过 16 位的 JSON 数字显示问题修复(PR #4183)。

架构与工程重构:软删除重构、OpenAPI 易用化与脚本化

软删除设计重构

2.0.0 对底层软删除(soft delete)设计做了重构(PR #3866),并修复了一个潜在的数据一致性问题(PR #4256)。这是一次偏底层的架构调整,涉及数据库层删除标记的处理方式,重构后相关 DAO/Repository 层的删除语义更为统一。配合此次重构,仓库的 scripts/sql/migration/release-history-retention 目录还提供了面向"发布历史保留"场景的预检查与清理 SQL 脚本(含 precheck 与 restore/purge 流程),可作为软删除数据治理的参考。

OpenAPI 易用化重构与 bash 脚本调用

2.0.0 对OpenAPI 做了易用性重构(PR #3943),让第三方系统接入 Apollo OpenAPI 更简单,同时补充了使用 bash 调用 OpenAPI 的脚本(PR #3980)。

仓库提供了完整的 bash 调用示例:openapi.sh 与 openapi-usage-example.sh。脚本通过环境变量注入目标地址与令牌:

export APOLLO_PORTAL_ADDRESS=http://ip:port export APOLLO_OPENAPI_TOKEN=please_change_me_by_environment_variable

openapi.sh内封装了通过 curl 调用 Portal OpenAPI 的常用函数,并支持通过CURL_OPTIONS透传额外 curl 参数,方便在 CI/CD 流水线中直接复用。

其他工程化变更

  • 移除 ctrip profile(PR #3920):去掉与携程内部环境强绑定的 profile,进一步走向通用开源形态;
  • 移除内部代码的 Spring 依赖(PR #3937)、用 commons-lang3 替换 commons-lang(PR #4225);
  • ProviderManager SPI 增加 Ordered 接口(PR #4218):允许对多个 Provider 的实现进行排序,增强 SPI 扩展的确定性;
  • ConfigService 日志从 warning 降级为 info(PR #3884):减少正常请求下的日志噪音;
  • helm chart 拆分到独立仓库(PR #4125):Apollo 主仓库不再维护 helm chart,Kubernetes 部署请使用独立的 chart 仓库;
  • 修复 shell 脚本读取变量时未使用$符号的问题(PR #3890)、修复 ingress 语法问题(PR #3933);
  • 允许关闭客户端本地缓存(PR #4199):提供开关以适配禁止本地落盘的强安全场景;
  • 用 Spring ApplicationEvent 广播 ConfigChangeEvent(PR #4305):客户端配置变更事件改为基于 Spring 事件机制广播,便于与 Spring 生态统一集成;
  • 捕获 ClassLoaderUtil.isClassPresent 的 LinkageError(PR #4097):类存在但加载失败时不再异常中断;
  • UI 体验优化:首页样式优化(PR #4052)、顶部导航样式优化(PR #4073)、创建 Namespace 页面优化(PR #4213)、发布/回滚弹窗增加滚动条(PR #4251)、版权年份更新(PR #4202)。

升级到 Apollo 2.0.0 的注意事项

综合上述变更,升级到 2.0.0 时建议重点检查以下事项:

  1. JVM 版本:2.0.0 已放弃 Java 1.7(PR #4015),请确保 ConfigService、AdminService、Portal 运行在 Java 8 及以上,生产环境建议直接使用 Java 17(PR #4060);
  2. 框架版本:Spring Boot 升级至 2.6.6、Spring Cloud 升级至 2021.0.1(PR #4295),业务侧如需同时升级,请先核对自身依赖树,特别是与 xstream、Guava、Flyway 的间接依赖冲突;
  3. 数据库迁移:Flyway 升级到 8.0.5(PR #4312),升级过程中请按官方 SQL 迁移脚本(见 scripts/sql 各 profile 下的 delta 目录)逐版本执行,并注意软删除重构(PR #3866)对数据的影响;
  4. Access Key 时间窗口:如存在时钟偏差环境,可调整apollo.access-key.auth-time-diff-tolerance
  5. 密码策略:启用本地账号体系后,新密码必须满足"数字 + 字母 + 8~20 位"的默认规则,可用apollo.portal.auth.user-password-not-allow-list追加禁用名单;
  6. Kubernetes 部署:helm chart 已从本仓库移除(PR #4125),如使用 K8s 部署请改用独立维护的 chart 仓库。

小结

Apollo 2.0.0 通过 Java 17 支持、Spring 生态升级完成了平台底座现代化,通过 Access Key 时间戳可配置、密码策略落地强化了安全边界,通过灰度 Label 维度、公共 Namespace、按 Item 搜索、按环境导入导出提升了配置治理能力,并通过软删除重构、OpenAPI 易用化与脚本化降低了二次开发门槛。本仓库的 changes/changes-2.0.0.md 记录了完整的 PR 清单,你可以在 CHANGES.md 中查看更完整的版本演进脉络,并借助上文列出的源码路径深入研读每一处实现细节。

【免费下载链接】apolloApollo is a reliable configuration management system suitable for microservice configuration management scenarios.项目地址: https://gitcode.com/gh_mirrors/apoll/apollo

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询