Dubbo 中都用到哪些设计模式? - 图1

    责任链模式:
    责任链模式在 Dubbo 中发挥的作用举足轻重,就像是 Dubbo 框架的骨架。Dubbo 的调用链组织是用责任链模式串连起来的。责任链中的每个节点实现 Filter 接口,然后由 ProtocolFilterWrapper,将所有 Filter 串连起来。Dubbo 的许多功能都是通过 Filter 扩展实现的,比如监控、日志、缓存、安全、telnet 以及 RPC 本身都是。

    观察者模式:
    Dubbo 中使用观察者模式最典型的例子是 RegistryService。消费者在初始化的时候回调用 subscribe 方法,注册一个观察者,如果观察者引用的服务地址列表发生改变,就会通过 NotifyListener 通知消费者。此外,Dubbo 的 InvokerListener、ExporterListener 也实现了观察者模式,只要实现该接口,并注册,就可以接收到 consumer 端调用 refer 和 provider 端调用 export 的通知。

    修饰器模式:
    Dubbo 中还大量用到了修饰器模式。比如 ProtocolFilterWrapper 类是对 Protocol 类的修饰。在 export 和 refer 方法中,配合责任链模式,把 Filter 组装成责任链,实现对 Protocol 功能的修饰。其他还有 ProtocolListenerWrapper、 ListenerInvokerWrapper、InvokerWrapper 等。

    工厂方法模式:
    CacheFactory 的实现采用的是工厂方法模式。CacheFactory 接口定义 getCache 方法,然后定义一个 AbstractCacheFactory 抽象类实现 CacheFactory,并将实际创建 cache 的 createCache 方法分离出来,并设置为抽象方法。这样具体 cache 的创建工作就留给具体的子类去完成。

    抽象工厂模式:
    ProxyFactory 及其子类是 Dubbo 中使用抽象工厂模式的典型例子。ProxyFactory 提供两个方法,分别用来生产 Proxy 和 Invoker(这两个方法签名看起来有些矛盾,因为 getProxy 方法需要传入一个 Invoker 对象,而 getInvoker 方法需要传入一个 Proxy 对象,看起来会形成循环依赖,但其实两个方式使用的场景不一样)。AbstractProxyFactory 实现了 ProxyFactory 接口,作为具体实现类的抽象父类。然后定义了 JdkProxyFactory 和 JavassistProxyFactory 两个具体类,分别用来生产基于 jdk 代理机制和基于 javassist 代理机制的 Proxy 和 Invoker。

    适配器模式:
    为了让用户根据自己的需求选择日志组件,Dubbo 自定义了自己的 Logger 接口,并为常见的日志组件(包括 jcl, jdk, log4j, slf4j)提供相应的适配器。并且利用简单工厂模式提供一个 LoggerFactory,客户可以创建抽象的 Dubbo 自定义 Logger,而无需关心实际使用的日志组件类型。在 LoggerFactory 初始化时,客户通过设置系统变量的方式选择自己所用的日志组件,这样提供了很大的灵活性。

    代理模式:
    Dubbo consumer 使用 Proxy 类创建远程服务的本地代理,本地代理实现和远程服务一样的接口,并且屏蔽了网络通信的细节,使得用户在使用本地代理的时候,感觉和使用本地服务一样。