如何理解 RPC 遠程服務調用?

 

RPC 遠程服務調用是分佈式服務架構的基礎。程序員

如何理解 RPC

RPC(Remote Procedure Call)是一種進程間通訊方式,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。算法

RPC 容許程序調用另外一個地址空間的過程或函數,而不用程序員顯式編碼這個遠程調用的細節。即不管是調用本地接口/服務的仍是遠程的接口/服務,本質上編寫的調用代碼基本相同。編程

好比兩臺服務器 A、B,一個應用部署在 A 服務器上,想要調用 B 服務器上應用提供的函數或者方法,因爲不在一個內存空間,則不能直接調用,這時候就能夠應用 RPC 框架的實現來解決。緩存

常見RPC 框架

Apache Dubbo

Dubbo 是阿里開源,目前已經成爲 Apache 頂級項目。Dubbo 能夠經過高性能的 RPC 實現服務的輸出和輸入,支持服務治理,提供了控制檯界面,能夠獨立應用,也能夠和 Spring 框架無縫集成。服務器

Dubbo 在設計中採用了微內核架構,基於對 Java SPI 機制的擴展實現,Dubbo 對分佈式服務調用核心功能都開放了擴展點,包括服務調用的負載均衡策略、序列化協議、傳輸協議等,使用者均可以添加自定義實現。網絡

Google 的 gRPC

gRPC 是 Google 開發的高性能、通用的開源 RPC 框架,gRPC 使用 ProtoBuf 來定義服務,ProtoBuf 是 Google 開發的一種數據序列化協議,性能比較高,壓縮和傳輸效率高,語法也比較簡單。另外,gRPC 支持多種語言,並可以基於語言自動生成客戶端和服務端功能庫。數據結構

Apache Thrift

Thrift 起源於 Facebook,和 Dubbo 同樣,後來被提交 Apache 基金會將 Thrift 做爲一個開源項目。Facebook 創造 Thrift 的目的是爲了解決 Facebook 各系統間大數據量的傳輸通訊,以及系統間語言環境不一樣須要跨平臺的問題。架構

Thrift 支持多種編程語言,如 Java、C++、Python、PHP、Ruby 等,能夠在多種不一樣的語言之間通訊。應用 Thrift,須要在一個語言無關的 IDL 文件裏,定義數據類型和服務接口,而後生成用來構建 RPC 客戶和服務器所需的代碼。負載均衡

Thrift 主要的優勢是跨語言;缺點是,因爲須要定義獨立的 IDL 文件,若是對服務進行修改,當數據結構發生變化時,必須從新編輯 IDL 文件、從新編譯和生成相關的代碼,修改起來比較繁瑣。框架

RPC 框架用到哪些技術

如何創建通訊

實現分佈式服務框架,首先要解決不一樣節點之間通信的問題,須要在客戶端和服務器之間創建 TCP 鏈接,遠程過程調用的全部交換的數據都在這個鏈接裏傳輸。

通常來講,創建通訊可使用成熟的網絡通訊框架,好比 Java 語言中的 Netty。在 Dubbo中就應用了 Netty。

如何進行網絡傳輸

創建通訊以後,節點之間數據傳輸採用什麼協議,也就是選擇什麼樣的二進制數據格式組織;傳輸的數據如何序列化和反序列化,好比在 Dubbo 中,傳輸協議默認使用 Dubbo 協議,序列化支持選擇 Hessian、Kryo、Protobuf 等不一樣方式。

如何進行服務註冊和發現

服務註冊和發現,也就是服務尋址,以 Dubbo 爲例,下圖分佈式服務典型的尋址和調用過程:

 

 

服務註冊,須要服務提供者啓動後主動把服務註冊到註冊中心,註冊中心存儲了該服務的 IP、端口、調用方式(協議、序列化方式)等信息。

服務發現,當服務消費者第一次調用服務時,會經過註冊中心找到相應的服務提供方地址列表,並緩存到本地,以供後續使用。當消費者再次調用服務時,不會再去請求註冊中心,而是直接經過負載均衡算法從 IP 列表中取一個服務提供者調用服務。

相關文章
相關標籤/搜索