早就據說ASP.NET Core 3.0中引入了gRPC的服務模板,正好趁着家裏電腦剛作了新系統,而後裝了VS2019的功夫來體驗一把。同時記錄體驗的過程。若是你也想按照本文的步驟體驗的話,那你得先安裝.NET Core3.0預覽版的SDK。至於開發工具我用的時VS2019,固然你也可使用VS Code進行。html
做者:依樂祝 原文地址:http://www.javashuo.com/article/p-kopkxwgx-y.htmlweb
gRPC 是一種與語言無關的高性能遠程過程調用 (RPC) 框架。 有關 gRPC 基礎知識的詳細信息,請參閱 gRPC 文檔頁。json
gRPC 的主要優勢是:c#
這些優勢使 gRPC 適用於:服務器
打開VS2019 從 Visual Studio「文件」菜單中選擇「新建」 > 「項目」。(因爲我是新打開的VS,因此按照以下圖所示建立新項目)網絡
以下圖所示,選擇建立《ASP.NET Core Web 應用程序》,而後點擊下一步app
在此頁面按照下圖所示,輸入項目名稱,位置,解決方案名稱,而後點擊右下角的「建立」按鈕進行建立。框架
你覺得上述步驟中點擊「建立」就結束了嘛?說好的要建立gRPC服務模板的,因此,點擊上面的建立後會彈出以下圖所示,讓你選擇服務模板的窗口,這裏按照下圖所示選擇gRPC服務模板,而後再次點擊右下角的建立,纔是真正的建立項目。asp.net
建立成功後,會出現以下圖所示的項目結構async
至此,咱們就建立好了一個gRPC服務的模板,接下來咱們先測試一番,而後再好好的看下這個模板的結構吧
首先打開HelloGrpc.Server
這個服務端的工做目錄,而後Shift+鼠標右鍵
彈出以下圖所示的右鍵菜單,如圖所示打開ps窗口
輸入dotnet run
命令運行此gRPC服務端項目,以下圖所示,說明服務端啓動正常,並開始監聽對應的端口。
一樣的方法,咱們啓動客戶端,這時候客戶端會向該服務端發送一條包含具備其名稱「GreeterClient」的消息的問候信息。 該服務端將發送一條消息「Hello GreeterClient」做爲響應,並顯示在命令提示符中。以下圖所示:
至此,gRPC服務模板建立的服務端以及客戶端測試成功。下面咱們就好好的探究一下這個服務模板吧。
在HelloGrpc.Server
服務的端項目中有以下幾個文件
Greeter
gRPC,且用於生成 gRPC 服務器資產。Greeter
服務的實現。IWebHostBuilder
的啓動配置文件,包含配置應用行爲的代碼。(熟悉ASP.NET Core的你必定很熟悉)gRPC 客戶端 HelloGrpc.Client
文件:
Program.cs 包含 gRPC 客戶端的入口點和邏輯。
下面咱們再打開每一個文件看看裏面到底是什麼東東吧。
GRPC使用約定優先的API開發方法。默認狀況下,使用協議緩衝區(Protobuf)做爲接口設計語言(IDL)。這個.proto
文件包含:
有關Protobuf文件語法的更多信息,請參見正式文件(原型).
如咱們模板中建立的greet.proto
文件內容以下:
syntax = "proto3"; package Greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings. message HelloReply { string message = 1; }
Greeter
服務。Greeter
服務定義SayHello
請求。SayHello
發送HelloRequest
消息並接收HelloResponse
信息: 那麼你可能要問了,這個*.proto*文件是如何包含在項目中的呢,其實,若是你打開.csproject文件就會看到,經過將該文件添加到<Protobuf>
的ItemGroup中便可,以下所示:<ItemGroup> <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" /> <Content Include="@(Protobuf)" LinkBase="" /> </ItemGroup>
工具包Grpc.Tools 被用來從*.proto*文件生成C#文件。生成的資產(文件)具備以下特性:
服務器和客戶端項目都須要此包。Grpc.Tools
能夠經過在VisualStudio中使用包管理器或添加<PackageReference>
到項目文件:
XML複製
<PackageReference Include="Grpc.Tools" Version="1.19.0-pre1" PrivateAssets="All" />
工具包在運行時並非必需的,所以,應該用PrivateAssets="All"
.
咱們知道Grpc.Tools
工具包將根據*.proto*文件的定義翻譯並生成對應的C#類型的文件。
對於服務器端資產,將生成一個抽象的服務基類型。基類型包含在*.proto*文件中包含的全部GRPC調用的定義。而後,您將建立今後基類型派生的具體服務實現,並實現GRPC調用的邏輯。對於前面描述的greet.proto
示例,將生成包含虛擬SayHello
方法的抽象GreeterBase
類型。具體的實現GreeterService
重寫該方法並實現處理GRPC調用的邏輯。 正如HelloGrpc.Server
項目中的Services\GreeterService.cs
中的代碼
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }
對於客戶端,將生成一個具體的客戶端類型中的GRPC調用。.proto文件被轉換爲能夠調用的具體類型上的方法。爲greet.proto
前面描述的示例,一個具體的GreeterClient
類型生成。這個GreeterClient
類型包含SayHello
方法,能夠調用該方法來啓動對服務器的GRPC調用。
public class Program { static async Task Main(string[] args) { // Include port of the gRPC server as an application argument var port = args.Length > 0 ? args[0] : "50051"; var channel = new Channel("localhost:" + port, ChannelCredentials.Insecure); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "GreeterClient" }); Console.WriteLine("Greeting: " + reply.Message); await channel.ShutdownAsync(); Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } }
默認狀況下,分別生成服務器和客戶端資產。.proto文件包含在<Protobuf>
項目組。若要確保僅在服務器項目中生成服務器資產,GrpcServices
屬性設置爲Server
.
XML複製
<ItemGroup> <Protobuf Include="..\Protos\*.proto" GrpcServices="Server" /> <Content Include="@(Protobuf)" LinkBase="" /> </ItemGroup>
相似地,屬性設置爲Client
在僅在客戶項目中生成。
在Startup
中咱們發現跟普通的ASP.NET Core程序有所不一樣,具體的以下圖所示:在ConfigureServices
服務中引入了gRPC服務,而後在Configure
加入了路由
而這裏須要引入三個與gRPC相關的nuget包
這裏須要說明的是
ASP.NET Core 中間件和功能共享路由管道,所以能夠將應用程序配置爲服務其餘請求處理程序。其餘請求處理程序(如MVC控制器)能夠與配置的GRPC服務路由並行工做。
GRPC服務能夠徹底訪問ASP.NETCore功能,如依賴注入(Di)和日誌功能。例如,服務實現能夠經過構造函數解析DI容器中的記錄器服務:
public class GreeterService : Greeter.GreeterBase { public GreeterService(ILogger<GreeterService> logger) { } }
默認狀況下,GRPC服務能夠解析具備任意生存期的其餘DI服務(Singleton, Scoped, or Transient)。
GRPC 應用程序接口提供對某些HTTP/2消息數據的訪問,例如method, host, header, and trailers。訪問是經過ServerCallContext
參數傳遞給每一個GRPC方法:
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }
ServerCallContext
不提供對全部ASP.NET 接口中HttpContext
的徹底訪問。GetHttpContext
擴展方法提供對錶示ASP.NET API中底層HTTP/2消息的httpContext的徹底訪問:
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { var httpContext = context.GetHttpContext(); return Task.FromResult(new HelloReply { Message = "Using https: " + httpContext.Request.IsHttps }); } }
默認狀況下,Kestrel服務器設置爲最小請求主體數據速率。對於客戶端流式和雙工流式的請求,此速率可能不知足,而且鏈接可能超時。當GRPC服務包括客戶端流和雙工流調用時,必須禁用最小請求正文數據速率限制:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.ConfigureKestrel((context, options) => { options.Limits.MinRequestBodyDataRate = null; }); }); }
今天分享的內容有點多,目的就是使記錄儘量的詳細,儘量用通俗易懂的語言來進行描述,讓你們能用起來。在asp.net core3.0中把grpc服務做爲第一等公民進行支持,因此咱們有必要進行下了解。可能不少朋友會有疑問了,我Web API用的爽歪歪,幹嗎還要用gRPC這種遠程過程調用協議啊。關於這個問題,我準備再單獨開一篇文章進行講解,最後感謝你們的閱讀,碼字不易,多多推薦支持吧!
原文出處:https://www.cnblogs.com/yilezhu/p/10631420.html