文章目录
概述
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。 在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法, 就像它是本地对象一样,使您更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用
一、gRPC服务特点
(1)现代高性能轻量级 RPC 框架
(2)协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现
(3)可用于多种语言的工具,以生成强类型服务器和客户端
(4)支持客户端、服务器和双向流式处理调用。
(5)使用 Protobuf 二进制序列化减少对网络的使用
二、grpc服务和客户端创建
2.1 gRPCServer创建
2.1.1 项目创建
2.1.1.1 点击创建新项目
2.1.1.2 选择控制台应用
2.1.1.3 选择保存路径
2.1.1.4 选择.net 版本后,点击创建按钮
2.1.2 添加NuGet包
2.1.2.1 添加 Google.Protobuf
Google.Protobuf :协议缓冲区的 C# 运行时库 - Google 的数据交换格式
2.1.2.2 添加 Grpc.Tools
Grpc.Tools: 用于托管 C# 和本机 C++ 项目的 gRPC 和协议缓冲区编译器。
它包含 gRPC 的编译器、包含文件和项目系统集成以及在 Windows、 Linux 和 MacOS
上构建它们所必需的协议缓冲区服务描述文件。
2.1.2.2 添加 Grpc.Core
Grpc.Core: 基于原生 gRPC C-core 库的 gRPC 的 C# 实现
2.1.3 添加Protobuf文件
2.1.3.1 创建Protobuf文件
2.1.3.1 将创建的Greeter.proto添加到C#应用中
<ItemGroup>
<Protobuf Include="Protos\Greeter.proto"/>
</ItemGroup>
2.1.3.2 编写Greeter.proto文件
.proto用的是proto3,语法使用自行查找资料
syntax = "proto3";
//设置生成的类的命名空间
option csharp_namespace = "GrpcServer";
service Greeter
{
rpc SayHellow(SayHellowRequest) returns (SayHellowResponse);
}
message SayHellowRequest
{
string request = 1;
}
message SayHellowResponse{
string message = 1;
}
2.1.3.3 添加GreeterImpl 文件,并继承并继承Greeter.GreeterBase
对于服务器端资产,会生成抽象服务基类型。基类型包含.proto文件中所含的gRPC调用的定义。
创建一个派生自基类型并未gRPC调用实现逻辑的具体服务实现, 对于 Greeter.proto(前面所述的示例),会生成一个包含虚拟 SayHellow 方法的抽象 GreeterBase 类型(如下代码)。 具体实现 GreeterService 会替代该方法,并实现处理 gRPC 调用的逻辑
using Grpc.Core;
namespace GrpcServer
{
internal class GreeterImpl : Greeter.GreeterBase
{
public override Task<SayHellowResponse> SayHellow(SayHellowRequest request, ServerCallContext context)
{
Console.WriteLine($"接收到Client消息:{request.Request}");
SayHellowResponse tmpSayHellowResponse = new SayHellowResponse();
tmpSayHellowResponse.Message = "你好,我是GrpcServer";
return Task.FromResult(tmpSayHellowResponse);
}
}
}
2.1.3.4 启动服务
using Grpc.Core;
using GrpcServer;
Server server = new Server()
{
//通过将服务定义添加到 Services集合来注册我们的服务实现
Services = { Greeter.BindService(new GreeterImpl()) },
//指定我们要用来监听客户端请求的地址和端口。这是通过添加ServerPort到Ports集合来完成的。
Ports = { new ServerPort("127.0.0.1",7007,ServerCredentials.Insecure)}
};
//调用Start服务器实例为我们的服务启动一个 RPC 服务器
server.Start();
Console.WriteLine("服务器已经开启");
Console.ReadKey();
server.ShutdownAsync().Wait();
2.2 gRPCClient创建
2.2.1 项目创建
gRPCClient创建同gPRCServer创建方式相同,这里不再重复
2.2.2 添加NuGet包
2.1.2.1 添加 Google.Protobuf
Google.Protobuf :协议缓冲区的 C# 运行时库 - Google 的数据交换格式
2.1.2.2 添加 Grpc.Core
Grpc.Core: 基于原生 gRPC C-core 库的 gRPC 的 C# 实现
2.2.3 将GrpcServer中protos生成的.cs文件放到GrpcClient中
GrpcServer生成的.cs文件位置:
2.2.3 GrpcClient中代码实现
using Grpc.Core;
using GrpcServer;
Console.WriteLine("Hello, World!");
//创建一个连接到 gRPC 服务器的 gRPC 客户端通道
Channel channel = new Channel("127.0.0.1:7007",ChannelCredentials.Insecure);
Greeter.GreeterClient greeterClient = new Greeter.GreeterClient(channel);
SayHellowResponse sayHellowResponse = greeterClient.SayHellow(new SayHellowRequest() {Request = "hellow,我是客户端!!!"});
Console.WriteLine($"接收到服务器的消息:{sayHellowResponse.Message}");
Console.ReadKey();
2.2.3 运行效果
服务端:
客户端: