博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo源码分析(2),Dubbo中采用的设计模式
阅读量:7198 次
发布时间:2019-06-29

本文共 1191 字,大约阅读时间需要 3 分钟。

  hot3.png

1、工厂模式 

     ServiceConfig中有个字段,代码是这样的: 

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

  Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了jdkspi的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在classpath下增加个文件就可以了,代码零侵入。另外,像上面的Adaptive实现,可以做到调用时动态决定调用哪个实,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。

 

2、装饰器模式 

       Dubbo在启动和调用阶段都大量使用了装饰器模式。以Provider提供的调用链为例,具体的调用链代码是在ProtocolFilterWrapper的buildInvokerChain完成的,具体是将注解中含有group=provider的Filter实现,按照order排序,最后的调用顺序是 

   EchoFilter-》ClassLoaderFilter-》GenericFilter-》ContextFilter-》ExceptionFilter-》  

   TimeoutFilter-》MonitorFilter-》TraceFilter。  

       更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter则只是在主功能上添加了功能,更改当前线程的ClassLoader,这是典型的装饰器模式。

 

3、观察者模式 

      Dubbo的provider启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个listener。注册中心会每5秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个notify消息,provider接受到notify消息后,即运行NotifyListener的notify方法,执行监听器方法。 

 

4、动态代理模式 

      Dubbo扩展jdkspi的类ExtensionLoader的Adaptive实现是典型的动态代理实现。Dubbo需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是ExtensionLoader的createAdaptiveExtensionClassCode方法。代理类的主要逻辑是,获取URL参数中指定参数的值作为获取实现类的key。

 

转载于:https://my.oschina.net/90888/blog/1645096

你可能感兴趣的文章
php模块安装
查看>>
Python3.2 --- Print函数用法
查看>>
Django 当中使用CSS之类的东西如何设置路径
查看>>
ssh免密码登录 rsh rcp部署
查看>>
RHEL7普通权限、特殊权限、acl的设置
查看>>
Centos6.6安装选包及基础场景说明
查看>>
备份前一天文件名中包含日期的文件
查看>>
修改kvm虚拟机的root密码和其他用户密码
查看>>
在C#中实现截获shell程序的输出
查看>>
vi 编辑器进入后无法退出
查看>>
一个Mysql自动备份脚本
查看>>
Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl
查看>>
七年之“养”【我与51CTO一“七”成长】
查看>>
WebCruiser - Web Vulnerability Scanner
查看>>
互联网时代还要不要读报纸杂志、看电视?
查看>>
Flash CS3 中改变组件的样式
查看>>
python中pickle使用学习-字典小程序函数化
查看>>
闲谈IPv6-现状和过渡
查看>>
libjpeg.so.62: no version information available (required
查看>>
maven deploy 的那些事
查看>>