解读「框架设计原则」

简介:

04c2b80a23708895bd288a4535820ec9cec33607

大纲

1 模块分包原则
2 框架扩展原则
3 领域划分原则
4 接口分离原则
5 组件协作原则
6 功能演进原则

原则总结者:梁飞,dubbo作者

原则解读者:莫那鲁道


1 模块分包原则

fad9b0f6947e94880ed9540c314e43f71c802c2e

说说我的理解。这里其实是从框架结构的解读来解读,这里的包指的是 Maven 的 module。

复用度,指的是 maven 包的复用。可以理解为工具类。这个工具类不应该变化无常。

稳定度:被依赖的包应该保持稳定,或者说,被依赖者应当比依赖者稳定,且不能成环状依赖。如果不稳定,将会影响其他的包。

抽象度,越抽象,越稳定。越具体,越容易变化。

同时,梁飞给出了一个公式,但是实践起来有点麻烦.......

关于模块分包,可以参见更详细的博客。 以HTTL为例讲讲模块分包&领域模型&扩展框架


2 框架扩展原则

b365740e089ab0b1e8883a7ded93c06185d840f8

这是其实是说的比较多的东西了。

什么是微核心 + 插件?按照作者的说法,核心只负责装配插件。这样,无论是作者自己的功能,还是第三方的功能,都是平等的,再多的插件也不会影响软件架构,因为没有硬编码,且都是可以卸载的。甚至微核也是可以扩展的。:)

同时,插件的组装规则是统一的。说到这里,你应该想到了 IDEA,Maven,Eclipse 等等。

然后说外置生命周期。这个其实我是有一点不理解的。按照作者的说法,其实是说,框架只负责管理对象,对象的出生和死亡不由框架负责。即,用户应将实例注册到框架中。

但 Spring 似乎不是这么做的。同时,如果使用注册机制,那么就需要硬编码。或者说,Spring 本身就是管理 Bean 生命周期的框架,而 Dubbo 的职责不在于此?

最少化概念模型,这个其实是一种优化。

一致化数据模型:例如 URL 这种对象,就是一致化数据模型,拒绝使用 String 拼接,解析。


3 领域划分原则

0bb749de07959e810dbe7185f22903a00a9884e2

这是在框架设计中,是非常重要的。

PPT 中已经说的非常清楚,我就不再说明。其中,Invocation 一定要轻量。否则,对 GC 来说,将是很大的压力(使用对象池?性能不好。)

说说他的好处:

  1. 结构清晰,这个不必讲吧。

  2. 充血模型......这个怎么理解?

  3. 可变和不可变状态分离,可变状态集中。通常实体域都是只读的,即不变状态。会话域都是可变状态。

  4. 所有领域模型线程安全。无锁编程(lock-free 非常重要)。

关于他们的线程安全性:

  1. 服务域无状态,天生线程安全。

  2. 实体域属性只读,线程安全。

  3. 会话域工作在栈中,线程安全。

所以,需要保证他们是这么设计的,才能实现无锁编程。


4 接口分离原则

07384d3589b01190a8c4c124ef61031963640625

关于接口分离,我认为是单一职责的一种实现。

其中提到 API 和 SPI,API 面向用户,SPI 面向开发者。两者必须分离。

声明式 API 和过程式 SPI ,没看懂,看懂的说一下。:)

API 可配置,一定可编程,这个不用说吧。

区分命令和查询,例如,不应该有 updateAndGet 这个方法(不包括原子类),应该分成 2 个方法,保证 get 方法幂等。

对称性接口:很简单,有 get 方法,就应该有 set 方法,有 add 就由 remove,称之为对称性和完备性。这样用户能自行推导出接口。

兼容性:如果接口加方法,应该是增加子接口的方式。其他的没看明白.......


5 组件协作原则

cdb1f640fb37705c1ed86178d0fa791821caf7e0

