.NET Core微服务之服务间的调用方式(REST and RPC)
一、REST or RPC ?
1.1 REST & RPC
微服務(wù)之間的接口調(diào)用通常包含兩個部分,序列化和通信協(xié)議。常見的序列化協(xié)議包括json、xml、hession、protobuf、thrift、text、bytes等;通信比較流行的是http、soap、websockect,RPC通常基于TCP實現(xiàn),常用框架例如dubbo,netty、mina、thrift。
REST:嚴(yán)格意義上說接口很規(guī)范,操作對象即為資源,對資源的四種操作(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é)議大多采用二進制方式。
1.2 HTTP vs 高性能二進制協(xié)議
HTTP相對更規(guī)范,更標(biāo)準(zhǔn),更通用,無論哪種語言都支持HTTP協(xié)議。如果你是對外開放API,例如開放平臺,外部的編程語言多種多樣,你無法拒絕對每種語言的支持,相應(yīng)的,如果采用HTTP,無疑在你實現(xiàn)SDK之前,支持了所有語言,所以,現(xiàn)在開源中間件,基本最先支持的幾個協(xié)議都包含RESTful。
RPC協(xié)議性能要高的多,例如Protobuf、Thrift、Kyro等,(如果算上序列化)吞吐量大概能達到http的二倍。響應(yīng)時間也更為出色。千萬不要小看這點性能損耗,公認(rèn)的,微服務(wù)做的比較好的,例如,netflix、阿里,曾經(jīng)都傳出過為了提升性能而合并服務(wù)。如果是交付型的項目,性能更為重要,因為你賣給客戶往往靠的就是性能上微弱的優(yōu)勢。
所以,最佳實踐一般是對外REST,對內(nèi)RPC,但是追求極致的性能會消耗很多額外的成本,所以一般情況下對內(nèi)一般也REST,但對于個別性能要求較高的接口使用RPC。
二、案例結(jié)構(gòu)
這里假設(shè)有兩個服務(wù),一個ClinetService和一個PaymentService,其中PaymentService有兩部分,一部分是基于REST風(fēng)格的WebApi部分,它主要是負(fù)責(zé)一些對性能沒有要求的查詢服務(wù),另一部分是基于TCP的RPC Server,它主要是負(fù)責(zé)一些對性能要求高的服務(wù),比如支付和支出等涉及到錢的接口。假設(shè)User在消費ClientService時需要調(diào)用PaymentService根據(jù)客戶賬戶獲取Payment History(走REST)以及進行交易事務(wù)操作(走RPC)。
三、REST調(diào)用
3.1 一個好用的REST Client : WebApiClient
使用過Java Feign Client的人都知道,一個好的聲明式REST客戶端可以幫我們省不少力。在.NET下,園子里的大大老九就寫了一款類似于Feign Client的REST Client:WebApiClient。WebApiClient是開源在github上的一個httpClient客戶端庫,內(nèi)部基于HttpClient開發(fā),是一個只需要定義C#接口(interface),并打上相關(guān)特性,即可異步調(diào)用http-api的框架 ,支持.net framework4.5+、netcoreapp2.0和netstandard2.0。它的GitHub地址是:https://github.com/dotnetcore/WebApiClient
如何安裝?
NuGet>Install-Package WebApiClient-JIT
3.2 使用實例:走API Gateway
Step1.定義HTTP接口
這里需要注意的是,由于我們要走API網(wǎng)關(guān),所以這里定義的HttpHost地址是一個假的,后面具體調(diào)用時會覆蓋掉,但是這里必須寫上一個,不然無法使用。
Step2.在Controller中即可異步調(diào)用
這里PaymentService的實現(xiàn)很簡單,就是返回了一個String集合:
最終調(diào)用結(jié)果如下:
3.3 使用實例:直接訪問具體服務(wù)
在服務(wù)眾多,且單個服務(wù)就部署了多個實例的情況下,我們可以通過API網(wǎng)關(guān)進行中轉(zhuǎn),但是當(dāng)部分場景我們不需要通過API網(wǎng)關(guān)進行中轉(zhuǎn)的時候,比如:性能要求較高,負(fù)載壓力較小單個實例足夠等,我們可以直接與要通信的服務(wù)進行聯(lián)接,也就不用從API網(wǎng)關(guān)繞一圈。
Step1.改一下HTTP接口:
同理,這里的HttpHost也是后面需要被覆蓋的,原因是我們將其配置到了配置文件中。
Step2.改一下調(diào)用代碼:
最終調(diào)用結(jié)果如下:
四、RPC調(diào)用
4.1 Thrift簡介
Thrift是一個軟件框架,用來進行可擴展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù)。
當(dāng)然,還有g(shù)RPC也可以選擇,不過從網(wǎng)上的性能測試來看,Thrift性能應(yīng)該優(yōu)于gRPC 2倍以上,但是gRPC的文檔方面要比Thrift友好很多。
4.2 Thrift的使用
(1)下載Thrift (這里選擇Windows版)
下載完成后解壓,這里我將其改名為thrift.exe(去掉了版本號),一會在命令行敲起來更方便一點。
(2)編寫一個PaymentService.thrift,這是一個IDL中間語言
(3)根據(jù)thrift語法規(guī)則生成C#代碼
cmd>thrift.exe -gen csharp PaymentService.thrift
(4)創(chuàng)建一個Contracts類庫項目,將生成的C#代碼放進去
4.3 增加RPC Server
(1)新增一個控制臺項目,作為我們的Payment Service RPC Server,并引用Contracts類庫項目
(2)引入thrift-netcore包:
NuGet>Install-Package apache-thrift-netcore
(3)加入一個新增的PaymentService實現(xiàn)類
這里輸出日志僅僅是為了測試。
(4)編寫啟動RPC Server的主程序
(5)如果是多個服務(wù)實現(xiàn)的話,也可以如下這樣啟動:
4.4 調(diào)用RPC
在ClientService中也引入apache-thrift-netcore包,然后在調(diào)用的地方修改如下:
最終測試結(jié)果如下:
五、小結(jié)
本篇簡單的介紹了下微服務(wù)架構(gòu)下服務(wù)之間調(diào)用的兩種常用方式:REST與RPC,另外前面介紹的基于消息隊列的發(fā)布/訂閱模式也是服務(wù)通信的方式之一。本篇基于WebApiClient這個開源庫介紹了如何進行聲明式的REST調(diào)用,以及Thrift這個RPC框架介紹了如何進行RPC的通信,最后通過一個小例子來結(jié)尾。最后,服務(wù)調(diào)用的最佳實踐一般是對外REST,對內(nèi)RPC,但是追求極致的性能會消耗很多額外的成本,所以一般情況下對內(nèi)一般也REST,但對于個別性能要求較高的接口使用RPC。
參考資料
遠(yuǎn)方的行者,《微服務(wù) RPC和REST》
楊中科,《.NET Core微服務(wù)課程:Thrift高效通訊》
醉眼識朦朧,《Thrift入門初探--thrift安裝及java入門實例》
focus-lei,《.net core下使用Thrift》
寶哥在路上,《Thrift性能測試與分析》
原文地址:
https://www.cnblogs.com/edisonchou/p/microservice_communication_rest_and_rpc_foundation.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.NET Core微服务之服务间的调用方式(REST and RPC)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Core 使用Quart
- 下一篇: Identity Server 4 -