這么回答面試通過率提高60%,談?wù)勀銓PC框架的理解
有位工作6年的小伙伴,面試的時(shí)候被問到這樣一道題,說談你對RPC的理解。在分布式微服務(wù)架構(gòu)中,遠(yuǎn)程通信是最基本的需求。常見的遠(yuǎn)程通信方式有基于REST架構(gòu)的HTTP協(xié)議,以及基于RPC協(xié)議的RPC框架。今天,我給大家分享一下我的理解。
1、什么是RPC
首先,給大家介紹一下什么是遠(yuǎn)程調(diào)用。很多小伙伴會誤以為,遠(yuǎn)程調(diào)用是指跨越物理距離上的遠(yuǎn)程。實(shí)際上,準(zhǔn)確地說,遠(yuǎn)程調(diào)用是指跨進(jìn)程的功能調(diào)用。
跨進(jìn)程,可以理解為同一臺計(jì)算上的多個(gè)進(jìn)程、多個(gè)JVM或者多臺計(jì)算之間的進(jìn)程。
那什么是RPC呢?RPC的全稱是Remote Procedure Call,翻譯過來叫遠(yuǎn)程過程調(diào)用。
它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上獲取服務(wù),而不需要了解代碼網(wǎng)絡(luò)技術(shù)實(shí)現(xiàn)的一種協(xié)議。凡是符合這種協(xié)議的框架,都可以稱之為RPC框架。
通俗理解就是,A計(jì)算機(jī)提供一個(gè)服務(wù),B計(jì)算機(jī)可以像調(diào)用本地服務(wù)一樣去調(diào)用A計(jì)算機(jī)提供的服務(wù),這就是RPC的主要作用。
其實(shí),RPC的應(yīng)用在很早之前就出現(xiàn)了。在40年以前,也就是1981年的時(shí)候,由一家叫做Nelson的公司提出,并把它應(yīng)用到了分布式系統(tǒng)之間的通信協(xié)議。
2、RPC協(xié)議
要實(shí)現(xiàn)RPC,需要通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,并且對調(diào)用的過程進(jìn)行封裝?,F(xiàn)在比較流行的RPC框架一般都是采用TCP協(xié)議作為底層的傳輸協(xié)議。當(dāng)然,其他協(xié)議也是可以的,比如UDP。
RPC協(xié)議,強(qiáng)調(diào)的是過程調(diào)用,調(diào)用的過程對于用戶來說是完全透明的,用戶不需要關(guān)心調(diào)用細(xì)節(jié)??梢韵裾{(diào)用本地服務(wù)一樣去調(diào)用遠(yuǎn)程服務(wù)。
我們來看這樣一張圖。
一個(gè)完整的RPC協(xié)議包含了四個(gè)組件,分別是Client、Server、Client Stub和Sever Stub。
Client客戶端表示服務(wù)的調(diào)用方。
Sever服務(wù)端是真正的服務(wù)提供方。
Client Stub表示客戶端存根,專門用來存放服務(wù)端的地址信息,再將客戶端的請求參數(shù)打包成網(wǎng)絡(luò)消息,也就是序列化,然后通過網(wǎng)絡(luò)遠(yuǎn)程發(fā)送給服務(wù)提供方。
Server Stub表示服務(wù)端存根,用來接收客戶端發(fā)送過來的消息,然后,解析消息內(nèi)容,也就是反序列化,并且調(diào)用本地方法。
3、RPC的應(yīng)用場景
RPC在分布式系統(tǒng)中,有非常廣發(fā)的應(yīng)用,我給大家總結(jié)為5個(gè)方面:
1、分布式系統(tǒng)網(wǎng)絡(luò)通訊
2、分布式子系統(tǒng)之間的服務(wù)治理
3、分布式負(fù)載均衡和流控
4、服務(wù)發(fā)現(xiàn)與注冊
5、構(gòu)建分布式調(diào)試環(huán)境
【導(dǎo)航條:RPC框架】
(轉(zhuǎn)場,屏幕黑底白字,正中央出現(xiàn)“4 RPC框架)
4、RPC框架
在互聯(lián)網(wǎng)應(yīng)用開發(fā)中,隨著業(yè)務(wù)的復(fù)雜度增加,一般都會采用分布式架構(gòu)。分布式架構(gòu)的核心,就是利用多臺普通的計(jì)算機(jī)組成一個(gè)龐大的復(fù)雜計(jì)算網(wǎng)絡(luò),提供高并發(fā)、高性能、高可用的系統(tǒng)能力支撐。
在分布式架構(gòu)中,原本的單體應(yīng)用服務(wù)被拆分成多個(gè)獨(dú)立部署的服務(wù),分布式在計(jì)算機(jī)網(wǎng)絡(luò)上,這些服務(wù)必然,需要通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)通信和交互。而RPC框架,就是解決在分布式架構(gòu)中,各個(gè)服務(wù)之間的網(wǎng)絡(luò)通信問題的框架。
在Java應(yīng)用中,JDK 1.1版本的時(shí)候就提供了對RPC的支持框架,叫做RMI。由于RMI不能實(shí)現(xiàn)跨域語言的遠(yuǎn)程調(diào)用。
后面,廣發(fā)采用WebService來實(shí)現(xiàn)遠(yuǎn)程調(diào)用,但是,WebService需要定義非常復(fù)雜的Scheme文件,導(dǎo)致無效數(shù)據(jù)內(nèi)容過于臃腫。
之后,就被HTTP加JSON的方案所代替了。
RPC發(fā)展到現(xiàn)在,實(shí)現(xiàn)的方式也非常多樣,但是基本都實(shí)現(xiàn)了跨語言的遠(yuǎn)程調(diào)用。
一般來說,RPC框架都應(yīng)用于大型企業(yè),只有在業(yè)務(wù)復(fù)雜度和用戶體量都比較大的時(shí)候,需要對服務(wù)進(jìn)行解耦,從而達(dá)到擴(kuò)展性強(qiáng)、部署靈活的目的。目前比較流行的開源RPC框架有Goole的gRPC、Facebook的Thrift、Alibaba的Dubbo。這些框架除了提供基礎(chǔ)的遠(yuǎn)程通信功能以外,還會在系統(tǒng)性能、傳輸效率、服務(wù)治理等方面做出一些優(yōu)化設(shè)計(jì)。
比如,阿里開源的RPC框架Dubbo就提供了非常豐富的服務(wù)治理功能。
好了,相信各位小伙伴對于RPC又有了一個(gè)更加清晰的認(rèn)識和了解。面試的時(shí)候,如果被問到RPC的問題,是不是知道怎么了呢?以上就是我對RPC的理解。