分布式调用技术 RPC VS REST
?
一 分布式調(diào)用大體上就分為兩類,RPC式的,REST式的,兩者的區(qū)別主要是就是:
1. RPC是面向動(dòng)作的(方法調(diào)用)
2. REST是面向資源的(URL表示資源,HTTP動(dòng)詞表示動(dòng)作)
從變現(xiàn)形式來看,RPC的編程模型較重量級(jí),REST的編程模型更輕量級(jí)
?
二 REST vs RPC REST is not a framework like WCF, a protocol like HTTP, a framework like JAX-RS, or a communication format like SOAP. ?REST is an architecture, a structured way of representing a software solution - specifically, exposing aspects of a solution to a set of remote client-consumers. ?The central tenet of REST is that these aspects of a solution can be modeled as resources which the client can consume or act upon. ? This resource-oriented thinking, and not the implementation details of how one communicates between client and server, is what REST is actually all about. ?This is the key difference that separates actual RESTful APIs from RPC based on HTTP verbs. 三 ?接口調(diào)用通常包含兩個(gè)部分,序列化和通信協(xié)議。 常見的序列化協(xié)議包括json、xml、hession、protobuf、thrift、text、bytes等; 通信比較流行的是http、soap、websockect,RPC通常基于TCP實(shí)現(xiàn),常用框架例如dubbo,netty、mina、thrift。?
首先解釋下兩種接口調(diào)用:
Rest:嚴(yán)格意義上說接口很規(guī)范,操作對(duì)象即為資源,對(duì)資源的四種操作(post、get、put、delete),并且參數(shù)都放在URL上,
? ? ? ? ?但是不嚴(yán)格的說Http+json、Http+xml,常見的http api都可以稱為Rest接口。
Rpc: ? 我們常說的遠(yuǎn)程方法調(diào)用,就是像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,通信協(xié)議大多采用二進(jìn)制方式
?
四 ?http vs 高性能二進(jìn)制協(xié)議
? ? ? http相對(duì)更規(guī)范,更標(biāo)準(zhǔn),更通用,無論哪種語言都支持http協(xié)議。
? ? ? ?如果你是對(duì)外開放API,例如開放平臺(tái),外部的編程語言多種多樣,你無法拒絕對(duì)每種語言的支持,
? ? ? ?相應(yīng)的,如果采用http,無疑在你實(shí)現(xiàn)SDK之前,支持了所有語言,
? ? ? ?所以,現(xiàn)在開源中間件,基本最先支持的幾個(gè)協(xié)議都包含RESTful。
? ? RPC協(xié)議性能要高的多,例如Protobuf、Thrift、Kyro等,
? ? (如果算上序列化)吞吐量大概能達(dá)到http的二倍。響應(yīng)時(shí)間也更為出色。
? ? ? 千萬不要小看這點(diǎn)性能損耗,公認(rèn)的,微服務(wù)做的比較好的,例如,netflix、阿里,曾經(jīng)都傳出過為了提升性能而合并服務(wù)。
? ? ? 如果是交付型的項(xiàng)目,性能更為重要,因?yàn)槟阗u給客戶往往靠的就是性能上微弱的優(yōu)勢(shì)。
? ? ?
? 無論是Google、Amazon、netflix(據(jù)說很可能轉(zhuǎn)向grpc),還是阿里,實(shí)際上內(nèi)部都是采用性能更高的RPC方式。而對(duì)外開放的才是RESTful。
? Rest 調(diào)用及測(cè)試都很方便,Rpc就顯得有點(diǎn)麻煩,但是Rpc的效率是毋庸置疑的,所以建議在多系統(tǒng)之間采用Rpc,對(duì)外提供服務(wù),Rest是很適合的
? duboo在生產(chǎn)者和消費(fèi)者兩個(gè)微服務(wù)之間的通信采用的就是Rpc,無疑在服務(wù)之間的調(diào)用Rpc更變現(xiàn)的優(yōu)秀
?
五 ?Rpc在微服務(wù)中的使用
1、 RPC 框架是架構(gòu)微服務(wù)化的首要基礎(chǔ)組件 ,
? ? ? ? ? 它能大大降低架構(gòu)微服務(wù)化的成本,提高調(diào)用方與服務(wù)提供方的研發(fā)效率,屏蔽跨進(jìn)程調(diào)用函數(shù)(服務(wù))的各類復(fù)雜細(xì)節(jié)
2、RPC 框架的職責(zé)是:
? ? ? ? ? 讓調(diào)用方感覺就像調(diào)用本地函數(shù)一樣調(diào)用遠(yuǎn)端函數(shù)、讓服務(wù)提供方感覺就像實(shí)現(xiàn)一個(gè)本地函數(shù)一樣來實(shí)現(xiàn)服務(wù)
?
?
RPC的好處:
? ? ?RPC 的主要功能目標(biāo)是讓構(gòu)建分布式計(jì)算(應(yīng)用)更容易,在提供強(qiáng)大的遠(yuǎn)程調(diào)用能力時(shí)不損失本地調(diào)用的語義簡(jiǎn)潔性。
? ? ?為實(shí)現(xiàn)該目標(biāo),RPC 框架需提供一種透明調(diào)用機(jī)制讓使用者不必顯式的區(qū)分本地調(diào)用和遠(yuǎn)程調(diào)用。
? ?? 服務(wù)化的一個(gè)好處就是,不限定服務(wù)的提供方使用什么技術(shù)選型,能夠?qū)崿F(xiàn)大公司跨團(tuán)隊(duì)的技術(shù)解耦。?
? ? ?如果沒有統(tǒng)一的服務(wù)框架,RPC框架,
? ? ? ? ? 各個(gè)團(tuán)隊(duì)的服務(wù)提供方就需要各自實(shí)現(xiàn)一套序列化、反序列化、網(wǎng)絡(luò)框架、連接池、收發(fā)線程、超時(shí)處理、狀態(tài)機(jī)等“業(yè)務(wù)之外”的重復(fù)技術(shù)勞動(dòng),造成整體的低效。
? ? 所以,統(tǒng)一RPC框架把上述“業(yè)務(wù)之外”的技術(shù)勞動(dòng)統(tǒng)一處理,是服務(wù)化首要解決的問題。
六 幾種協(xié)議
? Socket使用時(shí)可以指定協(xié)議Tcp,Udp等;
? RIM使用Jrmp協(xié)議,Jrmp又是基于TCP/IP;
? RPC底層使用Socket接口,定義了一套遠(yuǎn)程調(diào)用方法;
? HTTP是建立在TCP上,不是使用Socket接口,需要連接方主動(dòng)發(fā)數(shù)據(jù)給服務(wù)器,服務(wù)器無法主動(dòng)發(fā)數(shù)據(jù)個(gè)客戶端;
? Web Service提供的服務(wù)是基于web容器的,底層使用http協(xié)議,類似一個(gè)遠(yuǎn)程的服務(wù)提供者,
? ? ? ?比如天氣預(yù)報(bào)服務(wù),對(duì)各地客戶端提供天氣預(yù)報(bào),是一種請(qǐng)求應(yīng)答的機(jī)制,是跨系統(tǒng)跨平臺(tái)的。
? ? ? ?就是通過一個(gè)servlet,對(duì)外提供服務(wù)。
?hessian是一套用于建立web service的簡(jiǎn)單的二進(jìn)制協(xié)議,
? ? ? 用于替代基于XML的web service,
? ? ? 是建立在rpc上的,hessian有一套自己的序列化格式將數(shù)據(jù)序列化成流,然后通過http協(xié)議發(fā)送給服務(wù)器
?
在微服務(wù)架構(gòu)中,各個(gè)服務(wù)之間可能千差萬別,rest接口更加靈活,如果使用RPC則會(huì)有很多約束
參考: 1?https://sites.google.com/site/wagingguerillasoftware/rest-series/what-is-restful-rest-vs-rpc 2?https://blog.csdn.net/iter_zc/article/details/39341983 3?https://blog.csdn.net/king866/article/details/54174665?
總結(jié)
以上是生活随笔為你收集整理的分布式调用技术 RPC VS REST的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS9系统下SEGV_ACCERR问题
- 下一篇: 在django restful fram