dubbo源码:dubbo之Listener

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日志,服务端配置如下:

    <dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test" deprecated="true"/>
    

    自定义InvokerListener的调用参考ExporterListener的方式

3. 总结

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值