gRPC in ASP.NET Core 3.x - gRPC 简介(1)
gRPC的結構?
在我們搭建gRPC通信系統之前,首先需要知道gRPC的結構組成。?
首先,需要一個server(服務器),它用來接收和處理請求,然后返回響應。?
既然有server,那么肯定有client(客戶端),client的作用就是向server發送請求,具體就是生成一個請求,然后把它發送到server,然后等待server的響應。?
但是它們不必是一對一的關系,在整個系統里,可以有多個server,也可以有多個client。根據實際情況,一個應用程序可能是gRPC的server,也可能是gRPC的client,也可能兩者都是。?
?
gRPC里面server和client并不是直接通信的,gRPC可以使用protocol buffer定義的消息來生成代碼。?
當client發送請求的時候,它會和server端生成的代碼進行交互;同樣在client端也有生成的代碼,client端生成的代碼負責提供一個隧道,這個隧道被用來把client端生成的消息發送給server。?
因為server和client兩端都有生成的代碼,所以如何序列化和反序列化,以及如何進行來回的傳輸等細節,我們都可以不了解。?
?
但是為了讓server和client端來回傳輸通信,我們還需要一個協議,傳輸協議就負責把消息來回的傳遞。所以它并不需要懂得這些消息的內容,生成的代碼會負責理解這些消息,但是傳輸協議需要負責把消息從一端傳遞到另一端。?
目前,好像gRPC只能使用Protocol Buffer這一個傳輸協議。但是gRPC在設計的時候,它的傳輸層是可插拔的,所以如果我們想把Protocol Buffer使用某種JSON或XML的協議替換掉,是可行的。如果你有特定的需求使用Protocol Buffer無法實現的話,那么你也可以創建自己的傳輸協議。?
?
設計步驟?
總共應該分三步。設計原則是從里到外(看上面結構圖)。?
所以:?
首先我們應該定義消息(message)。這些消息使用Protocol?Buffer來進行定義?
定義完消息,我們使用Proto-c編譯器來生成server和client端的代碼,它們會負責把消息在兩端之間來回傳遞?
現在,我們就可以寫client和server了。?
?
?
gRPC?生命周期?
?
?
gRPC或者RPC的生命周期可以參考上圖。?
首先,需要創建一個隧道,該隧道會包裝實際用來傳輸消息的線路協議。?
例如如果我們的server和client之間使用HTTP/2協議,那么這個隧道就會包裝一個server和client之間的TCP連接。?
這些隧道的優點是,它們只需要創建一次。一旦隧道創建了,你就可以在你應用程序的生命周期之內持續的使該隧道來回發送消息。?
?
隧道建立好之后,就該創建client了。client也是可以復用的,不必每個rpc調用都重建client。但是在調用之前,我們需要把client建立好。?
現在client進入隧道,這個client通常是提供給我們的,我們不需要自己實現任何代碼。使用Proto-c編譯消息定義生成的代碼將會給我們提供client需要的一切。我們只需要提供隧道即可。?
?
client創建好之后,client就準備好給server發送請求了。這一步是必須的,gRPC無法讓server端初始化請求發送給client端,請求都是client端初始化的。?
但是client初始化請求之后,server端是可以發送多個響應回來的,這個以后再說。這時,client可以隨著請求發送一些metadata(元數據),這些metadata是關于請求的,但不是請求對象本身。?
?
請求被發送以后呢,server可以(但不是必須)把metadata返回。所以,你實際上可以在client和server之間進行這種“預約對話”。client可以發送一些metadata,然后server可以把一些metadata發送回來,這些都是發生在server開始處理請求之前。?
?
生命周期的最后一部分就是發送和接收消息。就以簡單的情況為例,現在server就應該把響應發送回去了,因為client已經發送了請求,所以響應就是要返回。?
?
注意,關于metadata需要注意的是,gRPC內置的身份認證系統是用來做client和server的身份認證的。?
但是這個metadata也為你提供了檢查實際用戶身份的機制。所以,如果你需要認證或者授權實際用戶,就需要在RPC請求這個級別來實現。也就是在這里。?
如果是client和server的身份認證,以后再寫。。
總結
以上是生活随笔為你收集整理的gRPC in ASP.NET Core 3.x - gRPC 简介(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第7课:用A
- 下一篇: dotnet 手工打一个 dotnet