点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/Apollo/portal-create-namespace/ 「芋道源码」欢迎转载,保留摘要,谢谢!
1. 概述
2. 实体
3. Portal 侧
4. Admin Service 侧
666. 彩蛋
阅读源码最好的方式,是使用 IDEA 进行调试 Apollo 源码,不然会一脸懵逼。
胖友可以点击「芋道源码」扫码关注,回复 git018 关键字
获得艿艿添加了中文注释的 Apollo 源码地址。阅读源码很孤单,加入源码交流群,一起坚持!
1. 概述
老艿艿:本系列假定胖友已经阅读过 《Apollo 官方 wiki 文档》 ,特别是 《Apollo 官方 wiki 文档 —— 核心概念之“Namespace”》 。
本文分享 Portal 创建 Namespace 的流程,整个过程涉及 Portal、Admin Service ,如下图所示:
下面,我们先来看看 AppNamespace 和 Namespace 的实体结构
老艿艿:因为 Portal 是管理后台,所以从代码实现上,和业务系统非常相像。也因此,本文会略显啰嗦。
2. 实体
2.1 AppNamespace
在 apollo-common
项目中,com.ctrip.framework.apollo.common.entity.AppNamespace
,继承 BaseEntity 抽象类,App Namespace 实体。代码如下:
@Entity
@Table(name = "AppNamespace")
@SQLDelete(sql = "Update AppNamespace set isDeleted = 1 where id = ?")
@Where(clause = "isDeleted = 0")
public class AppNamespace extends BaseEntity {
/**
* AppNamespace 名
*/
@Column(name = "Name", nullable = false)
private String name;
/**
* App 编号
*/
@Column(name = "AppId", nullable = false)
private String appId;
/**
* 格式
*
* 参见 {@link ConfigFileFormat}
*/
@Column(name = "Format", nullable = false)
private String format;
/**
* 是否公用的
*/
@Column(name = "IsPublic", columnDefinition = "Bit default '0'")
private boolean isPublic = false;
/**
* 备注
*/
@Column(name = "Comment")
private String comment;
}
appId
字段,App 编号,指向对应的 App 。App : AppNamespace = 1 : N 。format
字段,格式。在com.ctrip.framework.apollo.core.enums.ConfigFileFormat
枚举类中,定义了五种类型。代码如下:public enum ConfigFileFormat { Properties("properties"), XML("xml"), JSON("json"), YML("yml"), YAML("yaml"); private String value; // ... 省略了无关的代码 }
isPublic
字段,是否公用的。Namespace的获取权限分为两种:
这里的获取权限是相对于 Apollo 客户端来说的。
-
private (私有的):private 权限的 Namespace ,只能被所属的应用获取到。一个应用尝试获取其它应用 private 的 Namespace ,Apollo 会报 “404” 异常。
public (公共的):public 权限的 Namespace ,能被任何应用获取。
2.2 Namespace
在 apollo-biz
项目中, com.ctrip.framework.apollo.biz.entity.Namespace
,继承 BaseEntity 抽象类,Cluster Namespace 实体,是配置项的集合,类似于一个配置文件的概念。代码如下:
@Entity
@Table(name = "Namespace")
@SQLDelete(sql = "Update Namespace set isDeleted = 1 where id = ?")
@Where(clause = "isDeleted = 0")
public class Namespace extends BaseEntity {
/**
* App 编号 {@link com.ctrip.framework.apollo.common.entity.App#appId}
*/
@Column(name = "appId", nullable = false)
private String appId;
/**
* Cluster 名 {@link Cluster#name}
*/
@Column(name = "ClusterName", nullable = false)
private String clusterName;
/**
* AppNamespace 名 {@link com.ctrip.framework.apollo.common.entity.AppNamespace#name}
*/
@Column(name = "NamespaceName", nullable = false)
private String namespaceName;
}
2.3 AppNamespace vs. Namespace
关系图如下: