C# .netCore 初步學習GRPC服務
阿新 • • 發佈:2020-09-14
1.什麼是Grpc:
官網:https://www.grpc.io/
官網描述:gRPC is a modern open source high performance RPC framework that can run in any environment
G: google的意思
RPC:Remote Procedure Call (遠端 過程 呼叫)
IPC:程序間呼叫
分為兩種:LPC(本地)和RPC(遙遠的/遠端)
2.建立grpc服務端:
建立時選擇grpc專案,會自動建立一個自帶模板的服務端
目錄如下:
試執行:
出現的問題:
System.IO.IOException:“Failed to bind to address https://localhost:5001.”
AggregateException: One or more errors occurred. (HTTP/2 over TLS is not supported on Windows 7 due to missing ALPN support.) (HTTP/2 over TLS is not supported on Windows 7 due to missing ALPN support.)
原因:不支援TLS
解決辦法:
在Program.cs中配置不包含 TLS 的 HTTP/2 終結點
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { options.ListenLocalhost(5001, o => o.Protocols = HttpProtocols.Http2); }); webBuilder.UseStartup<Startup>(); }); }
在執行就OK了
3.建立grpc客戶端
建立一個新的netCore控制檯專案GrpcClientWebDemo
使用NuGet包管理器安裝以下三個包
Grpc.Net.Client
Google.Protobuf
Grpc.Tools
專案目錄下建立Protos資料夾,裡面拖入和服務端一樣的greet.proto檔案
右鍵雙擊專案類庫,開啟GrpcClientWebDemo.csproj檔案
修改GrpcServices屬性為客戶端
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
生成編譯解決方案。gRPC自動生成對應的呼叫程式碼。
修改Startup.cs ConfigureServices方法
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); #region gRPC AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); #endregion }
客戶端跨語言呼叫非tls gRPC都需要這樣設定。
客戶端gRPC服務呼叫方法:
在HomeController控制器 index方法中:
public async Task<IActionResult> Index() { string targetUrl = "http://localhost:5001"; using (var channel = GrpcChannel.ForAddress(targetUrl)) { var client = new Greeter.GreeterClient(channel); Console.WriteLine("***************單次呼叫************"); { var reply = await client.SayHelloAsync(new HelloRequest() { Name = "11" }); string result = reply.Message.ToString(); Console.WriteLine($"Client {Thread.CurrentThread.ManagedThreadId} 服務返回資料1:{result} "); base.ViewBag.Result = result; } } return View(); }