日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core微服务之服务间的调用方式(REST and RPC)

發布時間:2023/12/4 asp.net 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core微服务之服务间的调用方式(REST and RPC) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、REST or RPC ?

1.1 REST & RPC

  微服務之間的接口調用通常包含兩個部分,序列化和通信協議。常見的序列化協議包括json、xml、hession、protobuf、thrift、text、bytes等;通信比較流行的是http、soap、websockect,RPC通?;赥CP實現,常用框架例如dubbo,netty、mina、thrift。

  REST:嚴格意義上說接口很規范,操作對象即為資源,對資源的四種操作(post、get、put、delete),并且參數都放在URL上,但是不嚴格的說Http+json、Http+xml,常見的http api都可以稱為Rest接口。

  RPC:即我們常說的遠程過程調用,就是像調用本地方法一樣調用遠程方法,通信協議大多采用二進制方式。

1.2 HTTP vs 高性能二進制協議

  HTTP相對更規范,更標準,更通用,無論哪種語言都支持HTTP協議。如果你是對外開放API,例如開放平臺,外部的編程語言多種多樣,你無法拒絕對每種語言的支持,相應的,如果采用HTTP,無疑在你實現SDK之前,支持了所有語言,所以,現在開源中間件,基本最先支持的幾個協議都包含RESTful。

  RPC協議性能要高的多,例如Protobuf、Thrift、Kyro等,(如果算上序列化)吞吐量大概能達到http的二倍。響應時間也更為出色。千萬不要小看這點性能損耗,公認的,微服務做的比較好的,例如,netflix、阿里,曾經都傳出過為了提升性能而合并服務。如果是交付型的項目,性能更為重要,因為你賣給客戶往往靠的就是性能上微弱的優勢。

  所以,最佳實踐一般是對外REST,對內RPC,但是追求極致的性能會消耗很多額外的成本,所以一般情況下對內一般也REST,但對于個別性能要求較高的接口使用RPC。

二、案例結構

  這里假設有兩個服務,一個ClinetService和一個PaymentService,其中PaymentService有兩部分,一部分是基于REST風格的WebApi部分,它主要是負責一些對性能沒有要求的查詢服務,另一部分是基于TCP的RPC Server,它主要是負責一些對性能要求高的服務,比如支付和支出等涉及到錢的接口。假設User在消費ClientService時需要調用PaymentService根據客戶賬戶獲取Payment History(走REST)以及進行交易事務操作(走RPC)。

三、REST調用

3.1 一個好用的REST Client : WebApiClient

  使用過Java Feign Client的人都知道,一個好的聲明式REST客戶端可以幫我們省不少力。在.NET下,園子里的大大老九就寫了一款類似于Feign Client的REST Client:WebApiClient。WebApiClient是開源在github上的一個httpClient客戶端庫,內部基于HttpClient開發,是一個只需要定義C#接口(interface),并打上相關特性,即可異步調用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網關,所以這里定義的HttpHost地址是一個假的,后面具體調用時會覆蓋掉,但是這里必須寫上一個,不然無法使用。

  Step2.在Controller中即可異步調用

  這里PaymentService的實現很簡單,就是返回了一個String集合:

 最終調用結果如下:

  

3.3 使用實例:直接訪問具體服務

  在服務眾多,且單個服務就部署了多個實例的情況下,我們可以通過API網關進行中轉,但是當部分場景我們不需要通過API網關進行中轉的時候,比如:性能要求較高,負載壓力較小單個實例足夠等,我們可以直接與要通信的服務進行聯接,也就不用從API網關繞一圈。

  Step1.改一下HTTP接口:

  同理,這里的HttpHost也是后面需要被覆蓋的,原因是我們將其配置到了配置文件中。

  Step2.改一下調用代碼:

 最終調用結果如下:

  

四、RPC調用

4.1 Thrift簡介

  

  Thrift是一個軟件框架,用來進行可擴展且跨語言的服務的開發。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。

  當然,還有gRPC也可以選擇,不過從網上的性能測試來看,Thrift性能應該優于gRPC 2倍以上,但是gRPC的文檔方面要比Thrift友好很多。

4.2 Thrift的使用

  (1)下載Thrift (這里選擇Windows版)

  

  下載完成后解壓,這里我將其改名為thrift.exe(去掉了版本號),一會在命令行敲起來更方便一點。

  (2)編寫一個PaymentService.thrift,這是一個IDL中間語言

 (3)根據thrift語法規則生成C#代碼

cmd>thrift.exe -gen csharp PaymentService.thrift

  

  (4)創建一個Contracts類庫項目,將生成的C#代碼放進去

  

4.3 增加RPC Server

  (1)新增一個控制臺項目,作為我們的Payment Service RPC Server,并引用Contracts類庫項目

  

  (2)引入thrift-netcore包:

NuGet>Install-Package apache-thrift-netcore

  (3)加入一個新增的PaymentService實現類

  這里輸出日志僅僅是為了測試。

  (4)編寫啟動RPC Server的主程序

  (5)如果是多個服務實現的話,也可以如下這樣啟動:

4.4 調用RPC

  在ClientService中也引入apache-thrift-netcore包,然后在調用的地方修改如下:

  最終測試結果如下:

  

五、小結

  本篇簡單的介紹了下微服務架構下服務之間調用的兩種常用方式:REST與RPC,另外前面介紹的基于消息隊列的發布/訂閱模式也是服務通信的方式之一。本篇基于WebApiClient這個開源庫介紹了如何進行聲明式的REST調用,以及Thrift這個RPC框架介紹了如何進行RPC的通信,最后通過一個小例子來結尾。最后,服務調用的最佳實踐一般是對外REST,對內RPC,但是追求極致的性能會消耗很多額外的成本,所以一般情況下對內一般也REST,但對于個別性能要求較高的接口使用RPC。

參考資料

遠方的行者,《微服務 RPC和REST》

楊中科,《.NET Core微服務課程:Thrift高效通訊》

醉眼識朦朧,《Thrift入門初探--thrift安裝及java入門實例》

focus-lei,《.net core下使用Thrift》

寶哥在路上,《Thrift性能測試與分析》

原文地址:

https://www.cnblogs.com/edisonchou/p/microservice_communication_rest_and_rpc_foundation.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的.NET Core微服务之服务间的调用方式(REST and RPC)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。