引入
gRPC 是谷歌推出的一个高性能优秀的 RPC 框架,基于 HTTP/2 实现。并且该框架对 .NET Core 有着优秀的支持。
最近在做一个项目正好用到了 gRPC,遇到了需要串流传输的问题。
项目创建
首先还是需要安装 .net core sdk,可以去 http://dot.net 下载。这里我使用的是 2.2.103 版本的 sdk。
mkdir RpcStreaming
cd RpcStreaming
dotnet new console
dotnet add package Grpc // 添加 gRPC 包
dotnet add package Grpc.Tools // 添加 gRPC 工具包
dotnet add package Google.Protobuf // 添加 Protobuf 支持
然后为了支持 protobuf 语言,我们需要修改项目配置文件,在项目中引入 .proto 文件以便生成对应的代码。
在 RpcStreaming.csproj 中,加入<Protobuf Include="**/*.proto" />,除此之外还需要启用最新语言支持(C# 7.3),方便我们将 Main 函数直接写为 async 函数,直接设置为最新版本的语言即可,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
...
<PropertyGroup>
...
<LangVersion>latest</LangVersion>
...
</PropertyGroup>
<ItemGroup>
...
<Protobuf Include="**/*.proto" />
...
</ItemGroup>
...
</Project>
这里我们使用了 wildcard 语法匹配了项目内的全部 proto 文件用于生成对应的代码。
到这里,项目的创建就完成了。
编写 Proto 文件
我们在项目目录下建立一个 .proto 文件,用于描述 rpc 调用和消息类型。比如:RpcStreaming.proto
内容如下:
synatx = "proto3";
service RpcStreamingService {
rpc GetStreamContent (StreamRequest) returns (stream StreamContent) {}
}
message StreamRequest {
string fileName = 1;
}
message StreamContent {
bytes content = 1;
}
做 RPC 请求时,我们向 RPC 服务器发送一个 StreamRequest 的 message,其中包含了文件路径;为了让服务器以流式传输数据,我们在 returns 内加一个 “stream”。
保存后,我们执行一次 dotnet build,这样就会在 ./obj/Debug/netcoreapp2.2下自动生成 RPC 调用和消息类型的代码。
编写 Server 端代码
为了编写 RPC 调用服务端代码,我们需要重写自动生成的 C# 虚函数。
首先我们进入 ./obj/Debug/netcoreapp2.2 看看自动生成了什么代码。
RpcStreaming.cs 中包含消息类型的定义,RpcStreamingGrpc.cs 中包含了对应 rpc 调用的函数原型。
我们查找一下我们刚刚在 proto 文件中声明的 GetStreamContent。
可以在里面找到一个上方文档注释为 “Base class for server-side implementations RpcStreamingServiceBase” 的抽象类 RpcStreamingServiceBase,里面包含了我们要找的东西。
可以找到我们的 GetStreamContent 的默认实现:
public virtual global

本文介绍了如何使用.NET Core和gRPC框架创建一个数据串流服务。从项目创建开始,通过编写Proto文件定义RPC调用,接着实现Server端的串流响应,最后展示客户端如何调用RPC API接收数据流。实测表明,该方法在内网环境中能实现接近千兆网卡带宽的传输速度。
最低0.47元/天 解锁文章
1251

被折叠的 条评论
为什么被折叠?



