GitHub user Alanxtl created a discussion: [gsoc1] Dubbo-Go 轻量化运行时探索与插件化机制实现

# GSoC 题目:**Dubbo-Go 轻量化运行时探索与插件化机制实现**

---

## 项目背景与问题描述

Dubbo-Go 已发展为一个功能丰富的 RPC 
框架,拥有覆盖服务注册、服务发现、协议实现、治理能力等在内的庞大扩展生态系统。当前框架在设计上追求“开箱即用”,大多数扩展组件在编译期或运行期**默认启用**,无需显式声明即可参与框架初始化流程。

然而,这种设计在实际使用中逐渐暴露出若干问题:

* **所有插件默认启用,缺乏显式的启停控制机制**。
  用户无法明确关闭不需要的扩展组件,即使这些组件在当前使用场景下并不必要。
* **运行时依赖复杂、启动路径冗长**。
  即便是仅使用基础 RPC 能力的场景,也会隐式引入注册中心、治理、配置等多个子系统的初始化逻辑。
* **核心运行时与可选能力耦合度高**。
  许多扩展实现长期存在于 Dubbo-Go 主仓库中,导致核心代码与扩展逻辑边界模糊,增加维护与演进成本。

在此前的重构过程中,一些使用频率较低的扩展(例如 Consul 注册中心)被从核心仓库中移除。但由于缺乏统一的插件化框架、SPI 
边界定义以及标准化的加载与启停机制,这些扩展难以以“可选组件”的形式重新引入和独立维护。

因此,当前 Dubbo-Go 面临的核心问题已不仅是“是否插件化”,而是:

> **如何在保证向后兼容的前提下,引入可控、可裁剪的插件机制,使 Dubbo-Go 支持轻量化运行时模式。**

相关issue: https://github.com/apache/dubbo-go/issues/2326 
https://github.com/apache/dubbo-go/issues/1981

---

## 项目目标

本项目旨在探索 **Dubbo-Go 的轻量化运行时模式**,并通过插件化机制实现对扩展组件的**显式加载与控制**,而不改变现有用户的配置方式与使用习惯。

具体目标包括:

1. **设计并实现可控的插件化机制**,支持插件的显式启用与禁用,而非默认全部加载。
2. **分析并重构 Dubbo-Go 的启动流程**,明确哪些能力属于最小运行时,哪些应作为可选插件加载。
3. **定义并稳定 SPI(Service Provider Interface)层**,为核心与扩展之间建立清晰、可维护的边界。
4. **建立独立的扩展仓库 `dubbo-go-extensions`**,承载非核心运行时能力。
5. **适配多个具有代表性的扩展(不少于 5 个)**,验证插件化与轻量运行时设计的可行性。
6. **在保证兼容性的前提下**,为未来的运行时裁剪、按需加载与部署优化奠定基础。

---

## 关键技术挑战

### 1. 插件加载顺序、启停控制与初始化机制

当前 Dubbo-Go 中,大多数扩展通过空白导入和 `init()` 函数自动注册,且默认参与启动流程。本项目将系统性分析并解决以下问题:

* 插件是如何被发现和注册的(例如通过 `init()` + 全局注册表)。
* 不同类型插件(注册中心、解析器、协议、治理组件等)的初始化顺序。
* 插件加载与配置解析之间的关系。
* **如何引入插件的显式启用 / 禁用机制**,避免所有插件默认生效。
* 如何避免 Go 包初始化顺序带来的非确定性行为。

目标是建立一个**可预测、可裁剪、可文档化的插件加载与控制模型**。

---

### 2. SPI 层设计与边界稳定性

SPI 层是实现插件化与轻量运行时的关键基础,其设计目标包括:

* 集中、明确地定义扩展点(接口、扩展名、工厂函数等)。
* 减少插件对 Dubbo-Go 内部运行时结构的依赖。
* 支持插件在不修改核心代码的情况下独立演进。
* 为插件启停、按需加载以及未来运行时裁剪提供稳定接口基础。

SPI 是以**独立模块**形式存在,还是作为 Dubbo-Go 仓库内**边界清晰的子包**存在,将作为设计探索的一部分,而非预设结论。

---

### 3. 扩展仓库与可选能力拆分

项目将建立新的 `dubbo-go-extensions` 仓库,用于承载非核心能力的插件实现:

* 不同扩展以独立 Go Module 形式存在(如 `registry/consul`、`registry/polaris`)。
* 扩展通过 SPI 与核心运行时集成。
* 用户可通过显式引入与配置选择性启用插件,而非默认加载全部能力。

---

### 4. 扩展适配与迁移验证

为验证插件化机制与轻量化运行时设计的可行性与通用性,本项目将选择并适配多种具有代表性的 Dubbo-Go 扩展,包括:

* 若干当前仍在使用的扩展(如不同类型的注册中心、解析器或协议实现),用于验证插件的显式启停能力、加载顺序控制以及与轻量运行时的兼容性。
* 至少一个历史上曾被移除的扩展(如 Consul 注册中心),用于验证在核心演进背景下,旧扩展通过 SPI 与插件化机制重新引入的可行性。

针对历史移除扩展,将完成以下工作:

* 修复与当前 Dubbo-Go 核心之间的兼容性问题。
* 基于新的 SPI 接口进行重构与注册。
* 在插件可控启用的运行模式下进行功能验证。

该过程将沉淀可复用的扩展适配与迁移经验,并形成指导文档,为后续更多扩展的插件化提供参考。


---

### 5. 轻量化运行时模式探索

基于对启动流程和插件依赖的分析,项目将探索:

* Dubbo-Go 最小可运行核心的能力边界(如仅支持基础 RPC)。
* 治理、注册、配置等能力作为插件按需加载的可行性。
* 为容器化、边缘计算或资源受限场景提供更轻量的运行时形态。

