目录
gRPC简介
在学习之前,需要先了解gRPC是做什么的,学习的目的以及能够解决什么问题,为什么选择gRPC?
gRPC以及RPC框架
gRPC是一款成熟的RPC框架,具有跨语言、支持双向流、Protobuf二进制序列化等优点。
RPC框架的作用是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果,简单来说就是远程过程调用。
远程过程调用
常用的远程过程调用方式有REST、SOAP、RPC。
- REST基于HTTP进行调用,如GET\POST\PUT,在浏览器端可直接调用。
- SOAP基于Xml封装成了HTTP协议,在VS中可直接添加服务引用,在浏览器端可直接调用。
- RPC可基于TCP和HTTP通讯,在VS中可直接添加服务引用。
RPC服务结构
- 服务端:提供对客户端开放的服务
- 客户端:调用服务端提供的服务
一、创建服务端项目
新建一个空白解决方案,命名为GrpcDemo
创建后 右键 > 添加 > 新建项目 > grpc,取名为GrpcDemo.Service
gRPC项目结构
项目中包含:
- 添加了Grpc.AspNetCore引用
- 包含greet.proto文件
- 包含GreeterService服务
greet.proto
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倍。
文件描述:
syntax
标识Protobuf版本为v3option csharp_namespace
标识生成C#类的命名空间package
标识proto文件的命名空间service
定义服务rpc FuncName (Input) returns (Output)
定义一个远程过程message
声明数据结构
如上所示,在文件中定义了Greeter服务,包含一个SayHello过程,参数是HelloRequest,返回结果为HelloReply。
GreeterService.cs
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
GreeterService继承于自动生成的Greeter.GreeterBase,实现了SayHello方法。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
//添加Grpc服务
services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//...省略
app.UseEndpoints(endpoints =>
{
//添加GreeterService服务终结点
endpoints.MapGrpcService<GreeterService>();
//...省略
});
}
添加Grpc服务、添加GreeterService服务终结点。
二、创建客户端项目
新建控制台项目,命名为GrpcDemo.Client
1. 添加Nuget包
工具 > Nuget包管理器 > 程序包管理控制台 > 设置默认项目为GrpcDemo.Client
输入以下命令:
Install-Package Google.Protobuf
Install-Package Grpc.Tools
Install-Package Grpc.Net.Client
2. 添加Proto文件
右键GrpcDemo.Client项目 > 编辑项目文件
在Project内添加
<ItemGroup>
<!--添加GrpcDemo.Service的proto文件-->
<Protobuf Include="..\GrpcDemo.Service\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
3. 请求服务端
修改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,运行成功。