
在学习之前,需要先了解gRPC是做什么的,学习的目的以及能够解决什么问题,为什么选择gRPC?
gRPC是一款成熟的RPC框架,具有跨语言、支持双向流、Protobuf二进制序列化等优点。
RPC框架的作用是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果,简单来说就是远程过程调用。
常用的远程过程调用方式有REST、SOAP、RPC。
新建一个空白解决方案,命名为GrpcDemo
创建后 右键 > 添加 > 新建项目 > grpc,取名为GrpcDemo.Service
项目中包含:
syntax = "proto3";
option csharp_namespace = "GrpcDemo.Service";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
proto文件用于定义服务与数据结构,是一种高效数据交换格式,相对于Json,Protobuf有更高的转化效率,时间效率和空间效率都是JSON的3-5倍。
文件描述:
如上所示,在文件中定义了Greeter服务,包含一个SayHello过程,参数是HelloRequest,返回结果为HelloReply。
GreeterService.cspublic class GreeterService : Greeter.GreeterBase
{
private readonly ILogger _logger;
public GreeterService(ILogger logger)
{
_logger = logger;
}
public override Task SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
GreeterService继承于自动生成的Greeter.GreeterBase,实现了SayHello方法。
Startup.cspublic void ConfigureServices(IServiceCollection services)
{
//添加Grpc服务
services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...省略
app.UseEndpoints(endpoints =>
{
//添加GreeterService服务终结点
endpoints.MapGrpcService();
//...省略
});
}
添加Grpc服务、添加GreeterService服务终结点。
新建控制台项目,命名为GrpcDemo.Client
工具 > Nuget包管理器 > 程序包管理控制台 > 设置默认项目为GrpcDemo.Client
输入以下命令:
Install-Package Google.Protobuf Install-Package Grpc.Tools Install-Package Grpc.Net.Client
右键GrpcDemo.Client项目 > 编辑项目文件
在Project内添加
修改Program.cs
static void Main(string[] args)
{
//创建grpc通道
var channel = GrpcChannel.ForAddress("https://localhost:5001");
//创建Greeter服务客户端
var greetClient = new Greeter.GreeterClient(channel);
//请求SayHello并且传参
HelloReply reply = greetClient.SayHello(new HelloRequest()
{
Name = "Yuwei"
});
//输出返回结果
Console.WriteLine(reply.Message);
}
右键解决方案 > 设置启动项目 > 多个启动项目 > 将Service和Client设置为启动 > 启动
输出:
Hello Yuwei
可以看到,Client发起了HTTP/2 POST请求,服务端返回了Hello Yuwei,运行成功。
微软官方Grpc教程
Grpc英文文档