摘要:源碼分析一該類實現(xiàn)了,是服務(wù)引用監(jiān)聽器的包裝類。取消暴露遍歷監(jiān)聽集合監(jiān)聽取消暴露該方法是對每個取消服務(wù)暴露的監(jiān)聽。五暴露服務(wù)取消暴露服務(wù)該類是服務(wù)暴露監(jiān)聽器的適配類,沒有做實際的操作。
遠程調(diào)用——Listener
目標:介紹dubbo-rpc-api中的各種listener監(jiān)聽器的實現(xiàn)邏輯,內(nèi)容略少,隨便撇兩眼,不是重點。前言
本文介紹監(jiān)聽器的相關(guān)邏輯。在服務(wù)引用和服務(wù)發(fā)現(xiàn)中監(jiān)聽器處于的位置請看下面的圖:
服務(wù)暴露:
服務(wù)引用:
這兩個監(jiān)聽器所做的工作不是很多,來看看源碼理解一下。
源碼分析 (一)ListenerInvokerWrapper該類實現(xiàn)了Invoker,是服務(wù)引用監(jiān)聽器的包裝類。
1.屬性/** * invoker對象 */ private final Invokerinvoker; /** * 監(jiān)聽器集合 */ private final List listeners;
用到了裝飾模式,其中很多實現(xiàn)方法直接調(diào)用了invoker的方法。
2.構(gòu)造方法public ListenerInvokerWrapper(Invokerinvoker, List listeners) { // 如果invoker為空則拋出異常 if (invoker == null) { throw new IllegalArgumentException("invoker == null"); } this.invoker = invoker; this.listeners = listeners; if (listeners != null && !listeners.isEmpty()) { // 遍歷監(jiān)聽器 for (InvokerListener listener : listeners) { if (listener != null) { try { // 調(diào)用在服務(wù)引用的時候進行監(jiān)聽 listener.referred(invoker); } catch (Throwable t) { logger.error(t.getMessage(), t); } } } } }
構(gòu)造方法中直接調(diào)用了監(jiān)聽器的服務(wù)引用。
3.destroy@Override public void destroy() { try { // 銷毀invoker invoker.destroy(); } finally { // 銷毀所有監(jiān)聽的實體域 if (listeners != null && !listeners.isEmpty()) { for (InvokerListener listener : listeners) { if (listener != null) { try { listener.destroyed(invoker); } catch (Throwable t) { logger.error(t.getMessage(), t); } } } } } }
該方法是把服務(wù)引用的監(jiān)聽器銷毀。
(二)InvokerListenerAdapterpublic abstract class InvokerListenerAdapter implements InvokerListener { /** * 引用服務(wù) * @param invoker * @throws RpcException */ @Override public void referred(Invoker> invoker) throws RpcException { } /** * 銷毀 * @param invoker */ @Override public void destroyed(Invoker> invoker) { } }
該類是服務(wù)引用監(jiān)聽器的適配類,沒有做實際的操作。
(三)DeprecatedInvokerListener@Activate(Constants.DEPRECATED_KEY) public class DeprecatedInvokerListener extends InvokerListenerAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(DeprecatedInvokerListener.class); @Override public void referred(Invoker> invoker) throws RpcException { // 當該引用的服務(wù)被廢棄時,打印錯誤日志 if (invoker.getUrl().getParameter(Constants.DEPRECATED_KEY, false)) { LOGGER.error("The service " + invoker.getInterface().getName() + " is DEPRECATED! Declare from " + invoker.getUrl()); } } }
該類是當調(diào)用廢棄的服務(wù)時候打印錯誤日志。
(四)ListenerExporterWrapper該類是服務(wù)暴露監(jiān)聽器包裝類。
1.屬性/** * 服務(wù)暴露者 */ private final Exporterexporter; /** * 服務(wù)暴露監(jiān)聽者集合 */ private final List listeners;
用到了裝飾模式,其中很多實現(xiàn)方法直接調(diào)用了exporter的方法。
2.構(gòu)造方法public ListenerExporterWrapper(Exporterexporter, List listeners) { if (exporter == null) { throw new IllegalArgumentException("exporter == null"); } this.exporter = exporter; this.listeners = listeners; if (listeners != null && !listeners.isEmpty()) { RuntimeException exception = null; // 遍歷服務(wù)暴露監(jiān)聽集合 for (ExporterListener listener : listeners) { if (listener != null) { try { // 暴露服務(wù)監(jiān)聽 listener.exported(this); } catch (RuntimeException t) { logger.error(t.getMessage(), t); exception = t; } } } if (exception != null) { throw exception; } } }
該方法中對于每個服務(wù)暴露進行監(jiān)聽。
3.unexport@Override public void unexport() { try { // 取消暴露 exporter.unexport(); } finally { if (listeners != null && !listeners.isEmpty()) { RuntimeException exception = null; // 遍歷監(jiān)聽集合 for (ExporterListener listener : listeners) { if (listener != null) { try { // 監(jiān)聽取消暴露 listener.unexported(this); } catch (RuntimeException t) { logger.error(t.getMessage(), t); exception = t; } } } if (exception != null) { throw exception; } } } }
該方法是對每個取消服務(wù)暴露的監(jiān)聽。
(五)ExporterListenerAdapterpublic abstract class ExporterListenerAdapter implements ExporterListener { /** * 暴露服務(wù) * @param exporter * @throws RpcException */ @Override public void exported(Exporter> exporter) throws RpcException { } /** * 取消暴露服務(wù) * @param exporter * @throws RpcException */ @Override public void unexported(Exporter> exporter) throws RpcException { } }
該類是服務(wù)暴露監(jiān)聽器的適配類,沒有做實際的操作。
后記該部分相關(guān)的源碼解析地址:https://github.com/CrazyHZM/i...
該文章講解了在服務(wù)引用和服務(wù)暴露中的各種listener監(jiān)聽器,其中內(nèi)容很少。接下來我將開始對rpc模塊的協(xié)議protocol進行講解。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72891.html
摘要:大揭秘異步化改造目標從源碼的角度分析的新特性中對于異步化的改造原理。看源碼解析四十六消費端發(fā)送請求過程講到的十四的,在以前的邏輯會直接在方法中根據(jù)配置區(qū)分同步異步單向調(diào)用。改為關(guān)于可以參考源碼解析十遠程通信層的六。 2.7大揭秘——異步化改造 目標:從源碼的角度分析2.7的新特性中對于異步化的改造原理。 前言 dubbo中提供了很多類型的協(xié)議,關(guān)于協(xié)議的系列可以查看下面的文章: du...
摘要:可以參考源碼解析二十四遠程調(diào)用協(xié)議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠程通信層的四。二十的可以參考源碼解析十七遠程通信的一。 2.7大揭秘——消費端發(fā)送請求過程 目標:從源碼的角度分析一個服務(wù)方法調(diào)用經(jīng)歷怎么樣的磨難以后到達服務(wù)端。 前言 前一篇文章講到的是引用服務(wù)的過程,引用服務(wù)無非就是創(chuàng)建出一個代理。供消費者調(diào)用服務(wù)的相關(guān)方法。...
摘要:而存在的意義就是保證請求或響應(yīng)對象可在線程池中被解碼,解碼完成后,就會分發(fā)到的。 2.7大揭秘——服務(wù)端處理請求過程 目標:從源碼的角度分析服務(wù)端接收到請求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費端發(fā)送請求的過程,該篇就要將服務(wù)端處理請求的過程。也就是當服務(wù)端收到請求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費端在發(fā)送請求的時候已經(jīng)做了編碼,所以我...
摘要:七該類也實現(xiàn)了,也是裝飾了接口,但是它是在服務(wù)引用和暴露過程中加上了監(jiān)聽器的功能。如果是注冊中心,則暴露該創(chuàng)建一個暴露者監(jiān)聽器包裝類對象該方法是在服務(wù)暴露上做了監(jiān)聽器功能的增強,也就是加上了監(jiān)聽器。 遠程調(diào)用——Protocol 目標:介紹遠程調(diào)用中協(xié)議的設(shè)計和實現(xiàn),介紹dubbo-rpc-api中的各種protocol包的源碼,是重點內(nèi)容。 前言 在遠程調(diào)用中協(xié)議是非常重要的一層,看...
摘要:服務(wù)暴露過程目標從源碼的角度分析服務(wù)暴露過程。導(dǎo)出服務(wù),包含暴露服務(wù)到本地,和暴露服務(wù)到遠程兩個過程。其中服務(wù)暴露的第八步已經(jīng)沒有了。將泛化調(diào)用版本號或者等信息加入獲得服務(wù)暴露地址和端口號,利用內(nèi)數(shù)據(jù)組裝成。 dubbo服務(wù)暴露過程 目標:從源碼的角度分析服務(wù)暴露過程。 前言 本來這一篇一個寫異步化改造的內(nèi)容,但是最近我一直在想,某一部分的優(yōu)化改造該怎么去撰寫才能更加的讓讀者理解。我覺...
閱讀 1824·2021-10-20 13:49
閱讀 1363·2019-08-30 15:52
閱讀 2869·2019-08-29 16:37
閱讀 1038·2019-08-29 10:55
閱讀 3073·2019-08-26 12:14
閱讀 1655·2019-08-23 17:06
閱讀 3239·2019-08-23 16:59
閱讀 2549·2019-08-23 15:42