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

  

 

 Proto各种语法声明

 

 

 

posted @ 2020-09-14 16:43  cornerhzd  阅读(675)  评论(0)    收藏  举报