gRPC—高性能远程过程调用框架


概述

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 运行效果

服务端:
在这里插入图片描述

客户端:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值