天天看点

dubbo源码:dubbo之Listener

文章目录

        • 1. ExporterListener
        • 2. InvokerListener
        • 3. 总结

1. ExporterListener

  • 本地服务暴露过程

    本地服务暴露过程会按照 ProtocolFilterWrapper -> ProtocolListenerWrapper -> InjvmProtocol 调用顺序,在 ProtocolListenerWrapper 中会构建 ListenerExporterWrapper 实例,在生成 ListenerExporterWrapper 实例过程中,会对 ListenerExporterWrapper 实例中的 listeners 属性依次调用 exported 方法。

  • 远程服务暴露过程

    远程暴露服务过程会按照 ProtocolFilterWrapper -> ProtocolListenerWrapper -> RegistryProtocol 调用顺序,在 ProtocolListenerWrapper 中会构建 ListenerExporterWrapper 实例,在生成 ListenerExporterWrapper 实例过程中,会对 ListenerExporterWrapper 实例中的 listeners 属性依次调用 exported 方法。

@SPI
public interface ExporterListener {
  // 暴露服务后的监听/处理,在 ListenerExporterWrapper 对象进行初始化的时候就会进行调用
  void exported(Exporter<?> exporter) throws RpcException;
  // 取消暴露服务后的处理
  void unexported(Exporter<?> exporter);

}

// 用户可以继承该方法重写需要的方法
public abstract class ExporterListenerAdapter implements ExporterListener {

    public void exported(Exporter<?> exporter) throws RpcException {
    }

    public void unexported(Exporter<?> exporter) throws RpcException {
    }
}
           
  • 使用实例
    1. 自定义 ExportListenerTest
      // 使用@Activate自动激活
      @Activate
      public class ExportListenerTest extends ExporterListenerAdapter {
          @Override
          public void exported(Exporter<?> exporter) throws RpcException {
              System.out.println("暴露完成后的处理:" + exporter.getInvoker().getInterface());
          }
      }
                 
    2. META-INF/dubbo下配置

      com.alibaba.dubbo.rpc.ExporterListener文件

      exportListenerTest=listener.ExportListenerTest
                 
    3. 启动过程的输出
      暴露完成后的处理:interface service.DemoService
      暴露完成后的处理:interface service.DemoService
                 
      其中第一次输出是暴露本地服务的输出,第二次输出是暴露远程服务的输出
  • ServiceBean的destroy方法

    由于 ServiceBean 实现了 DisposableBean 接口,所以会在spring容器showdown的时候调用destroy方法,而在ServiceBean的destroy方法中会调用 ExporterListener 的unexported方法,源码不再详述。

  • 自定义ExporterListener的调用

    不使用@Activate来自定义激活,可使用dubbo parameter来进行自定义激活,示例如下:

    ExporterListener 扩展实现类:

    public class MultiExportListenerTest extends ExporterListenerAdapter {
        @Override
        public void exported(Exporter<?> exporter) throws RpcException {
            System.out.println("MultiExportListenerTest 暴露完成后的处理:" + exporter.getInvoker().getInterface());
        }
    }
    
    public class ExportListenerTest extends ExporterListenerAdapter {
        @Override
        public void exported(Exporter<?> exporter) throws RpcException {
            System.out.println("ExportListenerTest 暴露完成后的处理:" + exporter.getInvoker().getInterface());
        }
    }
               
    META-INF/dubbo下配置com.alibaba.dubbo.rpc.ExporterListener:
    exportListenerTest=listener.ExportListenerTest
    multiExportListenerTest=listener.MultiExportListenerTest
               
    服务端配置:
    <dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test">
            <dubbo:parameter key="exporter.listener" value="multiExportListenerTest"/>
    </dubbo:service>
    
    另一种方式:
    <dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test" listener="multiExportListenerTest"/>
               

2. InvokerListener

  • 消费端引用服务
    @SPI
    public interface InvokerListener {
        // 消费端引用服务后处理
        void referred(Invoker<?> invoker) throws RpcException;
    
        // 取消引用后处理
        void destroyed(Invoker<?> invoker);
    }
    
    // 用户可以继承该方法重写需要的方法
    public abstract class InvokerListenerAdapter implements InvokerListener {
        public void referred(Invoker<?> invoker) throws RpcException {
        }
        public void destroyed(Invoker<?> invoker) {
        }
    }
               
  • DeprecatedInvokerListener及自定义InvokerListener的调用

    DeprecatedInvokerListener 的调用过程

    当引用服务过程判断服务是否过时,如果服务端设deprecated为true,消费方引用时将打印服务过时警告error日志,服务端配置如下:
    自定义InvokerListener的调用参考ExporterListener的方式

3. 总结

dubbo中的listener机制更多面向的是dubbo开发者,使用者大多用的是服务端export/destory export服务后和消费端refer/destroy refer服务后的一些处理。

继续阅读