天天看點

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服務後的一些處理。

繼續閱讀