近年來,隨著網站應用程式的需求越來越大,微服務,而服務間的溝通又分成兩種方式:HTTP Request與RPC
RPC(Remote Procedure Call,中文為遠端程序呼叫)是讓原本本地程式呼叫的Method或是function,透過各種網路通訊方式(TCP、UDP、HTTP)讓非本地的遠端機器做呼叫。
而RPC相較於HTTP Request的優點有以下幾點
因為RPC對於服務間的呼叫有著低消能消耗,高傳輸效率,並且自帶負載平衡,及更容易進行服務治理,所以大部分分散式系統內部都使用RPC的方式進行服務的呼叫。
gRPC是由google開發的開源RPC框架,基於 HTTP/2 協定傳輸,使用Protocol Buffers 作為介面描述語言,並且主打著高性能、跨平台、跨語言。
在ASP.NET Core 3 開始提供了gRPC的專案範本,以下範例將逐步建立gRPC
首先先透過 .NET CLI 建立gRPC的專案範本dotnet new grpc -o GrpcSample
建立完畢之後在建立的專案目錄底下使用dotnet watch run
啟動服務後會出現以下錯誤
這個原因是因為ASP.NET Core gRPC 範本會使用有 TLS的 HTTP/2 來啟動,而 Kestrel 不支援 macOS和舊版 Windows (例如 Windows 7) 上具有 TLS 的 HTTP/2。
所以我們要修改Kestrel的設定,將 Kestrel 和 gRPC 用戶端設定為使用沒有 TLS 的 HTTP/2
。Program.cs
中設定不含 TLS 的 HTTP/2 端點
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options =>
{
options.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2);
});
webBuilder.UseStartup<Startup>();
});
加入這個設定之後,用戶端也需要設定為不使用 TLS,才有辦法進行連接。