.NETCore微服務探尋(四) - 遠程過程調用(RPC)


前言

一直以來對於.NETCore微服務相關的技術棧都處於一個淺嘗輒止的了解階段,在現實工作中也對於微服務也一直沒有使用的業務環境,所以一直也沒有整合過一個完整的基於.NETCore技術棧的微服務項目。正好由於最近剛好辭職,有了時間可以寫寫自己感興趣的東西,所以在此想把自己了解的微服務相關的概念和技術框架使用實現記錄在一個完整的工程中,由於本人技術有限,所以錯誤的地方希望大家指出。

目錄

項目地址:https://github.com/yingpanwang/fordotnet/tree/dev

什么是RPC

RPC(Remote Procedure Call)簡單來說就是指像調用本地方法一樣調用遠程方法,常用於分布式,微服務中的組件中或服務中的通訊。實現一個RPC框架主要就是着重如何實現"像調用本地方法一樣調用遠程方法",其中就包括了如何處理網絡請求,負載均衡,傳輸協議等問題。

為什么要RPC

RPC是一個技術名詞,實現的方式是有多種的,其中包括了復雜的實現,傳輸協議,通訊協議,序列化協議的。在分布式應用,微服務興起的時代,服務之間的高效通訊是尤為重要的,如果服務間的通訊只是簡單通過http訪問接口而沒有一個統一的管理與治理的話,那么這些通訊操作就像一個定時炸彈一樣,隨時有可能爆炸。RPC指定了一些的標准和協議,為服務之間的治理和管理提供了基礎。

.net croe 中怎么使用RPC

.net core中有許多的RPC框架,但 .net core 3.1 后 官方支持了 gRPC框架,所以下面的介紹都是基於gRPC編寫。

gRPC介紹

通信協議

gRPC通訊基於HTTP/2
HTTP/2 提供了連接多路復用、雙向流、服務器推送、請求優先級、首部壓縮等機制。可以節省帶寬、降低TCP鏈接次數、節省CPU,幫助移動設備延長電池壽命等。gRPC 的協議設計上使用了HTTP2 現有的語義,請求和響應的數據使用HTTP Body 發送,其他的控制信息則用Header 表示。

服務定義

gRPC 默認使用 protocol buffers(.proto文件) 作為接口定義語言,來描述服務接口和有效載荷消息結構。ProtoBuf是由Google開發的一種數據序列化協議(類似於XML、JSON、hessian)。ProtoBuf能夠將數據進行序列化,並廣泛應用在數據存儲、通信協議等方面。壓縮和傳輸效率高,語法簡單,表達力強。

https://developers.google.com/protocol-buffers/ 什么是protocol buffers

服務類型

gRPC 允許你定義四類服務方法分別是:單項RPC,服務端流RPC,客戶端流RPC,雙向流RPC

  • 單項RPC

客戶端發送一個請求,從服務端獲取一個應答。

  • 服務端流RPC

客戶端發用一個請求,從服務端獲取一個數據流。

  • 客戶端流RPC

客戶端寫入並發送一個數據流,服務端從中讀取並應答。

  • 雙向流RPC

客戶端,服務端兩邊都可以分別通過讀寫數據流來發送信息。數據流相互獨立,各不影響且保證順序。

安全認證

gRPC 被設計成可以利用插件的形式支持多種授權機制。

  • SSL/TLS
  • OAuth2.0
  • API

詳情 http://doc.oschina.net/grpc?t=58010

.net core 中使用 gRPC

創建gRPC項目

由於 VS2019支持 基於.net core 3.1 創建gRPC項目,這里我們可以之間通過VS創建就可以,VS會自動添加所需要的gRPC相關核心組件。

如果是通過創建普通Web/Api站點添加gRPC組件的話需要添加下列nuget包,及 Starup 文件中添加相關代碼

查看分析示例RPC服務(greet.proto)

通過VS創建完gRPC服務后,可以看到相較於傳統的空Web/Api站點,該服務在某些方面還是有些許不同的。

可以看到多出了 Protos和Services 兩個文件夾並且項目的csproj描述多出了對於默認proto文件的描述。

  • Protos
    對於服務定義的protobuf文件

  • Services
    對於proto文件定義的服務實現


當我們F12 查看 對應 proto文件中定義的message HelloRequest,HelloReply時,可以看到它時根據我們定義的proto文件自動在項目的根目錄自動生成的

  • Csproj
    需要添加對應protobuf文件的路徑及使用端標識,protobuf文件路徑可以是本地路徑也可以是網絡路徑(可以將客戶端,服務端文件指向同一個路徑獲取網絡路徑)。

    • 服務端

    • 客戶端

編寫自定義的RPC服務

上面分析完示例服務之后我們編寫自己的服務。

  • 編寫proto文件

創建mytestrpc.proto

message支持的字段類型常用的基本上都具備了(如下)

  • 實現具體服務

創建MyTestGreeterService
(注意:命名空間要與proto文件中定義的一致)

  • 添加至Endpoints中

  • csproj中的ItemGroup中添加對應新添加的proto文件描述

客戶端定義及RPC服務調用
  • 將上面定義好的proto文件復制至客戶端項目下(如果已經采用了客戶端和服務端共享路徑的話,可以忽略)

  • 添加客戶端csproj描述新的rpc服務描述

  • 注入到客戶端項目中

  • 添加測試RPC接口

接下來查看我們的控制台輸出


可以看到都成功了,

接下來我們看服務端是否有相關的訪問信息,服務端也顯示相關的http2請求

結束語

關於.net core中使用gRPC的介紹就到這里了,可能不夠詳盡,如果大家有什么不明白的和模糊的地方,希望大家指出或指正,相互探討,我也會加以補充。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM