Apollo浅解3

目录

Namespace

Item

Namespace与Item

Namespace修改

界面操作

存储逻辑

更新Item

创建Item 

 删除Item

Namespace发布

界面操作

 存储逻辑

发布版本

发布顺序

题外


Namespace

Namespace是配置项的集合,类似于一个配置文件的概念。官网解释的更为全面,具体参看

Apollo核心概念之“Namespace” (apolloconfig.com)

Namespace对应的ApolloConfigDB 的Namespace表结构如下

其中NamespaceName字段取值规律如下

  • Namespace的类型为properties时,取值为“名字”
  • Namespace的类型为非properties时,取值为“名字.类型”,例如flowCtrl.yml

索引信息如下 

Namespace表唯一索引是包含AppId、ClusterName、NamespaceName字段,表明Namespace字段是

  • 应用隔离:不同应用的同名Namespace对应俩条不同的记录,是俩个不同的Namespace,配置项和值都可以不一致
  • 集群隔离:同应用的不同集群的同名Namespace对应俩条不同的记录,是俩个不同的Namespace,配置项和值都可以不一致。但由于同属同一个AppNamespace,命名空间的类型(Format)是一致的

Item

配置文件可以存储多个配置,每个配置称为配置项。Namespace对应配置文件的概念,那么配置项就对应Item,包括key,value字段,以键值对的形式存储配置,记录配置最新的值。对应ApolloConfigDB.Item表

 每条Item记录通过NamespaceId与Namespace关联,一个Item只属于一个Namespace,一个Namespace可以拥有多个Item。

其中key的取值规律为

  • 关联当Namespace的类型非properties时,key值默认为content,例如上图中Id为3的Item记录,对应的Namespace类型为xml
  • 当Namespace的类型为properties时,key取值为配置项名称

LineNum字段表示,当前item在关联的Namespace中配置项的排序位置。下图Item adress、name、sex的lineNum值分别为1、2、3

Namespace与Item

一个Item只属于一个Namespace,一个Namespace可以拥有多个Item,通过在ApolloConfigDB.Item表中的NamespaceId建立item与Namespace关联关系。查询应用下所有Item的sql如下

SELECT
	t.AppId,
	t.ClusterName,
	t.NamespaceName,
	t1.NamespaceId,
	t1.Id AS itemId,
	t1.LineNum,
	t1.`Key`,
	t1.`Value`
FROM
	ApolloConfigDB.Namespace t,
	ApolloConfigDB.Item t1
WHERE
	t.Id = t1.NamespaceId
AND t.IsDeleted = 0
AND t1.IsDeleted = 0
ORDER BY
	t.AppId,
	t1.NamespaceId,
	t1.LineNum

执行结果如下

Namespace修改

界面操作

对Namespace修改其实是对Namespace关联的某个Item修改。修改过程中系统会记录修改的历史记录。portalUI中命名空间的【更改历史】可以查看。

 包括更改类型、被修改的Item的key、旧值、新值、说明。

存储逻辑

修改历史是如何存储的呢?存储在ApolloConfigDB.Commit表中

 记录是以命名空间为单位,通过AppId、ClusterName、NamespaceName来定位到唯一的命名空间,ChangeSets字段以json对象记录本次修改中变动的Item数据,包括三部分

  • "createItems":[],记录新增Item数组     
  • "updateItems":[],记录更新的Item数组 
  • "deleteItems":[],记录删除的Item数组 

更新Item

更新Item sex的值为female2,并且增加说明“this is comment”

commit表新增记录的ChangeSets值如下,包含了Item sex修改前和修改后的对应ApolloConfigDB.Item表里的记录

