1、定義
RPC-遠(yuǎn)程過程調(diào)用,是一種通信協(xié)議,允許調(diào)用不同進(jìn)程空間的程序,即調(diào)用另一個地址空間(通常是遠(yuǎn)程機(jī)器)的過程或函數(shù),就像調(diào)用本地函數(shù)/方法一樣
2、優(yōu)點(diǎn)
- 無論是客戶端還是服務(wù)端,不需要額外的定義,RPC直接調(diào)用
- RPC使用自定義的協(xié)議格式,減少冗余報文
- RPC采用更高效的序列化協(xié)議,將文本轉(zhuǎn)換為二進(jìn)制傳輸
- RPC更容易擴(kuò)展和集成
3、RPC框架處理的問題
- 兩個應(yīng)用程序部署在兩臺機(jī)器—選擇TCP協(xié)議或者HTTP協(xié)議
- 兩個應(yīng)用程序部署在一臺機(jī)器—選擇Unix Socket協(xié)議
- 報文編碼格式—選擇JSON或者XML
- 報文較大—選擇protobuf
4、注冊中心
客戶端和服務(wù)端互相不知道對方的存在,服務(wù)端啟動時,將自己注冊到注冊中心;客戶端調(diào)用時,從注冊中心獲取到所有可用的實(shí)例,選擇一個來調(diào)用。注冊中心還需要實(shí)現(xiàn)服務(wù)動態(tài)添加、刪除,使用心態(tài)確保服務(wù)處于可用狀態(tài)。
核心角色
- 服務(wù)端(Provider):啟動時向注冊中心注冊自己的地址和元數(shù)據(jù)
- 客戶端(Consumer):調(diào)用服務(wù)時從注冊中心獲取可用服務(wù)端地址
- 注冊中心(Registry):記錄服務(wù)地址并提供健康檢查(如 Consul、Etcd、ZooKeeper)
5、關(guān)鍵流程解析
服務(wù)注冊:
- 服務(wù)端啟動時將自己的地址(如 192.168.1.100:8080)和元數(shù)據(jù)(服務(wù)名稱、健康檢查接口)注冊到 Consul
- Consul 會定期調(diào)用健康檢查接口(如 /health),自動剔除故障節(jié)點(diǎn)
服務(wù)發(fā)現(xiàn):
- 客戶端不直接寫死服務(wù)端地址,而是向 Consul 查詢 math-service 的可用實(shí)例列表
- 客戶端通過負(fù)載均衡策略(隨機(jī)、輪詢、權(quán)重等)選擇一個可用地址進(jìn)行調(diào)用
解耦效果:
服務(wù)端無需知道客戶端的存在,只需關(guān)注自身服務(wù)實(shí)現(xiàn);客戶端無需維護(hù)服務(wù)端地址列表,動態(tài)感知服務(wù)實(shí)例變化;注冊中心統(tǒng)一管理服務(wù)拓?fù)潢P(guān)系。
6、場景模擬
假設(shè)有 3 個服務(wù)端實(shí)例:
math-service-1(192.168.1.101:8080)
math-service-2(192.168.1.102:8080)
math-service-3(192.168.1.103:8080)
當(dāng)客戶端調(diào)用時:
- Step1:通過 Consul 獲取到 3 個實(shí)例地址
- Step2:隨機(jī)選擇其中一個(如 math-service-2)發(fā)起 RPC 調(diào)用
- Step3:如果 math-service-2 宕機(jī),Consul 會在下次健康檢查時將其標(biāo)記為不可用
- Step4:客戶端下次發(fā)現(xiàn)時只會獲得剩余 2 個健康實(shí)例
7、關(guān)于GeeRPC
GeeRPC從零實(shí)現(xiàn)go語言官方的標(biāo)準(zhǔn)庫net/rpc,并在此基礎(chǔ)上增加協(xié)議交換、注冊中心、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、超時處理等模塊。