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

  • 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 调用。代码如下:

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

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

9: *

10: * @param appId App 编号

11: * @param clusterName Cluster 名字

12: * @param dto NamespaceDTO 对象

13: * @return 创建成功的 NamespaceDTO 对象

14: */

15: @RequestMapping(path = “/apps/{appId}/clusters/{clusterName}/namespaces”, method = RequestMethod.POST)

16: public NamespaceDTO create(@PathVariable(“appId”) String appId,

17: @PathVariable(“clusterName”) String clusterName, @RequestBody NamespaceDTO dto) {

18: // 校验 NamespaceDTO 的 `namespaceName` 格式正确。

19: if (!InputValidator.isValidClusterNamespace(dto.getNamespaceName())) {

20: throw new BadRequestException(String.format(“Namespace格式错误: %s”, InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));

21: }

22: // 将 NamespaceDTO 转换成 Namespace 对象

23: Namespace entity = BeanUtils.transfrom(Namespace.class, dto);

24: // 判断 `name` 在 Cluster 下是否已经存在对应的 Namespace 对象。若已经存在,抛出 BadRequestException 异常。

25: Namespace managedEntity = namespaceService.findOne(appId, clusterName, entity.getNamespaceName());

26: if (managedEntity != null) {

27: throw new BadRequestException(“namespace already exist.”);

28: }

29: // 保存 Namespace 对象

30: entity = namespaceService.save(entity);

31: // 将保存的 Namespace 对象转换成 NamespaceDTO

32: dto = BeanUtils.transfrom(NamespaceDTO.class, entity);

33: return dto;

34: }

35:

36: // … 省略其他接口和属性

37: }

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

  • 第 18 至 21 行:调用 InputValidator#isValidClusterNamespace(name) 方法,校验NamespaceDTO 的 namespaceName 格式正确,符合 [0-9a-zA-Z_.-]+" 格式。

  • 第 23 行:调用 BeanUtils#transfrom(Class clazz, Object src) 方法,将 NamespaceDTO 转换成 Namespace 对象。

  • 第 20 至 23 行:调用 NamespaceService#findOne(appId, clusterName, namespaceName) 方法,校验 name 在 Cluster 下是否已经存在对应的 Namespace 对象。若已经存在,抛出 BadRequestException 异常。

  • 第 30 行:调用 NamespaceService#save(Namespace) 方法,保存 Namespace 对象到数据库。

  • 第 30 至 32 行:调用 BeanUtils#transfrom(Class clazz, Object src) 方法,将保存的 Namespace 对象,转换成 NamespaceDTO 返回。

3.2 NamespaceService

在 《Apollo 源码解析 —— Portal 创建 Namespace》 的 「4.4 NamespaceService」 ,已经详细解析。

3.3 NamespaceRepository

在 《Apollo 源码解析 —— Portal 创建 Namespace》 的 「4.5 NamespaceRepository」 ,已经详细解析。

666. 彩蛋

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

有点水更,写的自己都不好意思了。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-5TdYFxqO-1712437800723)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值