zoukankan      html  css  js  c++  java
  • 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 排序,最

    后的调用顺序是:

    75 页 共 485 页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。

  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/programb/p/13020662.html
Copyright © 2011-2022 走看看