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各种语法声明



浙公网安备 33010602011771号