实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP
2.遠(yuǎn)程調(diào)用方式
無(wú)論是微服務(wù)還是SOA,都面臨著服務(wù)間的遠(yuǎn)程調(diào)用。那么服務(wù)間的遠(yuǎn)程調(diào)用方式有哪些呢?
常見(jiàn)的遠(yuǎn)程調(diào)用方式有以下幾種:
- RPC:Remote Produce Call遠(yuǎn)程過(guò)程調(diào)用,類似的還有RMI。自定義數(shù)據(jù)格式,基于原生TCP通信,速度快,效率高。早期的webservice,現(xiàn)在熱門的dubbo,都是RPC的典型
- Http:http其實(shí)是一種網(wǎng)絡(luò)傳輸協(xié)議,基于TCP,規(guī)定了數(shù)據(jù)傳輸?shù)母袷健,F(xiàn)在客戶端瀏覽器與服務(wù)端通信基本都是采用Http協(xié)議。也可以用來(lái)進(jìn)行遠(yuǎn)程服務(wù)調(diào)用。缺點(diǎn)是消息封裝臃腫。
- 現(xiàn)在熱門的Rest風(fēng)格,就可以通過(guò)http協(xié)議來(lái)實(shí)現(xiàn)。
2.1.認(rèn)識(shí)RPC
RPC,即 Remote Procedure Call(遠(yuǎn)程過(guò)程調(diào)用),是一個(gè)計(jì)算機(jī)通信協(xié)議。 該協(xié)議允許運(yùn)行于一臺(tái)計(jì)算機(jī)的程序調(diào)用另一臺(tái)計(jì)算機(jī)的子程序,而程序員無(wú)需額外地為這個(gè)交互作用編程。說(shuō)得通俗一點(diǎn)就是:A計(jì)算機(jī)提供一個(gè)服務(wù),B計(jì)算機(jī)可以像調(diào)用本地服務(wù)那樣調(diào)用A計(jì)算機(jī)的服務(wù)。
通過(guò)上面的概念,我們可以知道,實(shí)現(xiàn)RPC主要是做到兩點(diǎn):
- 實(shí)現(xiàn)遠(yuǎn)程調(diào)用其他計(jì)算機(jī)的服務(wù)
- 要實(shí)現(xiàn)遠(yuǎn)程調(diào)用,肯定是通過(guò)網(wǎng)絡(luò)傳輸數(shù)據(jù)。A程序提供服務(wù),B程序通過(guò)網(wǎng)絡(luò)將請(qǐng)求參數(shù)傳遞給A,A本地執(zhí)行后得到結(jié)果,再將結(jié)果返回給B程序。這里需要關(guān)注的有兩點(diǎn):
- 1)采用何種網(wǎng)絡(luò)通訊協(xié)議?
- 現(xiàn)在比較流行的RPC框架,都會(huì)采用TCP作為底層傳輸協(xié)議
- 2)數(shù)據(jù)傳輸?shù)母袷皆鯓?#xff1f;
- 兩個(gè)程序進(jìn)行通訊,必須約定好數(shù)據(jù)傳輸格式。就好比兩個(gè)人聊天,要用同一種語(yǔ)言,否則無(wú)法溝通。所以,我們必須定義好請(qǐng)求和響應(yīng)的格式。另外,數(shù)據(jù)在網(wǎng)路中傳輸需要進(jìn)行序列化,所以還需要約定統(tǒng)一的序列化的方式。
- 像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)
- 如果僅僅是遠(yuǎn)程調(diào)用,還不算是RPC,因?yàn)镽PC強(qiáng)調(diào)的是過(guò)程調(diào)用,調(diào)用的過(guò)程對(duì)用戶而言是應(yīng)該是透明的,用戶不應(yīng)該關(guān)心調(diào)用的細(xì)節(jié),可以像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)。所以RPC一定要對(duì)調(diào)用的過(guò)程進(jìn)行封裝
RPC調(diào)用流程圖:
想要了解詳細(xì)的RPC實(shí)現(xiàn),給大家推薦一篇文章:自己動(dòng)手實(shí)現(xiàn)RPChttps://legacy.gitbook.com/book/huge0612/tour-of-rpc/details
2.2.認(rèn)識(shí)Http
Http協(xié)議:超文本傳輸協(xié)議,是一種應(yīng)用層協(xié)議。規(guī)定了網(wǎng)絡(luò)傳輸?shù)恼?qǐng)求格式、響應(yīng)格式、資源定位和操作的方式等。但是底層采用什么網(wǎng)絡(luò)傳輸協(xié)議,并沒(méi)有規(guī)定,不過(guò)現(xiàn)在都是采用TCP協(xié)議作為底層傳輸協(xié)議。說(shuō)到這里,大家可能覺(jué)得,Http與RPC的遠(yuǎn)程調(diào)用非常像,都是按照某種規(guī)定好的數(shù)據(jù)格式進(jìn)行網(wǎng)絡(luò)通信,有請(qǐng)求,有響應(yīng)。沒(méi)錯(cuò),在這點(diǎn)來(lái)看,兩者非常相似,但是還是有一些細(xì)微差別。
- RPC并沒(méi)有規(guī)定數(shù)據(jù)傳輸格式,這個(gè)格式可以任意指定,不同的RPC協(xié)議,數(shù)據(jù)格式不一定相同。
- Http中還定義了資源定位的路徑,RPC中并不需要
- 最重要的一點(diǎn):RPC需要滿足像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù),也就是對(duì)調(diào)用過(guò)程在API層面進(jìn)行封裝。Http協(xié)議沒(méi)有這樣的要求,因此請(qǐng)求、響應(yīng)等細(xì)節(jié)需要我們自己去實(shí)現(xiàn)。
- 優(yōu)點(diǎn):RPC方式更加透明,對(duì)用戶更方便。Http方式更靈活,沒(méi)有規(guī)定API和語(yǔ)言,跨語(yǔ)言、跨平臺(tái)
- 缺點(diǎn):RPC方式需要在API層面進(jìn)行封裝,限制了開(kāi)發(fā)的語(yǔ)言環(huán)境。
例如我們通過(guò)瀏覽器訪問(wèn)網(wǎng)站,就是通過(guò)Http協(xié)議。只不過(guò)瀏覽器把請(qǐng)求封裝,發(fā)起請(qǐng)求以及接收響應(yīng),解析響應(yīng)的事情都幫我們做了。如果是不通過(guò)瀏覽器,那么這些事情都需要自己去完成。
2.3.如何選擇?
既然兩種方式都可以實(shí)現(xiàn)遠(yuǎn)程調(diào)用,我們?cè)撊绾芜x擇呢?
- 速度來(lái)看,RPC要比http更快,雖然底層都是TCP,但是http協(xié)議的信息往往比較臃腫,不過(guò)可以采用gzip壓縮。
- 難度來(lái)看,RPC實(shí)現(xiàn)較為復(fù)雜,http相對(duì)比較簡(jiǎn)單
- 靈活性來(lái)看,http更勝一籌,因?yàn)樗魂P(guān)心實(shí)現(xiàn)細(xì)節(jié),跨平臺(tái)、跨語(yǔ)言。
因此,兩者都有不同的使用場(chǎng)景:
- 如果對(duì)效率要求更高,并且開(kāi)發(fā)過(guò)程使用統(tǒng)一的技術(shù)棧,那么用RPC還是不錯(cuò)的。
- 如果需要更加靈活,跨語(yǔ)言、跨平臺(tái),顯然http更合適
那么我們?cè)撛趺催x擇呢?
微服務(wù),更加強(qiáng)調(diào)的是獨(dú)立、自治、靈活。而RPC方式的限制較多,因此微服務(wù)框架中,一般都會(huì)采用基于Http的Rest風(fēng)格服務(wù)。
3.Http客戶端工具
既然微服務(wù)選擇了Http,那么我們就需要考慮自己來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求和響應(yīng)的處理。不過(guò)開(kāi)源世界已經(jīng)有很多的http客戶端工具,能夠幫助我們做這些事情,例如:
- HttpClient
- OKHttp
- URLConnection
接下來(lái),我們就一起了解一款比較流行的客戶端工具:HttpClient
3.1.HttpClient
3.1.1.介紹
HttpClient是Apache公司的產(chǎn)品,是Http Components下的一個(gè)組件。
官網(wǎng)地址:http://hc.apache.org/index.html
特點(diǎn):
- 基于標(biāo)準(zhǔn)、純凈的Java語(yǔ)言。實(shí)現(xiàn)了Http1.0和Http1.1
- 以可擴(kuò)展的面向?qū)ο蟮慕Y(jié)構(gòu)實(shí)現(xiàn)了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)
- 支持HTTPS協(xié)議。
- 通過(guò)Http代理建立透明的連接。
- 自動(dòng)處理Set-Cookie中的Cookie。
發(fā)起get請(qǐng)求:
@Testpublic void testGet() throws IOException {HttpGet request = new HttpGet("http://www.baidu.com");String response = this.httpClient.execute(request, new BasicResponseHandler());System.out.println(response);}發(fā)起Post請(qǐng)求:
@Testpublic void testPost() throws IOException {HttpPost request = new HttpPost("http://www.oschina.net/");request.setHeader("User-Agent總結(jié)
以上是生活随笔為你收集整理的实现远程调用_微服务的那些事(三),微服务的远程调用方式。RPC和HTTP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: pr如何处理音效_Pr基础全通关:从0到
- 下一篇: 文字链接_新生命道目录及音频、文字链接(