在 apollo-portal 项目中,
com.ctrip.framework.apollo.portal.service.ClusterService ,提供 Cluster 的 Service 逻辑。
#createCluster(Env, ClusterDTO) 方法,创建并保存 Cluster 到 Admin Service 。代码如下:
1: @Autowired
2: private AdminServiceAPI.ClusterAPI clusterAPI;
3:
4: public ClusterDTO createCluster(Env env, ClusterDTO cluster) {
5: // 根据 `appId` 和 `name` 校验 Cluster 的唯一性
6: if (!clusterAPI.isClusterUnique(cluster.getAppId(), env, cluster.getName())) {
7: throw new BadRequestException(String.format(“cluster %s already exists.”, cluster.getName()));
8: }
9: // 创建 Cluster 到 Admin Service
10: ClusterDTO clusterDTO = clusterAPI.create(env, cluster);
11: // 【TODO 6001】Tracer 日志
12: Tracer.logEvent(TracerEventType.CREATE_CLUSTER, cluster.getAppId(), “0”, cluster.getName());
13: return clusterDTO;
14: }
-
第 5 至 8 行:调用 ClusterAPI#isClusterUnique(appId, Env, clusterName) 方法,根据 appId和 name 校验 Cluster 的唯一性。注意,此处是远程调用 Admin Service 的 API 。
-
第 10 行:调用 ClusterAPI#create(Env, ClusterDTO) 方法,创建 Cluster 到 Admin Service 。
-
第 12 行:【TODO 6001】Tracer 日志
3.3 ClusterAPI
com.ctrip.framework.apollo.portal.api.ClusterAPI ,实现 API 抽象类,封装对 Admin Service 的 Cluster 模块的 API 调用。代码如下:
ClusterAPI
4. Admin Service 侧
=======================
4.1 ClusterController
在 apollo-adminservice 项目中,
com.ctrip.framework.apollo.adminservice.controller.ClusterController ,提供 Cluster 的 API 。
#create(appId,
autoCreatePrivateNamespace, ClusterDTO) 方法,创建 Cluster 。代码如下:
@RestController
1: public class ClusterController {
2:
3: @Autowired
4: private ClusterService clusterService;
5:
6: @RequestMapping(path = “/apps/{appId}/clusters”, method = RequestMethod.POST)
7: public ClusterDTO create(@PathVariable(“appId”) String appId,
8: @RequestParam(value = “autoCreatePrivateNamespace”, defaultValue = “true”) boolean autoCreatePrivateNamespace,
9: @RequestBody ClusterDTO dto) {
10: // 校验 ClusterDTO 的 `name` 格式正确。
11: if (!InputValidator.isValidClusterNamespace(dto.getName())) {
12: throw new BadRequestException(String.format(“Cluster格式错误: %s”, InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
13: }
14: // 将 ClusterDTO 转换成 Cluster 对象
15: Cluster entity = BeanUtils.transfrom(Cluster.class, dto);
16: // 判断 `name` 在 App 下是否已经存在对应的 Cluster 对象。若已经存在,抛出 BadRequestException 异常。
17: Cluster managedEntity = clusterService.findOne(appId, entity.getName());
18: if (managedEntity != null) {
19: throw new BadRequestException(“cluster already exist.”);
20: }
21: // 保存 Cluster 对象,并创建其 Namespace
22: if (autoCreatePrivateNamespace) {
23: entity = clusterService.saveWithInstanceOfAppNamespaces(entity);
24: // 保存 Cluster 对象,不创建其 Namespace
25: } else {
26: entity = clusterService.saveWithoutInstanceOfAppNamespaces(entity);
27: }
28: // 将保存的 Cluster 对象转换成 ClusterDTO
29: dto = BeanUtils.transfrom(ClusterDTO.class, entity);
30: return dto;
31: }
32:
33: // … 省略其他接口和属性
34: }
-
POST `/apps/{appId}/clusters` 接口,Request Body 传递 JSON 对象。
-
第 10 至 13 行:调用 InputValidator#isValidClusterNamespace(name) 方法,校验 ClusterDTO 的 name 格式正确,符合 [0-9a-zA-Z_.-]+" 格式。
-
第 15 行:调用 BeanUtils#transfrom(Class clazz, Object src) 方法,将 ClusterDTO 转换成 Cluster 对象。
-
第 16 至 20 行:调用 ClusterService#findOne(appId, name) 方法,校验 name 在 App 下,是否已经存在对应的 Cluster 对象。若已经存在,抛出 BadRequestException 异常。
-
第 21 至 23 行:若 autoCreatePrivateNamespace = true 时,调用 ClusterService#saveWithInstanceOfAppNamespaces(Cluster) 方法,保存 Cluster 对象,并创建其 Namespace 。
-
第 24 至 27 行:若 autoCreatePrivateNamespace = false 时,调用 ClusterService#saveWithoutInstanceOfAppNamespaces(Cluster) 方法,保存 Cluster 对象,不创建其 Namespace 。
-
第 29 行:调用 BeanUtils#transfrom(Class clazz, Object src) 方法,将 Cluster 转换成 ClusterDTO 对象。
4.2 ClusterService
在 apollo-biz 项目中,
com.ctrip.framework.apollo.biz.service.ClusterService ,提供 Cluster 的 Service 逻辑给 Admin Service 和 Config Service 。
saveWithInstanceOfAppNamespaces(Cluster) 方法,保存 Cluster 对象,并创建其 Namespace 。代码如下:
1: @Autowired
2: private ClusterRepository clusterRepository;
3: @Autowired
4: private AuditService auditService;
5: @Autowired
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
文末
我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份PDF文档
- 第一个要分享给大家的就是算法和数据结构
- 第二个就是数据库的高频知识点与性能优化
- 第三个则是并发编程(72个知识点学习)
- 最后一个是各大JAVA架构专题的面试点+解析+我的一些学习的书籍资料
还有更多的Redis、MySQL、JVM、Kafka、微服务、Spring全家桶等学习笔记这里就不一一列举出来
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算