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 等不同方式。
如何進行服務注冊和發現
服務注冊,需要服務提供者啟動后主動把服務注冊到注冊中心,注冊中心存儲了該服務的 IP、端口、調用方式(協議、序列化方式)等信息。