写点什么

微服务配置中心 Apollo 解析——Portal 关联 Namespace

  • 2021 年 11 月 12 日
  • 本文字数:2759 字

    阅读完需:约 9 分钟


流程


老艿艿:因为 Portal 是管理后台,所以从代码实现上,和业务系统非常相像。也因此,本文会略显啰嗦。


2. Portal 侧


================


2.1 NamespaceController


在 apollo-portal 项目中,


com.ctrip.framework.apollo.portal.controller.NamespaceController ,提供 AppNamespace 和 Namespace 的?API?。


关联 Namespace 的界面中,点击【提交】按钮,调用创建 Namespace 的 API?。



关联 Namespace


  • 公用类型的 Namespace 的名字全局唯一,所以关联时,只需要查看名字即可。


#createNamespace(appId, List<NamespaceCreationM


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


odel>) 方法,创建 Namespace 对象,支持多个?Namespace 。代码如下:


1: @Autowired


2: private UserInfoHolder userInfoHolder;


3: @Autowired


4: private NamespaceService namespaceService;


5: @Autowired


6: private RoleInitializationService roleInitializationService;


7:


8: @PreAuthorize(value = "@permissionValidator.hasCreateNamespacePermission(#appId)")


9: @RequestMapping(value = "/apps/{appId}/namespaces", method = RequestMethod.POST)


10: public ResponseEntity<Void> createNamespace(@PathVariable String appId,


11: @RequestBody List<NamespaceCreationModel> models) {


12: // 校验 `models` 非空


13: checkModel(!CollectionUtils.isEmpty(models));


14: // 初始化 Namespace 的 Role 们


15: String namespaceName = models.get(0).getNamespace().getNamespaceName();


16: String operator = userInfoHolder.getUser().getUserId();


17: roleInitializationService.initNamespaceRoles(appId, namespaceName, operator);


18: // 循环 `models` ,创建 Namespace 对象


19: for (NamespaceCreationModel model : models) {


20: NamespaceDTO namespace = model.getNamespace();


21: // 校验相关参数非空


22: RequestPrecondition.checkArgumentsNotEmpty(model.getEnv(), namespace.getAppId(), namespace.getClusterName(), namespace.getNamespaceName());


23: // 创建 Namespace 对象


24: try {


25: namespaceService.createNamespace(Env.valueOf(model.getEnv()), namespace);


26: } catch (Exception e) {


27: logger.error("create namespace fail.", e);


28: Tracer.logError(String.format("create namespace fail. (env=%s namespace=%s)", model.getEnv(), namespace.getNamespaceName()), e);


29: }


30: }


31: // 授予 Namespace Role 给当前管理员


32: assignNamespaceRoleToOperator(appId, namespaceName);


33: return ResponseEntity.ok().build();


34: }


  • POST `/apps/{appId}/namespaces` 接口,Request Body 传递?JSON?对象。

  • @PreAuthorize(…) 注解,调用 PermissionValidator#hasCreateNamespacePermission(appId) 方法,校验是否有创建 Namespace 的权限。后续文章,详细分享。

  • com.ctrip.framework.apollo.portal.entity.model.NamespaceCreationModel ,Namespace 创建 Model 。代码如下:


public class NamespaceCreationModel {


/**


* 环境


*/


private String env;


/**


* Namespace 信息


*/


private NamespaceDTO namespace;


}


  • com.ctrip.framework.apollo.common.dto.NamespaceDTO ,Namespace DTO 。代码如下:


public class NamespaceDTO extends BaseDTO {


private long id;


/**


* App 编号


*/


private String appId;


/**


* Cluster 名字


*/


private String clusterName;


/**


* Namespace 名字


*/


private String namespaceName;


}


  • x

  • 第 13 行:校验 models 非空。

  • 第 14 至 17 行:初始化 Namespace 的 Role 们。详解解析,见 《Apollo 源码解析 —— Portal 认证与授权(二)之授权》 。

  • 第 18 至 30 行:循环 models ,创建 Namespace 对象们。

  • 第 22 行:调用 RequestPrecondition#checkArgumentsNotEmpty(String… args) 方法,校验 NamespaceDTO 的 env appId clusterName namespaceName 非空。

  • 第 25 行:调用 NamespaceService#createNamespace(Env, NamespaceDTO) 方法,创建并保存 Namespace 到 Admin Service 中。

  • 第 26 至 29 行:当发生异常时,即创建失败,仅打印异常日志。也就是说,在 【第 33 行】,依然提示创建 Namespace 成功。

  • 第 32 行:授予 Namespace Role 给当前管理员。详解解析,见 《Apollo 源码解析 —— Portal 认证与授权(二)之授权》 。


2.2 NamespaceService


在 apollo-portal 项目中,


com.ctrip.framework.apollo.portal.service.NamespaceService ,提供 Namespace 的?Service?逻辑。


#createNamespace(Env env, NamespaceDTO namespace) 方法,保存 Namespace 对象到 Admin Service 中。代码如下:


1: @Autowired


2: private UserInfoHolder userInfoHolder;


3: @Autowired


4: private AdminServiceAPI.NamespaceAPI namespaceAPI;


5:


6: public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) {


7: // 设置 NamespaceDTO 的创建和修改人为当前管理员


8: if (StringUtils.isEmpty(namespace.getDataChangeCreatedBy())) {


9: namespace.setDataChangeCreatedBy(userInfoHolder.getUser().getUserId());


10: }


11: namespace.setDataChangeLastModifiedBy(userInfoHolder.getUser().getUserId());


12: // 创建 Namespace 到 Admin Service


13: NamespaceDTO createdNamespace = namespaceAPI.createNamespace(env, namespace);


14: // 【TODO 6001】Tracer 日志


15: Tracer.logEvent(TracerEventType.CREATE_NAMESPACE, String.format("%s+%s+%s+%s", namespace.getAppId(), env, namespace.getClusterName(), namespace.getNamespaceName()));


16: return createdNamespace;


17: }


  • 第 7 至 11 行:设置?NamespaceDTO 的创建和修改人。

  • 第 13 行:调用 NamespaceAPI#createNamespace(Env, NamespaceDTO) 方法,创建 Namespace 到 Admin Service 。

  • 第 15 行:【TODO 6001】Tracer 日志


2.3 NamespaceAPI


com.ctrip.framework.apollo.portal.api.NamespaceAPI ,实现 API 抽象类,封装对 Admin Service 的 AppNamespace 和 Namespace?两个模块的 API 调用。代码如下:



NamespaceAPI


  • 使用 restTemplate ,调用对应的 API 接口。


3. Admin Service 侧


=======================


3.1 NamespaceController


在 apollo-adminservice 项目中,


com.ctrip.framework.apollo.adminservice.controller.NamespaceController ,提供 Namespace 的?API?。


#create(appId, clusterName, NamespaceDTO) 方法,创建 Namespace 。代码如下:


1: @RestController


2: public class NamespaceController {


3:


4: @Autowired


5: private NamespaceService namespaceService;


6:


7: /**


8: * 创建 Namespace

评论

发布
暂无评论
微服务配置中心 Apollo解析——Portal 关联 Namespace