Dubbo學習資料
RPC介紹
-
什麼是RPC?
RPC(Remote Procedure Call)遠端過程呼叫。見名知意 - 從遠端主機呼叫一個過程/函式。
RPC的目標是:使得本程式呼叫其它遠端主機上的函式,好像呼叫本程式內的函式一樣簡單,並且遮蔽程式語言的差異性。
要實現上述目標首先是設計一種通訊協議,稱之為:RPC協議(Protocol)- RPC協議不是一個具體的協議,而是一個型別名,代表一類協議,這類協議叫做RPC協議;
- RPC協議在TCP/UDP之上,廣義上可以跨越平臺、語言進行應用間通訊(說廣義是因為可以開發一個協議且不支援跨語言);
-
為什麼要用RPC?
其實這是應用開發到一定的階段的強烈需求驅動的。-
如果我們開發簡單的單一應用,邏輯簡單、使用者不多、流量不大,那我們用不著;
-
當我們的系統訪問量增大、業務增多時,我們會發現一臺單機執行此係統已經無法承受。此時,我們可以將業務拆分成幾個互不關聯的應用,分別部署在各自機器上,以劃清邏輯並減小壓力。此時,我們也可以不需要RPC,因為應用之間是互不關聯的。
-
當我們的業務越來越多、應用也越來越多時,自然的,我們會發現有些功能已經不能簡單劃分開來或者劃分不出來。此時,可以將公共業務邏輯抽離出來,將之組成獨立的服務Service應用 。而原有的、新增的應用都可以與那些獨立的Service應用 互動,以此來完成完整的業務功能。所以此時,我們急需一種高效的應用程式之間的通訊手段來完成這種需求,所以你看,RPC大顯身手的時候來了!
其實
#3
描述的場景也是服務化 、微服務 和分散式系統架構 的基礎場景。即RPC框架就是實現以上結構的有力方式。 -
-
有哪些RPC?
有很多RPC框架:CORBAR、Thrift、Dubbo等等。基本上他們分為兩種類別:- 一種是跨語言的;
- 一種是同語言的,如果你的分散式應用架構主體都是Java應用,顯然我們不應該使用跨語言的RPC來多一層中轉浪費效率。
就Java來說,我認為其本身API提供的
RMI
就是一種RPC協議,但是其畢竟太原始,需要自己去新增很多機制才能上生產環境。所以,今天介紹下我最近使用的Dubbo框架。
-
dubbo常用配置總結
1、關閉啟動時檢查
Dubbo預設會在啟動時檢查依賴的服務是否可用,不可用會丟擲異常,阻止Spring初始化完成。如果對有些服務不關心,或者出現了迴圈依賴,必須有一方先啟動時,可以關閉啟動時檢查。方式如下:
<dubbo:reference interface="com.xxx.XxxService" check="false" />
2、引用預設還是延遲初始化的,只有引用被注入到其它Bean,或者被getBean()獲取時,才會初始化。如果需要飢餓載入,即Dubbo啟動時就立即生成動態代理例項,則可以配置:
<dubbo:reference interface="com.xx.XxxService" init="true" />
3、給dubbo介面新增白名單——dubbo Filter的使用
4、有時候你的服務在本地開發測試時需要註冊到註冊中心,但又沒有完全做完的時候,如果就這樣註冊上去,其他消費者在呼叫該服務時,就會偶爾的呼叫到你本地的服務,這樣就報錯了。
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" register="false"/>
在<dubbo:registry >最後新增register="false",這樣別人就不會調你的本地服務,但你的本地服務所訂閱的服務正常執行。
5、直連提供者
開發測試環境下,需要繞過註冊中心,直接測試服務提供者
<dubbo:reference interface="com.changhf.service.DeptmentService" id="deptmentService" check="false" url="dubbo://192.168.1.1:20881"/>
serviceImpl里加個斷點,每次訪問都會走斷點。在管控臺本地服務介面最後點選禁用,還是可以正常訪問,說明繞過了註冊中心。
6、服務分組,可實現服務的穩步升級
<dubbo:service interface="com.changhf.service.IDubboGroupService" ref="dubboGroup1Service" group="feedback2"/>
<dubbo:reference interface="com.changhf.service.IDubboGroupService" id="dubboGroup1Service" check="false" group="feedback2"/>
group屬性為該服務介面新增一個分組,消費者就只會呼叫同一分組的服務介面了。
也可以用version屬性來替代:
<dubbo:service interface="com.changhf.service.DeptmentService" ref="deptmentService" version="2.0"/>
<dubbo:reference interface="com.changhf.service.DeptmentService" id="deptmentService" check="false" version="2.0"/>