- 1. 概述
- 2. 实体
- 2.1 Item
- 2.2 Commit
- 3. Portal 侧
- 3.1 ItemController
- 3.2 ItemService
- 3.3 ItemAPI
- 4. Admin Service 侧
- 4.1 ItemController
- 4.2 ItemService
- 4.3 ItemRepository
- 4.4 CommitService
- 4.5 CommitRepository
- 666. 彩蛋
1. 概述
老艿艿:本系列假定胖友已经阅读过 《Apollo 官方 wiki 文档》 。
Item ,配置项,是 Namespace 下最小颗粒度的单位。在 Namespace 分成五种类型:properties yml yamljson xml 。其中:
- `properties` :每一行配置对应一条 Item 记录。
- 后四者:无法进行拆分,所以一个 Namespace 仅仅对应一条 Item 记录。
本文先分享 Portal 创建类型为 properties 的 Namespace 的 Item 的流程,整个过程涉及 Portal、Admin Service ,如下图所示:
流程
老艿艿:因为 Portal 是管理后台,所以从代码实现上,和业务系统非常相像。也因此,本文会略显啰嗦。
2. 实体
2.1 Item
com.ctrip.framework.apollo.biz.entity.Item ,继承 BaseEntity 抽象类,Item 实体。代码如下:
@Entity @Table(name = "Item") @SQLDelete(sql = "Update Item set isDeleted = 1 where id = ?") @Where(clause = "isDeleted = 0") public class Item extends BaseEntity { /** * Namespace 编号 */ @Column(name = "NamespaceId", nullable = false) private long namespaceId; /** * 键 */ @Column(name = "key", nullable = false) private String key; /** * 值 */ @Column(name = "value") @Lob private String value; /** * 注释 */ @Column(name = "comment") private String comment; /** * 行号,从一开始。 * * 例如 Properties 中,多个配置项。每个配置项对应一行。 */ @Column(name = "LineNum") private Integer lineNum; }
- namespaceId 字段,Namespace 编号,指向对应的 Namespace 记录。
- key 字段,键。
- 对于 `properties` ,使用 Item 的 `key` ,对应每条配置项的键。
- 对于 `yaml` 等等,使用 Item 的 `key = content` ,对应整个配置文件。
- lineNum 字段,行号,从一开始。主要用于 properties 类型的配置文件。
2.2 Commit
com.ctrip.framework.apollo.biz.entity.Commit ,继承 BaseEntity 抽象类,Commit 实体,记录 Item 的 KV 变更历史。代码如下:
@Entity @Table(name = "Commit") @SQLDelete(sql = "Update Commit set isDeleted = 1 where id = ?") @Where(clause = "isDeleted = 0") public class Commit extends BaseEntity { /** * App 编号 */ @Column(name = "AppId", nullable = false) private String appId; /** * Cluster 名字 */ @Column(name = "ClusterName", nullable = false) private String clusterName; /** * Namespace 名字 */ @Column(name = "NamespaceName", nullable = false) private String namespaceName; /** * 变更集合。 * * JSON 格式化,使用 {@link com.ctrip.framework.apollo.biz.utils.ConfigChangeContentBuilder} 生成 */ @Lob @Column(name = "ChangeSets", nullable = false) private String changeSets; /** * 备注 */ @Column(name = "Comment") private String comment; }
- appId + clusterName + namespaceName 字段,可以确认唯一 Namespace 记录。
- changeSets 字段,Item 变更集合。JSON 格式化字符串,使用 ConfigChangeContentBuilder 构建。
2.2.1 ConfigChangeContentBuilder
com.ctrip.framework.apollo.biz.utils.ConfigChangeContentBuilder ,配置变更内容构建器。