Apollo 2.1.0 版本变更解读:从 OpenAPI 修复、数据库服务注册到 Java 客户端仓库拆分
【免费下载链接】apolloApollo is a reliable configuration management system suitable for microservice configuration management scenarios.项目地址: https://gitcode.com/gh_mirrors/apoll/apollo
本篇基于 Apollo 2.1.0 版本变更清单 展开,带你逐条理解该版本在 OpenAPI 与 Portal 体验、安全机制、数据库与性能、服务注册架构上的关键改动,并结合当前仓库中的源码、SQL 脚本与配置文件佐证这些变更的实际落地形态。读完后,你能掌握 2.1.0 的升级要点、数据库驱动服务注册的新配置方式,以及 Java 客户端模块拆分对多语言仓库布局的影响。
一、2.1.0 变更全景
Apollo 2.1.0 共合入了 37 项变更,官方完整的 issue 与 PR 列表见版本记录中的 milestone 汇总。从当前仓库的 变更文档 来看,这些改动可以归为四类:
| 类别 | 代表性变更(PR 编号) |
|---|---|
| OpenAPI 与 Portal 功能增强 | #4437 批量关联公共 Namespace、#4459 配置项比较支持搜索 Key、#4468 新增分页加载配置项接口、#4464 用户管理页面、#4592 配置管理页面、#4499 支持删除 AppNamespace |
| 安全与认证 | #4663 Eureka 登录认证、#4428 优化 Spring-Security Firewall 拒绝请求响应、#4484 spring-session 序列化切换为 JSON、#4507 支持自定义 OIDC userDisplayName |
| 架构与仓库结构调整 | #4361 移除 Flyway、#4594 Java 客户端模块迁移至独立仓库、#4595 支持数据库作为服务注册中心、#4637 移除 app.properties 并调整配置文件位置、#4440 将 apollo-demo 与部署脚本移出主仓库 |
| 数据库与性能 | #4550 为 ReleaseHistory 表新增索引、#4473 优化 namespaces 接口查询性能、#4425 升级 mysql-connector-java、#4493 修复 deletedAt 时间戳问题 |
下面按主题逐组展开,并给出仓库内的对应证据。
二、架构级调整:仓库瘦身与服务注册新能力
2.1 移除数据库迁移工具 Flyway(PR #4361)
2.1.0 将 Flyway 从项目中移除。在当前仓库中已经搜索不到任何对 flyway 的依赖声明,数据库版本升级改由scripts/sql下的增量脚本(delta 脚本)管理。仓库中保留了跨版本迁移脚本,例如:
- v220→v230 增量脚本
- v230→v240 增量脚本
- v250→v300 增量脚本
这些脚本按h2-default、mysql-default、mysql-database-not-specified三种 profile 分别维护在scripts/sql/profiles目录下,升级数据库时应按实际使用的数据库类型选择对应目录执行。
2.2 Java 客户端模块迁移至独立仓库(PR #4594)
2.1.0 将apollo-core、apollo-client、apollo-mockserver、apollo-openapi与apollo-client-config-data五个模块从主仓库移出,迁移到独立的 apollo-java 仓库。可以从当前仓库的模块结构印证这一点:根目录下只保留了服务端相关模块(apollo-adminservice、apollo-biz、apollo-common、apollo-configservice、apollo-portal、apollo-audit、apollo-assembly等),客户端模块已不在其中。
适用前提说明:如果你的项目之前直接依赖主仓库中的apollo-client,升级到 2.1.0 后需要从新的 apollo-java 仓库获取对应产物;Maven 坐标保持不变,但源码出处发生了变化。同理,apollo-demo、scripts/docker-quick-start与scripts/apollo-on-kubernetes也被移出了主仓库(PR #4440)。
2.3 支持以数据库作为服务注册中心(PR #4595)
这是 2.1.0 中最有实用价值的新特性:除 Eureka、Consul、Zookeeper、Nacos、Kubernetes 之外,Apollo 服务端支持直接以数据库作为服务实例注册与发现的介质。
实现位于apollo-biz模块的 registry 包中,核心类包括 DatabaseServiceRegistry、DatabaseServiceRegistryImpl 与 DatabaseDiscoveryClientImpl,自动装配入口为 ApolloServiceRegistryAutoConfiguration。相关的注册心跳、注销等生命周期逻辑由ApolloServiceRegistryHeartbeatApplicationRunner、ApolloServiceRegistryDeregisterApplicationListener等组件承载,并有对应的集成测试(DatabaseDiscoveryIntegrationTest)覆盖。
数据库注册模式下实际启用的配置见 application-database-discovery.properties,关键参数如下:
eureka.client.enabled=false spring.cloud.discovery.enabled=false apollo.service.registry.enabled=true apollo.service.registry.cluster=default apollo.service.registry.heartbeat-in-second=10即关闭 Eureka 与默认的服务发现后,通过apollo.service.registry.*三个配置启用数据库注册:enabled开关、cluster所属集群、heartbeat-interval-in-second心跳间隔(默认 10 秒)。configservice 侧存在同名配置 application-database-discovery.properties,两个服务端组件需一致配置。
2.4 配置文件位置重构(PR #4637)
app.properties被移除,部分配置文件调整了存放位置。这意味着 2.1.0 前后的部署包内配置文件布局不兼容,二次部署与定制打包时需要按新布局核对脚本与资源路径。
三、OpenAPI 与 Portal 功能增强
3.1 OpenAPI 缺陷修复
2.1.0 修复了多个 OpenAPI 边界场景问题:
- PR #4424:OpenAPI 的 key 参数中包含
a[0]这类形如数组下标的字符时触发 400 错误。这类问题通常与 Spring 对a[0]形式请求参数的解析方式有关,修复后 key 中可安全携带方括号语法。 - PR #4549:修复 OpenAPI 中 URL 含非法 key 时返回 400 的问题。
- PR #4596:修复 OpenAPI 返回的 namespace 信息中混入已删除配置项(deleted items)的问题,保证接口返回的数据只包含有效项。
3.2 新增分页加载配置项接口(PR #4468)
针对大型 Namespace(配置项数量多)场景,2.1.0 新增了分页加载 items 的 API,配合 OpenAPI 平台(源码位于apollo-portal的openapi包,含v1版本控制器)使用,可以避免一次性拉取全量配置项造成的响应过大问题。
3.3 Portal 页面与交互增强
- PR #4459:配置项比较(diff)界面支持按 Key 搜索,便于在大配置量中快速定位差异项;对应后端入口可参见 ItemController 中的 diff 相关接口。
- PR #4437:允许一次操作关联多个公共 Namespace。
- PR #4464:为 Portal 增加更友好的用户管理页面。
- PR #4592:为 Portal 增加更友好的配置管理页面。
- PR #4499:允许用户删除 AppNamespace,补齐了此前只能软删除的短板。
- PR #4436:优化开放平台授权管理(AccessKey 管理)的 UI 体验,对应 AccessKeyController。
- PR #4680:Portal-UI 增加了对 ApolloConfigDB 中 serverConfig 的配置管理能力。
3.4 配置值校验能力(PR #4519、#4542)
2.1.0 引入了两层配置值校验:一是针对 JSON 类型配置的潜在值合法性检查(#4519),二是 Item 值的基础类型检查(#4542)。这减少了因粘贴错误 JSON 或类型不符的值导致客户端解析失败的情况。
四、安全与认证机制
- PR #4663:为 Eureka 启用登录认证。此前 Eureka 端点默认不校验身份,在公网或内网共享环境下存在实例信息泄露风险;启用后可与 Portal 的认证体系配合使用。
- PR #4428:优化 Spring-Security Firewall 拒绝请求的响应,避免被拦截请求一律返回难以排查的 400,提升排障可读性。
- PR #4484:spring-session 序列化模式切换为 JSON。该变更是为了兼容 spring-security 的版本升级——旧的二进制序列化方式在新版本下容易出现
ClassNotFoundException,切换 JSON 后会话数据更透明、也更易跨版本兼容。可参考 Portal 的 application.yml 中spring.session.store-type: jdbc等会话相关配置。 - PR #4507:支持自定义 OIDC 登录的 userDisplayName。仓库中提供了 OIDC 登录的样例配置 application-oidc-sample.yml,LDAP 场景同样有多份样例配置(Active Directory、ApacheDS、OpenLDAP)可参考。
五、数据库与性能
5.1 ReleaseHistory 表新增索引(PR #4550)
2.1.0 为ReleaseHistory表补充了索引。从当前仓库的建表脚本 apolloconfigdb.sql 可以确认,该表最终形态包含四个二级索引:IX_Namespace(AppId, ClusterName, NamespaceName, BranchName)、IX_ReleaseId(ReleaseId)、IX_DataChange_LastTime(DataChange_LastTime)、IX_PreviousReleaseId(PreviousReleaseId)。这些索引直接服务于发布历史的查询、回滚(依赖PreviousReleaseId链)与灰度发布场景下的历史追溯。
5.2 其他数据库相关变更
- PR #4473:优化
/apps/{appId}/envs/{env}/clusters/{clusterName}/namespaces接口查询性能。该接口是 Portal 打开配置页面时的高频查询,优化对大租户环境下的 Portal 响应速度有明显帮助。 - PR #4425:升级 mysql-connector-java 版本,修复可能出现的事务回滚失败问题。事务回滚失败属于较隐蔽但影响严重的问题(回滚本身失败会导致数据处于不一致的中间状态),升级驱动是必要操作。
- PR #4493:修复软删除记录的
deletedAt时间戳问题,保证DataChange_LastTime/DeletedAt语义正确,依赖软删除审计的二次开发场景可以关注。
六、灰度发布修复
灰度发布是 Apollo 的核心发布能力(相关文档见 灰度发布设计 配套的设计文档目录),2.1.0 修复了两类问题:
- PR #4564:修复在灰度发布状态下执行发布/回滚时抛出的异常,保证灰度分支与主分支的发布互操作不再出错。
- PR #4622:修复灰度发布中 Item 值的长度限制无法与主版本同步的问题,避免灰度项编辑时长度校验行为与主分支不一致。
七、部署与运行环境
- PR #4475:更换 Docker 基础镜像。原
openjdk:8-jre-alpine在部分平台上会错误识别 CPU 核数(Alpine 的 musl 与 Java 8 组合下的已知问题),修复后依赖Runtime.availableProcessors的线程池配置可以拿到正确值。 - PR #4685:新增通过 GitHub Actions 自动发布 Docker 镜像的流水线,官方镜像发布流程更透明。
- PR #4616:允许在不重新构建项目的前提下变更
spring.profiles.active的值,降低了多环境切换的发布成本。 - PR #4590:新增 Node.js 客户端 SDK 并修复相关文档,官方多语言客户端矩阵扩展至 Node.js,文档见 nodejs-sdks-user-guide.md。
- PR #4662:修复删除空白配置项时末尾出现空行的问题;PR #4568:修复创建带单个点号的 Namespace 名称时返回 500 的问题。
八、升级 2.1.0 的核对清单
基于以上变更,从 2.0.x 升级到 2.1.0 时建议逐项核对:
- 数据库:执行
scripts/sql/profiles下对应数据库类型的增量脚本(如 v220→v230),确认ReleaseHistory索引已建立; - 依赖来源:确认 Java 客户端(
apollo-client等)改从独立仓库/产物获取,主仓库中已无这些模块; - 配置布局:按 PR #4637 调整后的配置文件位置核对部署包,
app.properties已不存在; - 服务发现:若计划用数据库注册模式,按 application-database-discovery.properties 配置
apollo.service.registry.enabled/cluster/heartbeat-interval-in-second,并保持 adminservice 与 configservice 两侧一致; - 安全项:评估开启 Eureka 登录认证(#4663),并确认 spring-session JSON 序列化切换对既有会话无影响(#4484);
- 驱动版本:确认 mysql-connector-java 随 2.1.0 一并升级,规避事务回滚失败问题(#4425)。
适用前提与限制:本文所有结论均基于当前仓库中 2.1.0 版本的内容;PR 编号用于对照官方变更清单(见 changes/changes-2.1.0.md),完整的 issue 与 PR 上下文以官方 milestone 汇总为准。
【免费下载链接】apolloApollo is a reliable configuration management system suitable for microservice configuration management scenarios.项目地址: https://gitcode.com/gh_mirrors/apoll/apollo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考