这个就比较爽了,我们知道 Dubbo 是管道式设计。一个 Invoker 贯通整个流程,事实上,web 服务器都是这么设计的。例如 Tomcat ,Netty。

关于派发,还记得 Spring 的 dispatchServlet 吗?

关于状态的共享:

分布是什么?即通过行为传递(适合交互性系统)。

共享是什么?通过一个固定的点获取,称之为仓库(适合管理状态的系统)。

主过程拦截,还记得 Mybatis 留给我们的插件吗?还记得 Spring 留给我们的拦截器吗?框架要在关键节点留出拦截点供用户扩展。

事件派发:观察者模式,Reactor 模式,另外提到 Proactor 模式,查了一下,通常在 GNU 编程中,由 OS 支持。

Dubbo 暴露、引用、调用事件,都预留了监听器。

关键路径,即在管道使用职责连模式进行拦截,保证每个拦截器职责单一。

非关键路径,需要有监听机制,不能影响主流程运行。

关于协作防御,我理解为防御性编程。

  1. 分离可靠操作和不可靠操作。不可靠操作尽量范围要小。

  2. 状态分离,尽量无状态。状态要尽可能小。

  3. 对状态要尽早验证,因为如果失败,通常无人回滚。前后断言验证状态正确性。

  4. 异常防御,应该是预见性的异常,异常包含环境信息。

  5. 降低修改成本,防止埋雷:不要根据异常类型做分支判断。保持 null 和 empty 一致。


6 功能演进原则

6cfffa3a0241eb0be88898578957676bd38c3a95

第一就是开闭原则,微核心加插件机制能够支持。
软件质量的下降,来源于修改。

加功能的姿势:应该是增量式,而不是扩充式,即不在原有基础上修改,而是新增加功能。

关于高阶:顶层接口尽量抽象,且不能依赖底层实现。这样,当底层实现变化时,高层无需变化。

例如 Dubbo 泛化,在顶层就足够抽象,底层实现方式不影响高层。


总结

67e5e8557d363ad0290cbe581a542772e61b40ee

以上是梁飞总结。

今天说的框架设计和现在大部分人喜欢说的架构设计有所不同,现在似乎只需要再 processon 上放几个阿里云组件,再连几条线,就是架构设计了 :)

我个人认为,框架设计更能考验一个程序员对程序的抽象和管理能力(也许措辞不当?)

然后,再说说我的总结:关于一个系统的设计,这里应该指的是框架的设计,首先要知道用户需求(废话)。根据需求抽象出模型,再变成代码,且是可扩展,可复用的代码。

这里提到的 6 个原则,应该算是比较成熟的原则了。

1 微核 + 插件,非常理想化,例如 SOFA,也有自己的扩展机制。

2 关于领域模型设计,这 3 个模型的职责一定要划分清楚,同时实现无锁编程,这个对于系统的性能非常重要。

3 关于组件协作,一个系统有多个组件,通常需要进行状态的共享,在 Dubbo 中,使用行为进行传递,也就是会话域。

4 关于功能演进,请遵循开闭原则,但前提通常是有一个好的内核。

5 关于接口分离和模块分包,通常在后期重构能够达到更好的效果?

好了,洋洋洒洒说了不少,读者如有更好的见解,请与我分享,毕竟现在关注这块的人不多了。:)期待和对此感兴趣的人一起讨论


原文发布时间为: 2018-11-17
本文作者: Kirito的技术分享
本文来自云栖社区合作伙伴“ Kirito的技术分享”,了解相关信息可以关注“ Kirito的技术分享”。

相关文章
|
Linux Android开发 Windows
ADB和Fastboot最新版的谷歌官方下载链接
ADB和Fastboot for Windows https://dl.google.com/android/repository/platform-tools-latest-windows.zip ADB和Fastboot for Mac https://dl.
8851 0
|
12天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
7天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
4296 12
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
8天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4677 17
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
6天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
3002 8
|
10天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7203 16
|
8天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
4926 5
|
10天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
4815 23