1. 程式人生 > 實用技巧 >C# .netCore 初步學習GRPC服務

C# .netCore 初步學習GRPC服務

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();
        }