转于自己在公司的Blog:
http://pt.alibaba-inc.com/wp/dev_related_1283/dubbo-extension.html
原文:
http://javatar.iteye.com/blog/1041832
随着服务化的推广,网站对Dubbo服务框架的需求逐渐增多,
Dubbo的现有开发人员能实现的需求有限,很多需求都被delay,
而网站的同学也希望参与进来,加上领域的推动,
所以平台计划将部分项目对公司内部开放,让大家一起来实现,
Dubbo为试点项目之一。
既然要开放,那Dubbo就要留一些扩展点,
让参与者尽量黑盒扩展,而不是白盒的修改代码,
否则分支,质量,合并,冲突都会很难管理。
先看一下Dubbo现有的设计:
这里面虽然有部分扩展接口,但并不能很好的协作,
而且扩展点的加载和配置都没有统一处理,所以下面对它进行重构。
第一步,微核心,插件式,平等对待第三方。
即然要扩展,扩展点的加载方式,首先要统一,
微核心+插件式,是比较能达到OCP原则的思路,
由一个插件生命周期管理容器,构成微核心,
核心不包括任何功能,这样可以确保所有功能都能被替换,
并且,框架作者能做到的功能,扩展者也一定要能做到,以保证平等对待第三方,
所以,框架自身的功能也要用插件的方式实现,不能有任何硬编码。
通常微核心都会采用Factory,IoC,OSGi等方式管理插件生命周期,
考虑Dubbo的适用面,不想强依赖Spring等IoC容器,
自已造一个小的IoC容器,也觉得有点过度设计,
所以打算采用最简单的Factory方式管理插件,
最终决定采用的是JDK标准的SPI扩展机制,参见:java.util.ServiceLoader
也就是扩展者在jar包的META-INF/services/目录下放置与接口同名的文本文件,
内容为接口实现类名,多个实现类名用换行符分隔,
比如,需要扩展Dubbo的协议,只需在xxx.jar中放置:
文件:META-INF/services/com.alibaba.dubbo.rpc.Protocol
内容为:com.alibaba.xxx.XxxProtocol
Dubbo通过ServiceLoader扫描到所有Protocol实现。
并约定所有插件,都必须标注:@Extension("name"),
作为加载后的标识性名称,用于配置选择。
第二步,每个扩展点只封装一个变化因子,最大化复用。
每个扩展点的实现者,往往都只是关心一件事,
现在的扩展点,并没有完全分离,
比如:Failover, Route, LoadBalance, Directory没有完全分开,全由RoutingInvokerGroup写死了。
再比如,协议扩展,扩展者可能只是想替换序列化方式,或者只替换传输方式,
并且Remoting和Http也能复用序列化等实现,
这样,需为传输方式,客户端实现,服务器端实现,协议头解析,数据序列化,都留出不同扩展点。
拆分后,设计如下:
第三步,全管道式设计,框架自身逻辑,均使用截面拦截实现。
现在很多的逻辑,都是放在基类中实现,然后通过模板方法回调子类的实现,
包括:local, mock, generic, echo, token, accesslog, monitor, count, limit等等,
可以全部拆分使用Filter实现,每个功能都是调用链上的一环。
比如:(基类模板方法)
Java代码 复制代码 收藏代码
1.public abstract AbstractInvoker implements Invoker {
2.
3. public Result invoke(Invocation inv) throws RpcException {
4. // 伪代码
5. active ++;
6. if (active > max)
7. wait();
8.
9. doInvoke(inv);
10.
11. active --;
12. notify();
13. }
14.
15. protected abstract Result doInvoke(Invocation inv) throws RpcException
16.
17.}
改成:(链式过滤器)
Java代码 复制代码 收藏代码
1.public abstract LimitFilter implements Filter {
2.
3. public Result invoke(Invoker chain, Invocation inv) throws RpcException {
4. // 伪代码
5. active ++;
6. if (active > max)
7. wait();
8.
9. chain.invoke(inv);
10.
11. active --;
12. notify();
13. }
14.
15.}
第四步,最少概念,一致性概念模型。
保持尽可能少的概念,有助于理解,对于开放的系统尤其重要,
另外,各接口都使用一致的概念模型,能相互指引,并减少模型转换,
比如,Invoker的方法签名为:
Java代码 复制代码 收藏代码
1.Result invoke(Invocation invocation) throws RpcException;
而Exporter的方法签名为:
Java代码 复制代码 收藏代码
1.Object invoke(Method method, Object[] args) throws Throwable;
但它们的作用是一样的,只是一个在客户端,一个在服务器端,却采用了不一样的模型类。
再比如,URL以字符串传递,不停的解析和拼装,没有一个URL模型类, 而URL的参数,却时而Map, 时而Parameters类包装,
Java代码 复制代码 收藏代码
1.export(String url)
2.createExporter(String host, int port, Parameters params);
使用一致模型:
Java代码 复制代码 收藏代码
1.export(URL url)
2.createExporter(URL url);
再比如,现有的:Invoker, Exporter, InvocationHandler, FilterChain
其实都是invoke行为的不同阶段,完全可以抽象掉,统一为Invoker,减少概念。
第五步,分层,组合式扩展,而不是泛化式扩展。
原因参见:http://javatar.iteye.com/blog/690845
泛化式扩展指:将扩展点逐渐抽象,取所有功能并集,新加功能总是套入并扩充旧功能的概念。
组合式扩展指:将扩展点正交分解,取所有功能交集,新加功能总是基于旧功能之上实现。
上面的设计,不自觉的就将Dubbo现有功能都当成了核心功能,
上面的概念包含了Dubbo现有RPC的所有功能,包括:Proxy, Router, Failover, LoadBalance, Subscriber, Publisher, Invoker, Exporter, Filter等,
但这些都是核心吗?踢掉哪些,RPC一样可以Run?而哪些又是不能踢掉的?
基于这样考虑,可以将RPC分解成两个层次,只是Protocol和Invoker才是RPC的核心,
其它,包括Router, Failover, Loadbalance, Subscriber, Publisher都不核心,而是Routing,
所以,将Routing作为Rpc核心的一个扩展,设计如下:
第六步,整理,梳理关系。
整理后,设计如下:
分享到:
相关推荐
要如何完整地设计一套硬件电路设计,下面为大家分享我的几点个人经验:1)总体思路设计硬件电路,大的框架和架构要搞清楚,但要做到这一点还真不容易。有些大框架也许自己的老板、老师已经想好,自己只是把思路具体...
论文部分则详细阐述了系统的设计思路、技术选型、实现细节以及性能优化等方面的内容,为开发者提供了深入的指导和参考。 利用本资源,开发者可以进行二次开发定制,根据具体业务需求对系统进行扩展和优化。此外,...
在设计一款硬件电路时,除了需要掌握硬件设计基础、各种设计软件、工具操作技能等等,更重要的是养成一个良好的硬件电路设计思路,这能帮助你更好的、有针对性的去完成它。如何培养硬件电路的设计思路,下面为大家...
测绘信息计算机网络系统的设计思路与构建框架分析.pdf
同时,附带的论文详细介绍了系统的设计思路、关键技术实现和应用场景,为读者提供了全面的理论支持和实践指导。 通过使用本资源,开发者可以节省大量的时间和精力,快速构建出高效、稳定且易于维护的工作流管理系统...
3. 毕业设计论文:一份完整的毕业设计论文范本,包含了设计思路、实现过程、技术总结等内容,供学生参考借鉴。 这份资源的特点和用途包括: - 实用性:提供了一个真实的项目示例,让学生能够通过实际操作掌握Vue...
学生可以通过这些论文了解到项目的整体框架和设计思路。 设计文档:详细记录了系统的设计过程,包括但不限于需求文档、系统架构设计、数据库设计、界面设计、功能模块设计等。学生可以根据这些文档进行系统的具体...
主要介绍了PHP仿tp实现mvc框架基本设计思路与实现方法,简单讲述了php实现tp框架的原理,并结合实例形式分析了相关控制器、视图及URL访问操作技巧与注意事项,需要的朋友可以参考下
在系统介绍中,我们对自媒体社区平台的各项功能、前后端框架和技术栈进行了详细介绍和解释,以帮助开发者更好地理解系统的设计思路和功能实现。 对于想要深入学习和了解源码的开发者,我们还提供了源码解释。通过...
缺乏统筹规划顶层设计,造成交叉规定,规范不明确及重复建设等问题,构建煤矿智能化标准体系框架,提出煤矿智能化标准体系建设路径,为智能化煤矿标准体系完善及技术发展提供参考。首先对煤矿智能化标准体系建设现状...
这个计算器设计利用了VC++6.0的MFC框架实现了windows窗口程序的多样性和实用性,巧妙地展现了C++程序语言的面向对象性,程序简洁但功能齐全。 关键算法为实现加减乘除等算法以及调用了开方函数和科学计算方法等。
系统框架设计采用了MVC模式思想,代码实现使用了JSP+Java Bean的网络编程技术,后台数据库是用SQL Server 2000对数据库进行管理。系统有完善的信息管理功能,为商家建立一套科学管理流程。 本系统界面友好简洁,使用...
在系统介绍中,我们对疫苗接种管理系统的各项功能、前后端框架和技术栈进行了详细介绍和解释,以帮助开发者更好地理解系统的设计思路和功能实现。 对于想要深入学习和了解源码的开发者,我们还提供了源码解释。通过...
3. 设计思路和方法:提供毕业设计的设计思路和方法指导。这些指导包括项目规划、需求分析、系统设计、算法实现等方面的内容,帮助学生建立系统化的设计思维和方法论,从而高效地完成毕业设计项目。 4. 编程实现和...
主要给大家介绍了关于Laravel程序架构设计思路之使用动作类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在系统介绍中,我们对自媒体社区平台的各项功能、前后端框架和技术栈进行了详细介绍和解释,以帮助开发者更好地理解系统的设计思路和功能实现。 对于想要深入学习和了解源码的开发者,我们还提供了源码解释。通过...
DWZ 富客户端框架设计目标是简单实用、扩展方便、快速开发、RIA 思路、轻量级 DWZ 框架支持用html 扩展的方式来代替javascript 代码, 只要董html 语法, 再参考DWZ 使用手册就可以做 ajax 开发. 开发人员不写...
学习内部架构和原理,为后续的创作提供一定的设计思路和设计启发 , 同时也为后续的作品创作提供有力的理论依据、实验依据和设计依据, 例如提供一些开源代码、设计原理和电路图等有效的资料,而且本设计简单, 通俗...
cola_os说明 模块化和抽象层的设计思路 该开发板的主要目的是规范大家的编程思想。如果你现在已经有编程基础,但是苦于无法写出规范的代码,那么本开发板提供的例程可以带给你全新的认识。软件框架为前后台和时间片...
这是整理发布的一款中国移动电信全面预算管理项目预算编制培训与...该文档为中国移动电信全面预算管理项目预算编制培训与讨论会议框架与整体设计思路,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看