摘要:服務提供者代碼上面這個類會被封裝成為一個實例,并新生成一個實例。這樣當網絡通訊層收到一個請求后,會找到對應的實例,并調用它所對應的實例,從而真正調用了服務提供者的代碼。
這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進行源碼學習??偨Y起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構圖先畫出來.讓讀者拿著"地圖"跟著我的腳步,并且每一步我都提醒,現在我們在哪,我們下一步要做什么,這樣才不會迷失方向。
總體概述
首先是總體出發了解整體的架構,涉及到概念,在學習dubbo會更加理解透徹。
下面對上面這張圖做簡要的分析:
(1)cluster是集群,主要是
概念:
Invoker 是實體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起 invoke 調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集群實現。它里面有一個很重要的方法 Result invoke(Invocation invocation)。
Invocation是會話域,它持有調用過程中的變量,比如方法名,參數等重要信息。
它有2種類型的Invoker
1.本地執行類的Invoker server端:比如有一個dubbo接口demoService.sayHello,在本項目中執行 demoService.sayHello,就通過InjvmExporter來進行反射執行demoService.sayHello就可以了。
2.遠程通信類的Invoker
client端:要執行 demoService.sayHello,它封裝了DubboInvoker進行遠程通信,發送要執行的接口給server端。 server端:采用了AbstractProxyInvoker執行了DemoServiceImpl.sayHello,然后將執行結果返回發送給client.
按服務提供、服務消費分類
引用官方文檔:分為服務提供 Invoker 和服務消費 Invoker
為了更好的解釋上面這張圖,我們結合服務消費和提供者的代碼示例來進行說明:
服務消費者代碼:
public class DemoClientAction { private DemoService demoService; public void setDemoService(DemoService demoService) { this.demoService = demoService; } public void start() { String hello = demoService.sayHello("world" + i); } }
上面代碼中的 DemoService 就是上圖中服務消費端的 proxy,用戶代碼通過這個 proxy 調用其對應的 Invoker [5],而該 Invoker 實現了真正的遠程服務調用。
服務提供者代碼:
public class DemoServiceImpl implements DemoService { public String sayHello(String name) throws RemoteException { return "Hello " + name; } }
上面這個類會被封裝成為一個 AbstractProxyInvoker 實例,并新生成一個 Exporter 實例。這樣當網絡通訊層收到一個請求后,會找到對應的 Exporter 實例,并調用它所對應的 AbstractProxyInvoker 實例,從而真正調用了服務提供者的代碼。
Invoker繼承關系
概念
簡單來說,Directory就是裝載invoker的文件目錄
兩個重要Directory
StaticDirectory:靜態目錄服務,他的Invoker是固定的。
RegistryDirectory:注冊目錄服務,他的Invoker集合數據來源于zk注冊中心的,他實現了NotifyListener接口,這個接口中的notify方法就是注冊中心的回調,也就是它之所以能根據注冊中心動態變化的根源所在.。
整個過程有一個重要的map變量,methodInvokerMap(它是數據的來源;同時也是notify的重要操作對象,重點是寫操作。)
概念
利用Router,可以從多個服務提者方中選擇一個進行調用
分類
主要是3個實現類:
ConditionRouter(條件路由):條件路由主要就是根據dubbo管理控制臺配置的路由規則來過濾相關的invoker
MockInvokersSelector:主要根據參數,判斷是否需要篩選出正常的(非mock的)invoker 或者 mock的invoker
ScriptRouter(腳本路由):待補充
例子
參考:org.apache.dubbo.rpc.cluster.router.script.ScriptRouterTest
概念
與Router功能類似,利用負載均衡策略(random,roundrobin,leastactive),從多個服務提者方中選擇一個進行調用
概念
Protocol 是服務域,它是 Invoker 暴露和引用的主功能入口,它負責 Invoker 的生命周期管理。
再接下來給大家一張"地圖","地圖"上我已經標記了序號,再下面的源碼分析中,我也會實時提醒我們所在的位置,以至于不會迷失方向.
消費方調用過程中,dubbo究竟做了什么?
a、在Directory中找出本次集群中的全部invokers
b、在Router中,將上一步的全部invokers挑選出滿足條件的invokers
c、在LoadBalance中,將上一步的能正常的執行invokers中,根據配置的負載均衡策略,挑選出需要執行的invoker
后面開始,就是正式的源碼閱讀(環境搭建這些略過)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72101.html
摘要:上一篇源碼解析概要篇中我們了解到中的一些概念及消費端總體調用過程。由于在生成代理實例的時候,在構造函數中賦值了,因此可以只用該進行方法的調用。 上一篇 dubbo源碼解析——概要篇中我們了解到dubbo中的一些概念及消費端總體調用過程。本文中,將進入消費端源碼解析(具體邏輯會放到代碼的注釋中)。本文先是對消費過程的總體代碼邏輯理一遍,個別需要細講的點,后面會專門的文章進行解析。...
摘要:屬性上篇文章中,提到在獲取擴展點接口對應的的時候,會執行私有構造函數。因為此時是,即當為時,即我們可以看出,所有非擴展點接口都會執行對應的實例的方法返回一個實例,即對象。 spring是如何獲得容器中管理的類的 拿到applicationContext,就可以調用getBean方法來獲得Spring的bean對象了 public class SpringContextUtil impl...
摘要:二注解該注解為了保證在內部調用具體實現的時候不是硬編碼來指定引用哪個實現,也就是為了適配一個接口的多種實現,這樣做符合模塊接口設計的可插拔原則,也增加了整個框架的靈活性,該注解也實現了擴展點自動裝配的特性。 Dubbo擴展機制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對dubbo整個項目大體的介紹,而從這篇文章開始,我將會從源碼來解讀dubbo再各個模塊的實...
摘要:而存在的意義就是保證請求或響應對象可在線程池中被解碼,解碼完成后,就會分發到的。 2.7大揭秘——服務端處理請求過程 目標:從源碼的角度分析服務端接收到請求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費端發送請求的過程,該篇就要將服務端處理請求的過程。也就是當服務端收到請求數據包后的一系列處理以及如何返回最終結果。我們也知道消費端在發送請求的時候已經做了編碼,所以我...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
閱讀 3890·2021-10-08 10:05
閱讀 2973·2021-09-27 13:57
閱讀 2698·2019-08-29 11:32
閱讀 1022·2019-08-28 18:18
閱讀 1316·2019-08-28 18:05
閱讀 2001·2019-08-26 13:39
閱讀 879·2019-08-26 11:37
閱讀 2061·2019-08-26 10:37