这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
What's gRPC
引用一段官网的介绍:
gRPC 的主要优点是:
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
它主要用于和多个服务之间的调用,例如A服务放在了5001 端口,B服务放在了5002端口。通过消息队列虽然也可以做到进程间通信。但是gRPC使用Protobuf序列化传输的体积,同时还支持双向流等等...所以在服务调用方面一般优先考虑gRPC
gRPC in Asp.net core
使用dotnet cli 创建项目:
dotnet new grpc -o GrpcExample
dotnet sln add GrpcExample
📢 2.1 了解文件结构
greet.proto:这是一个grpc的模板文件,他用于grpc服务的定义与代码的生成
GreeterService: 这个类是服务的实现,他里面有真实的业务逻辑处理
📢 2.2 认识proto文件
proto 是一个模板文件,语法有点类似Go,它将向外界描述这个文件里面的服务、方法(字段)之类的。
同时还可以用它生成服务、客户端的C#代码
例如,我们现在生成一下GrpcExample 项目,可以看到 obj/Debug/net5.0/Protos/ 目录下面有与proto文件同名的类
如果要生成客户端代码(供于gRPC的消息传递之类的...)需要把proto文件复制到client项目里面。
然后再修改*.csproj文件里面的Protobuf节点,将GrpcServices属性改为 "Client",并且安装Nuget包
我的客户端项目(Console)的csproj文件是这样的:
📢 2.3 运行程序查看结果
首先,必须得先运行起来服务端。使用kestrel运行服务后:
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
看一下客户端的代码:
static async Task Main(string[] args)
{
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new GreeterClient(channel);
var reply = await client.SayHelloAsync(new GrpcExample.HelloRequest
{
Name = "hello gRPC!"
});
Console.WriteLine(reply);
}
gRPC with http and https
使用grpc之后呢,同时也想让这个Grpc Server 支持http服务咋办?例如:我们在一个服务里面已经写好了http服务,但是后来发现其他项目需要经常调用这个服务,于是把这个服务做成了可供Grpc调用的Server。
现在,看一下如何配置http 服务 和 grpc 的共存配置吧
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://*:9002"
},
"HttpsInlineCertFile": {
"Url": "https://*:5060",
"Protocols": "Http2",
"Certificate": {
"Path": "",
"Password": ""
}
}
}
}
当然,这里也可以使用两个Https