-
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
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-5TdYFxqO-1712437800723)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!