dubbo分層,rpc和http區別,dubbo的服務暴露


RPC 就是 Remote Procedure Call,遠程過程調用

1、和http的區別

HTTP 只是應用層的傳輸協議,協議只是規范了一定的交流格式。http相當於國際通用方案,因為通用所以信息臃腫。

  • 大量的HTTP頭等信息。
  • 其次是效率低,還是因為第七層的緣故,必須按照HTTP協議進行層層封裝。

RPC是一個完整的遠程調用方案,它包括了:接口規范+序列化反序列化規范+通信協議。RPC相當於定制協議,

 

2、dubbo的分層和各層的作用

 

 

 

 

 

大的三層分別為 Business(業務層)、RPC 層、Remoting(遠程調用層),並且還分為 API 層和 SPI 層。

分為大三層其實就是和我們知道的網絡分層一樣的意思,只有層次分明,職責邊界清晰才能更好的擴展

而分 API 層和 SPI 層這是 Dubbo 成功的一點,采用微內核設計+SPI擴展,使得有特殊需求的接入方可以自定義擴展,做定制的二次開發。

接下來咱們再來看看每一層都是干嘛的。

 

  • Service,業務層,就是咱們開發的業務邏輯層。

  • Config,配置層,主要圍繞 ServiceConfig 和 ReferenceConfig,初始化配置信息。

  • Proxy,代理層,服務提供者還是消費者都會生成一個代理類(javassist動態代理),使得服務接口透明化,代理層做遠程調用和返回結果。

  • Register,注冊層,封裝了服務注冊和發現。

  • Cluster,路由和集群容錯層,負責選取具體調用的節點,處理特殊的調用要求和負責遠程調用失敗的容錯措施。

  • Monitor,監控層,負責監控統計調用時間和次數。

  • Portocol,遠程調用層,主要是封裝 RPC 調用,主要負責管理 Invoker,Invoker代表一個抽象封裝了的執行體,之后再做詳解。

  • Exchange,信息交換層,用來封裝請求響應模型,同步轉異步(通過futuer.get()),每個request都要一個id,response就是通過id去找對應的結果

  • Transport,網絡傳輸層,抽象了網絡傳輸的統一接口,這樣用戶想用 Netty 就用 Netty,想用 Mina 就用 Mina。

  • Serialize,序列化層,將數據序列化成二進制流,當然也做反序列化。

 

3、dubbo的服務暴露

a、首先dubbo是采用 URL 的方式來作為約定的參數類型,被稱為公共契約

protocol://username:password@host:port/path?key=value&key=value

URL 具體的參數如下:

  • protocol:指的是 dubbo 中的各種協議,如:dubbo thrift http
  • username/password:用戶名/密碼
  • host/port:主機/端口
  • path:接口的名稱
  • parameters:參數鍵值對

b、利用Spring掃描配置文件了生成 Spring 的 BeanDefinition,然后利用 Spring 最終創建對應的對象。

c、時機:服務的暴露起始於 Spring IOC 容器刷新完畢之后,會根據配置參數組裝成 URL, 然后根據 URL 的參數來進行本地或者遠程調用

d、再利用 Dubbo SPI 機制根據 URL 的參數選擇對應的實現類,實現擴展

e、通過 javassist 動態封裝 ref (你寫的服務實現類),統一暴露出 Invoker 使得調用方便,屏蔽底層實現細節,然后封裝成 exporter 存儲起來,等待消費者的調用,並且會將 URL 注冊到注冊中心,使得消費者可以獲取服務提供者的信息。

參考:https://mp.weixin.qq.com/s/ISiN06QynyE2pPtX3cGQ9w

https://mp.weixin.qq.com/s/ISiN06QynyE2pPtX3cGQ9w

 

4、服務的引入

和服務暴露,在 Spring 容器刷新完成之后開始暴露,而服務的引入時機有兩種,第一種是餓漢式,第二種是懶漢式

餓漢式是通過實現 Spring 的InitializingBean接口中的 afterPropertiesSet方法,容器通過調用 ReferenceBean的 afterPropertiesSet方法時引入服務。

懶漢式是只有當這個服務被注入到其他類中時啟動引入流程,也就是說用到了才會開始服務引入。

默認情況下,Dubbo 使用懶漢式引入服務,如果需要使用餓漢式,可通過配置 dubbo:reference 的 init 屬性開啟。

 

a、服務引入的3中模式---本地引入,直接遠程引入,注冊中心引入

 

 

 直連遠程引入服務,這個其實就是平日測試的情況下用用,不需要啟動注冊中心,由 Consumer 直接配置寫死 Provider 的地址,然后直連即可。

注冊中心引入遠程服務,這個就是重點了,Consumer 通過注冊中心得知 Provider 的相關信息,然后進行服務的引入,這里還包括多注冊中心,同一個服務多個提供者的情況,如何抉擇如何封裝,如何進行負載均衡、容錯並且讓使用者無感知,這就是個技術活。

 

流程:

1、簡述一下就是先檢查配置,通過配置構建一個 map ,然后利用 map 來構建 URL ,再通過 URL 上的協議利用自適應擴展機制調用對應的 protocol.refer 得到相應的 invoker 。

2、判斷到底是本地調用、遠程調用、還是注冊中心調用。如果是注冊中心,訂閱注冊中心相關信息,得到遠程 provider的 ip 等信息,再通過netty客戶端進行連接。

2、然后再構建代理,封裝 invoker 返回服務引用,之后 Comsumer 調用的就是這個代理類。

 

4、服務的調用過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM