如何實現一個分布式RPC框架?
1.定義:
明確下RPC是什么?PRC全稱是Remote Procedure Call,是進程間的一種通信方式。
2.解決的問題
進程間調用就像本地調用函數一樣簡單,而業務層不需要去關心通信的細。
3.組成
在Nelson的論文Implementing Remote Procedurr Calls有論述,見圖1
User 調用方
User-Stub 消息拼裝,編解碼
RPCRuntime 發送,接受消息
Service-Stub 消息拼裝,編解碼
Server 服務方
4.核心實現
從圖中可以看出我們需要實現Stub和RPCRuntime的功能。
Stub:主要功能是消息格式怎么定義和編解碼。
消息格式:一般需要設計消息頭和消息體,當然越簡潔越好,提高傳輸效率
編解碼:二進制最高效,可以使用Protocol Buffers,Thrift。當然也可以使用可讀性比較好的JSON,XML。
RPCRuntime主要負責通信,這里涉及到選擇什么IO模型,BIO,NIO還是AIO,可以使用netty來實現NIO功能。
5.開源實現
了解開源實現,更能促進自研的成熟穩定。當然看需求是否需要自研,一般開源就可以滿足需求了。
比較好的開源實現有Dubbo,brpc,grpc,Thrift,Hessian等
6.小結
雖然RPC說起來只是進程間的通信,但是RPC服務怎么注冊,發現,路由這些都還是需要考慮的。再者畢竟是網絡傳輸,就有可能出現延遲,丟包的情況,容錯性也需要多考慮考慮。這里再把RPC調用描述的全一點,見圖2。圖中的clinet,sever只和agent交互,agent就包含了Stub和RPCRuntime的功能,一般這里的agent實現為一個jar包,和應用程序部署在一起。
現在Service Mesh也越來越成熟了,Service Mesh把agent獨立為一個進程部署(必須和業務同一機器),這樣降低了耦合性,同時業務和平臺獨立,開發迭代速度也更快。提到Service Mesh的開源實現必提Istio。圖3是Istio官網的架構圖。
希望回答對你有幫助,記得點個贊哦,謝謝。也可以關注我,后面會分享一些架構的知識。