微服务配置中心 Apollo 解析——Portal 创建 Item

本文深入解析 Apollo 配置中心如何创建 properties 类型的配置项(Item),涉及 Portal 和 Admin Service 两个组件的交互流程,包括 Item 和 Commit 实体,以及创建 Item 的关键服务和控制器操作。通过分析代码,阐述了配置变更的历史记录(Commit)以及权限验证等关键点。
摘要由CSDN通过智能技术生成
  • 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 ,如下图所示:

微服务配置中心 Apollo 源码解析——Portal 创建 Item

流程

老艿艿:因为 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 ,配置变更内容构建器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值