RPC和WebService的關(guān)系
RPC
(Remote Procedure Call)— 遠(yuǎn)程過(guò)程調(diào)用屠缭,是一個(gè)很大的概念, 它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上跨語(yǔ)言跨平臺(tái)的請(qǐng)求服務(wù)逆航,rpc能省略部分接口代碼的開(kāi)發(fā),可以跨機(jī)器之間訪問(wèn)對(duì)象(java rmi)风纠,可以有更方便的加密和更高效的數(shù)據(jù)傳輸性能, 而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議, RPC不僅可以走HTTP/HTTPS, 也可以自定義 tcp 協(xié)議, 從而省略HTTP繁雜的規(guī)則和冗余信息。
web service
接口實(shí)際上就是RPC調(diào)用的一種實(shí)現(xiàn),只考慮RPC的stub層實(shí)現(xiàn), soap restfull都是固定走HTTP/HTTPS, 都有定義了自己的規(guī)則和實(shí)現(xiàn)(xmll和json等), 規(guī)定了server能夠提供的服務(wù)(web service),也是跨語(yǔ)言跨平臺(tái)的摹恨。參考WebService的概訴
可以看到RPC模型中多了一個(gè)stub的組件,這個(gè)是約定的接口卓练,也就是server提供的服務(wù), web service就是基于這一層考慮了實(shí)現(xiàn)的, 至于調(diào)用的協(xié)議都是固定的, 注意這里的“接口”隘蝎,不是指JAVA中的interface,因?yàn)镽PC是跨平臺(tái)跨語(yǔ)言的襟企,用JAVA寫的客戶端嘱么,應(yīng)該能夠調(diào)用用C語(yǔ)言提供的過(guò)程。
目前常用的RPC框架:參考
dubbo --阿常用, 雖然現(xiàn)在都是 HSL
RMI
grpc
Hessian
HTTP2發(fā)布了, RPC什么時(shí)候需要實(shí)現(xiàn)自定義 tcp 協(xié)議呢?
HTTP1版本的Http(TCP)本身的三次握手協(xié)議顽悼,就會(huì)帶來(lái)大概1MS的延遲(emmm曼振,這個(gè)數(shù)據(jù)其實(shí)我有點(diǎn)不確定了,也可能是幾微秒蔚龙,很早之前做過(guò)測(cè)試)冰评。 每發(fā)送一次請(qǐng)求,都會(huì)有一次建立連接的過(guò)程木羹,加上Http 1報(bào)文本身的龐大甲雅,以及Json的龐大,業(yè)務(wù)量一大, 都需要作一些優(yōu)化坑填。
http2.0協(xié)議已經(jīng)優(yōu)化編碼效率問(wèn)題抛人,像grpc這種rpc庫(kù)使用的就是http2.0協(xié)議。
http容器的性能測(cè)試單位通常是kqps脐瑰,RPC自定義tpc協(xié)議則通常是以10kqps到100kqps為基準(zhǔn),不僅比HTTPS相比有些優(yōu)勢(shì), 還可以根據(jù)具體業(yè)務(wù)具體實(shí)現(xiàn), 良好的rpc調(diào)用是面向服務(wù)的封裝妖枚,針對(duì)服務(wù)的可用性和效率等都做了優(yōu)化。單純使用http調(diào)用則缺少了這些特性苍在。
RPC主要的作用是:
解決分布式系統(tǒng)中盅惜,服務(wù)之間的調(diào)用問(wèn)題。
遠(yuǎn)程調(diào)用時(shí)忌穿,要能夠像本地調(diào)用一樣方便抒寂,讓調(diào)用者感知不到遠(yuǎn)程調(diào)用的邏輯。
RPC主要是用在大型企業(yè)里面掠剑,因?yàn)榇笮推髽I(yè)里面系統(tǒng)繁多屈芜,業(yè)務(wù)線復(fù)雜,而且效率優(yōu)勢(shì)非常重要的一塊朴译,這個(gè)時(shí)候RPC的優(yōu)勢(shì)就比較明顯了井佑。
由于小型企業(yè)一般業(yè)務(wù)簡(jiǎn)單,不需要進(jìn)行分布式架構(gòu), 小型企業(yè)主要還是使用webservicer中的restfull webservic , 部分特殊業(yè)務(wù)會(huì)使用soap sercice