{
"createItems":[],
"updateItems":[
		{
		"oldItem":{"namespaceId":1,"key":"sex","value":"female","lineNum":3,"id":18,"isDeleted":false,"deletedAt":0,"dataChangeCreatedBy":"apollo","dataChangeCreatedTime":"2022-12-28 20:24:40","dataChangeLastModifiedBy":"apollo","dataChangeLastModifiedTime":"2022-12-28 20:24:40"},
		"newItem":{"namespaceId":1,"key":"sex","value":"female2","comment":"this is comment","lineNum":3,"id":18,"isDeleted":false,"deletedAt":1672483560987,"dataChangeCreatedBy":"apollo","dataChangeCreatedTime":"2022-12-28 20:24:40","dataChangeLastModifiedBy":"apollo","dataChangeLastModifiedTime":"2022-12-31 18:46:01"}
		}
	      ],
"deleteItems":[]
}

创建Item 

新增Item nickname,commit表新增记录的ChangeSets值如下,包含了新增的item对应ApolloConfigDB.Item表里的记录

{
"createItems":[
		{
		  "namespaceId":7,"key":"nickname","value":"大王","lineNum":1,"id":23,"isDeleted":false,"deletedAt":0,"dataChangeCreatedBy":"apollo","dataChangeCreatedTime":"2022-12-31 15:16:43","dataChangeLastModifiedBy":"apollo","dataChangeLastModifiedTime":"2022-12-31 15:16:43"
		}
	      ],
"updateItems":[],
"deleteItems":[]
}

 删除Item

删除Item address,commit表新增记录的ChangeSets值如下,包含了删除的item对应ApolloConfigDB.Item表里的记录

{
"createItems":[],
"updateItems":[],
"deleteItems":[
		{
		  "namespaceId":1,"key":"address","value":"HaiXiaDaDao88Hao,nanjingbank,pukou","comment":"","lineNum":1,"id":1,"isDeleted":true,"deletedAt":1672485861879,"dataChangeCreatedBy":"apollo","dataChangeCreatedTime":"2022-05-15 13:28:20","dataChangeLastModifiedBy":"apollo","dataChangeLastModifiedTime":"2022-12-31 19:24:21"
		}
	          ]
}

Namespace发布

界面操作

 Namespace的发布是以命名空间为单位,发布特定命名空间后,该命名空间包含的所有Item都会被发布。发布历史可以在portalUI中命名空间的右上角【发布历史】菜单查看

页面左侧记录了该命名空间发布记录,页面右侧记录了该命名空间每次发布后的所有Item最新值与本次发布前后存在变动的item的新旧值对比。

存储逻辑

发布版本

发布版本是如何存储的呢?存储在ApolloConfigDB.Release中        

发布版本记录以命名空间为单位,仍然是通过AppId、ClusterName、NamespaceName三个字段确定唯一的命名空间。Configurations字段是以json对象的形式记录本次发布后该命名空间所有Item的值。其他字段均为Apollo常用的表字段。

发布顺序

一个命名空间发布多次后,多个发布版本又是如何记录发布顺序的呢?

发布顺序通过ApolloConfigDB.ReleaseHistory表记录版本依赖来实现

 其中版本依赖的记录以命名空间为单位,仍然是通过AppId、ClusterName、NamespaceName三个字段确定唯一的命名空间。其中ReleaseId记录当前的发布版本id,对应ApolloConfigDB.Release的id字段,PreviousReleaseId字段记录该发布版本依赖的前前一个发布版本id,也对应ApolloConfigDB.Release的id字段。通过这俩个字段实现将发布版本串联起来,展示完整的发布顺序。

 如上图应用4am的application命名空间的发布顺序是0->1->2->3->9->25->28->36,其中0表示最初始的版本历史,无实际意义。对应ApolloConfigDB.Release表记录

题外

其实简单实现方式可以直接通过ApolloConfigDB.Release的t.DataChange_CreatedTime排序即可查看到特定命名空间的发布历史,SQL如下

SELECT
	*
FROM
	ApolloConfigDB. RELEASE t
ORDER BY
	t.AppId,
	t.ClusterName,
	t.NamespaceName,
	t.DataChange_CreatedTime;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值