Dubbo 用到哪些设计模式?

Dubbo 框架在初始化和通信过程中使用了多种设计模式可灵活控制类加载 

限控制等功能

工厂模式 

Provider  export 服务时会调用 ServiceConfig  export 方法。ServiceConfig

中有个字段

private static final Protocol protocol =

ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtensi

on();

Dubbo 里有很多这种代码这也是一种工厂模式只是实现类的获取采用了 JDK

SPI 的机制这么实现的优点是可扩展性强想要扩展实现只需要在 classpath

下增加个文件就可以了代码零侵入另外像上面的 Adaptive 实现可以做到 

调用时动态决定调用哪个实现但是由于这种实现采用了动态代理会造成代码 

调试比较麻烦需要分析出实际调用的实现类

装饰器模式 

Dubbo 在启动和调用阶段都大量使用了装饰器模式 Provider 提供的调用链为 

具体的调用链代码是在 ProtocolFilterWrapper  buildInvokerChain 完成 

具体是将注解中含有 group=provider  Filter 实现按照 order 排序 

后的调用顺序是

EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter ->

ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter ->

ExceptionFilter

更确切地说这里是装饰器和责任链模式的混合使用例如,EchoFilter 的作用是 

判断是否是回声测试请求是的话直接返回内容这是一种责任链的体现而像 

ClassLoaderFilter 则只是在主功能上添加了功能更改当前线程的 ClassLoader,

这是典型的装饰器模式

观察者模式 

Dubbo  Provider 启动时需要与注册中心交互先注册自己的服务再订阅自 

己的服务订阅时采用了观察者模式开启一个 listener。注册中心会每 5 秒定 

时检查是否有服务更新如果有更新向该服务的提供者发送一个 notify 消息

provider 接受到 notify 消息后即运行 NotifyListener  notify 方法执行监 

听器方法

动态代理模式 

Dubbo 扩展 JDK SPI 的类 ExtensionLoader  Adaptive 实现是典型的动态代理 

实现。Dubbo 需要灵活地控制实现类即在调用阶段动态地根据参数决定调用哪 

个实现类所以采用先生成代理类的方法能够做到灵活的调用生成代理类的 

代码是 ExtensionLoader  createAdaptiveExtensionClassCode 方法代理类 

的主要逻辑是获取 URL 参数中指定参数的值作为获取实现类的 key。

原文地址:https://www.cnblogs.com/programb/p/12845264.html