---

## 预期成果

1. 一套支持插件显式启停的 Dubbo-Go 插件化机制。
2. 清晰、稳定的 SPI 层定义。
3. 一个 `dubbo-go-extensions` 扩展仓库。
4. 多个成功适配的新插件化扩展(不少于 5 个),其中至少包含一个历史移除扩展(如 Consul)。
5. Dubbo-Go 启动流程与运行时依赖的完整文档。
6. 示例项目,展示轻量运行时与插件按需启用方式。

---

## 难度与工作量

* **难度**:中等偏高
* **项目规模**:Large(350 小时)

---


# 预期 12-Week Milestones

> **Community Bonding(编码前)**
> (通常 2–3 周,不计入 12 周 coding period)

## Community Bonding(编码前准备)

**目标**:统一认知,避免学生一上来就改代码

* 熟悉 Dubbo-Go 代码结构与启动流程
* 阅读现有 extension / SPI 机制(如 `common/extension`)
* 梳理当前插件的注册、初始化、启用方式
* 与导师确认:

  * 轻量运行时的目标范围
  * 插件启停的设计约束(向后兼容)

**交付物**:

* 一份《Dubbo-Go 启动流程与插件机制初步分析》文档

---

## Coding Period(12 周)

---

## Week 1:Dubbo-Go 启动流程与插件现状分析

**目标**:搞清楚“现在到底是怎么跑起来的”

* 梳理 Dubbo-Go 启动主路径(入口 → runtime → extension)
* 识别:

  * 哪些插件是“默认必加载”
  * 哪些插件是“配置触发”
* 分析插件注册方式(`init()`、全局 registry)

**交付物**:

* 启动流程时序图(或文字版)
* 插件加载与注册机制分析文档

---

## Week 2:最小运行时能力边界定义

**目标**:明确什么是“轻量运行时”

* 定义 **Minimal Runtime** 能力集合(如基础 RPC)
* 明确哪些能力应视为“可选插件”:

  * 注册中心
  * 配置中心
  * 治理能力
* 标注当前代码中的强耦合点

**交付物**:

* 《Dubbo-Go 轻量运行时能力划分说明》
* 插件分类清单(core vs optional)

---

## Week 3:插件启停模型与加载顺序设计

**目标**:先设计,再动代码

* 设计插件生命周期模型:

  * 发现
  * 注册
  * 启用 / 禁用
  * 初始化
* 明确插件加载顺序与依赖关系
* 讨论并确定:

  * 配置驱动 vs 显式声明
  * 默认行为与兼容策略

**交付物**:

* 插件启停与加载顺序设计文档
* 初步 API / 接口草案

---

## Week 4:SPI 层边界设计与稳定化

**目标**:把“核心”和“插件”真正隔开

* 梳理现有 SPI 使用情况
* 设计稳定的 SPI 接口集合
* 明确:

  * 哪些接口对插件开放
  * 哪些内部结构应隐藏

**交付物**:

* SPI 接口定义文档
* SPI 包结构设计说明

---

## Week 5:插件管理与启停机制实现(核心)

**目标**:真正让插件“可以关掉”

* 实现插件管理基础设施:

  * 插件注册表
  * 启用 / 禁用状态
* 支持插件在初始化阶段被跳过
* 保证不破坏现有默认行为

**交付物**:

* 插件管理核心代码
* 示例:禁用某类插件仍可正常启动

---

## Week 6:加载顺序与确定性初始化保障

**目标**:解决 Go `init()` 的不确定性问题

* 控制插件初始化顺序
* 消除对包初始化顺序的隐式依赖
* 确保配置加载与插件启用顺序一致

**交付物**:

* 确定性插件初始化机制
* 对应技术文档与示例

---

## Midterm Evaluation(中期评估)

**应达到状态**:

* 插件可以被显式启用 / 禁用
* 轻量运行时可以在无部分插件情况下启动
* SPI 边界清晰、代码可维护

---

## Week 7:建立 `dubbo-go-extensions` 仓库

**目标**:验证插件真正可以“离开核心仓库”

* 创建 `dubbo-go-extensions`
* 拆出第一个扩展到独立仓库
* 通过 SPI 完成注册

**交付物**:

* 新 extensions 仓库
* 至少一个独立插件模块

---

## Week 8:适配多个现有扩展(不少于 3 个)

**目标**:验证机制通用性

* 选择多个现有扩展进行适配
* 验证:

  * 启停控制
  * 加载顺序
  * 轻量运行时兼容性

**交付物**:

* 至少 3 个插件完成适配
* 测试与验证说明

---

## Week 9:恢复历史移除扩展(如 Consul)

**目标**:解决“历史包袱”问题

* 恢复一个历史移除扩展
* 修复 API / 配置兼容问题
* 通过新插件机制启用

**交付物**:

* 成功运行的历史扩展插件
* 迁移与适配说明文档

---

## Week 10:完善插件文档与示例工程

**目标**:让用户和开发者“能用、会用”

* 编写插件开发指南
* 编写插件启停说明
* 提供最小运行时示例项目

**交付物**:

* 插件开发与使用文档
* 示例项目代码

---

## Week 11:测试、稳定性与向后兼容性验证

**目标**:避免“能跑但不敢合”

* 回归测试现有使用场景
* 验证默认行为未被破坏
* 修复发现的问题

**交付物**:

* 测试报告
* 兼容性说明

---

## Week 12:最终整理与成果交付

**目标**:让社区愿意合并

* 整理所有文档
* 提交 PR / RFC
* 汇总设计决策与未来工作方向

**交付物**:

* 最终技术总结文档
* 可合并的代码与 PR
* 后续演进建议


GitHub link: https://github.com/apache/dubbo-go/discussions/3205

----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: 
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to