|
| 1 | +--- |
| 2 | +title: "开源之夏经验分享|SOFARPC 社区郑佳莉:开源的收获不止代码" |
| 3 | +authorlink: "https://github.com/sofastack" |
| 4 | +description: "RPC 动态配置能力是指运行时针对 RPC 相关的配置进行修改,使其能够根据需要动态调整行为,而无需重新启动服务或强制更新客户端应用程序。动态配置能力通常包括动态调整负载均衡策略、重试策略、超时设置、限流和熔断策略、序列化和反序列化配置等。 |
| 5 | +当前 SOFARPC 简单集成了 Apollo 配置中心,期望梳理出 SOFARPC 相关需要支持的动态配置,完善对应的接口维度的动态配置能力。另外,在此基础之上,期望在 SOFARPC 中集成 Nacos、Zookeeper 等作为配置中心,支持对应的动态配置能力。" |
| 6 | +categories: "SOFAStack" |
| 7 | +tags: ["SOFAStack"] |
| 8 | +date: 2024-02-11T15:00:00+08:00 |
| 9 | +cover: "https://img.alicdn.com/imgextra/i2/O1CN01oZDNj71Ri0ChbhCcH_!!6000000002144-0-tps-1216-515.jpg" |
| 10 | +--- |
| 11 | + |
| 12 | +# 开源之夏经验分享|SOFARPC 社区郑佳莉:开源的收获不止代码 |
| 13 | + |
| 14 | +> **文|郑佳莉** |
| 15 | +> 计算机学院研二在读 |
| 16 | +> SOFARPC 社区贡献者 |
| 17 | +> |
| 18 | +> 就读于国防科技大学计算机学院研二。专注 Java 领域,探索基础架构与中间件技术中。 |
| 19 | +> |
| 20 | +> **本文 2476 字,预计阅读 7 分钟** |
| 21 | +
|
| 22 | +今天 SOFAStack 邀请到了开源之夏 2024 SOFARPC 社区的中选学生**郑佳莉**同学!在本项目中,她参与完成了 **SOFARPC 动态配置能力完善**。希望她分享的这段经历,能让更多人了解到 SOFARPC 开源社区,感受开源的魅力~ |
| 23 | + |
| 24 | +**项目链接**:[https://summer-ospp.ac.cn/org/prodetail/2495a0307](https://summer-ospp.ac.cn/org/prodetail/2495a0307) |
| 25 | + |
| 26 | +## 项目信息 |
| 27 | + |
| 28 | +**项目名称**:SOFARPC 动态配置能力完善 |
| 29 | + |
| 30 | +**项目导师**:刘建军 |
| 31 | + |
| 32 | +**项目背景**: |
| 33 | + |
| 34 | +RPC 动态配置能力是指运行时针对 RPC 相关的配置进行修改,使其能够根据需要动态调整行为,而无需重新启动服务或强制更新客户端应用程序。动态配置能力通常包括动态调整负载均衡策略、重试策略、超时设置、限流和熔断策略、序列化和反序列化配置等。 |
| 35 | +当前 SOFARPC 简单集成了 Apollo 配置中心,期望梳理出 SOFARPC 相关需要支持的动态配置,完善对应的接口维度的动态配置能力。另外,在此基础之上,期望在 SOFARPC 中集成 Nacos、Zookeeper 等作为配置中心,支持对应的动态配置能力。 |
| 36 | + |
| 37 | +## 项目实现思路 |
| 38 | + |
| 39 | +### 方案描述 |
| 40 | + |
| 41 | +**SOFARPC 原本的配置情况如下:** |
| 42 | + |
| 43 | +简单集成了 Apollo 作为配置中心; |
| 44 | +仅支持请求维度的动态配置,需要在调用流程中去主动获取对应的配置,支持的配置项包括超时时间和负载均衡策略。 |
| 45 | + |
| 46 | +针对以上两点,改进方案分为以下三部分: |
| 47 | + |
| 48 | +**1、进一步集成 Nacos、Zookeeper 作为配置中心,并在此基础上支持请求维度的动态配置** |
| 49 | + |
| 50 | +各配置中心内,请求维度配置信息的存储结构设计如下图,其中每个配置节点的数据对应着单个配置项的值: |
| 51 | + |
| 52 | + |
| 53 | + |
| 54 | +**2、梳理出 SOFARPC 相关需要支持的动态配置选项** |
| 55 | + |
| 56 | +动态配置选项如下表所示: |
| 57 | + |
| 58 | + |
| 59 | + |
| 60 | +**3、增加接口维度的动态配置能力** |
| 61 | + |
| 62 | +各配置中心内,接口维度配置信息的存储结构设计如下图,其中,每个配置节点中的数据存储格式为 properties,单个配置节点的数据对应着某个接口的多个配置项: |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +动态配置能力通过对配置进行监听来实现,当配置中心中的配置发生变化时,SOFARPC 应自动检测到新的配置并更新到接口配置实例中。 |
| 67 | + |
| 68 | +添加接口维度配置监听器的流程如下: |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +接口维度配置动态更新流程如下: |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | +## 开源之夏个人随访 |
| 77 | + |
| 78 | +### 自我介绍 |
| 79 | + |
| 80 | +大家好,我叫郑佳莉,是国防科技大学计算机学院研二的学生。我日常主要使用 Java 进行开发,对基础架构和中间件技术十分感兴趣。 |
| 81 | + |
| 82 | +这是我第一次参与开源之夏,通过参与 SOFAStack 社区的项目,我得以深入体验开源社区的工作流程和开发过程。 |
| 83 | + |
| 84 | +### 申请本社区项目的原因 |
| 85 | + |
| 86 | +在之前的学习和实践中,我曾参与过一些分布式系统的开发工作,并且,我在学校的分布式计算课程中实现过一个简易的 RPC 框架。通过这些经历,我对 RPC 框架的工作原理和服务治理的挑战有了较为深入的理解。 |
| 87 | + |
| 88 | +SOFARPC 作为一个广泛使用的开源 RPC 框架,吸引了我参与其中,希望能在项目中进一步扩展我的知识和技能。特别是看到 SOFARPC 在动态配置方面的潜力后,我希望能够贡献自己的力量优化系统,帮助开发者更好地管理配置。 |
| 89 | + |
| 90 | +### 如何克服项目过程中的困难与挑战? |
| 91 | + |
| 92 | +在项目过程中,我面临的主要难题是如何在不影响系统现有配置功能的前提下,扩展动态配置功能,尤其是要兼容不同的配置中心。由于不同配置中心的存储结构不同,接口实现和配置更新策略存在较大差异,导致了配置管理类的实现复杂度增加,兼容性问题也相应变得更加突出。 |
| 93 | + |
| 94 | +针对这些问题,我提出了以下解决方案: |
| 95 | + |
| 96 | +**统一存储层次和抽象设计**:为了更好地兼容不同的配置中心,我设计了统一的存储层次结构,在每个配置中心内部,接口级的配置信息均与应用名相对应。此外,通过 SPI 机制,使用统一的 DynamicConfigManager 接口,不同配置中心的实现方式被抽象为一个统一的层,减少了各配置管理类之间的耦合。 |
| 97 | + |
| 98 | +**监听机制的统一和优化**:为了实现动态配置的实时生效,需要对配置变更进行事件监听。然而,由于 Apollo、Nacos 和 Zookeeper 的监听机制不同,初期设计的监听器存在重复创建和事件丢失的问题,导致部分配置更新时没有及时生效。为了解决这一问题,我分别为不同配置中心实现了其特定的 Listener 子类,并在 DynamicConfigManager 中引入了统一的监听器管理机制。通过引入 ConfigChangedEvent 事件类,我成功统一了事件的触发和处理逻辑,解决了事件丢失和重复创建的问题。 |
| 99 | + |
| 100 | +经过多次实验和调整,并在导师的指导下不断优化,最终我成功实现了负载均衡策略、超时设置等配置项的动态更新,并顺利集成了 Nacos 和 Zookeeper。 |
| 101 | + |
| 102 | +### 导师与社区带来的帮助 |
| 103 | + |
| 104 | +在整个项目过程中,我得到了导师和社区的悉心指导与支持。项目启动之初,导师便帮助我梳理了项目的核心需求和整体的任务安排,在之后的每周,我们都会定期召开会议,汇报进度并商讨进一步的实现思路。在整个项目周期内,导师为我提供了诸多宝贵的技术建议。 |
| 105 | + |
| 106 | +### 社区印象 |
| 107 | + |
| 108 | +SOFAStack 社区是一个充满创新精神和协作氛围的开源平台,汇聚了许多技术爱好者和开发者。社区成员不仅拥有丰富的技术背景,也热衷于分享和贡献自己的经验与成果。在这里,每个人都能找到志同道合的伙伴,彼此帮助、共同进步。 |
| 109 | + |
| 110 | +### 有哪些收获 |
| 111 | + |
| 112 | +我不仅深入理解了 SOFARPC 框架的设计与实现,还学到了如何在大型开源项目中推动功能优化与创新。我学会了如何在扩展功能的同时,平衡系统稳定性与灵活性之间的关系,避免引入不必要的复杂性。这一经验对我未来的技术工作具有深远影响,尤其是在处理复杂系统的设计与优化时,我将更加注重架构的清晰性与可维护性。 |
| 113 | + |
| 114 | +### 对更多开源新人的寄语 |
| 115 | + |
| 116 | +开源之路充满挑战,但也极富回报。勇于尝试,保持对技术的热情,你将在这个过程中不断成长! |
0 commit comments