asp.net core 3.0 gRPC框架小试
什么是grpc
grpc是google开源的一个高性能、跨语言的rpc框架,基于http2协议,采用protobuf 定义的idl。
grpc 的主要优点是:
- 现代高性能轻量级 rpc 框架。
- 协定优先 api 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 protobuf 二进制序列化减少对网络的使用。
这些优点使 grpc 适用于:
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
更多介绍请前往
开始
netcore3.0中已经加入了grpc的模板项目.
1,打开vs2019,创建一个asp.net core web项目
2,选择asp.net core 3.0就会出现grpc模板,点击创建。
如果没安装core3的sdk请前往下载最新版本安装,
如果你已经安装了core 3.0的sdk却还是无法显示其选项,工具 > 选项 ,勾选“使用 .net core sdk 预览版”
3,模板只有一个服务端项目,需要自行创建一个客户端来做演示,创建一个.netcore的控制台程序即可。
客户端需要安装以下三个包
- grpc.core,包含c-core客户端的c#api。
- google.protobuf,包含c#的protobuf消息api。
- grpc.tools,包含对protobuf文件的c#工具支持。
服务端代码
greet.proto,proto相关语法只是,前往 ,可能需要*。
syntax = "proto3"; 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; enum language{ en_us = 0; //枚举必须以0开始 zh_cn = 1; } language languageenum = 2; } // the response message containing the greetings. message helloreply { string message = 1; int32 num = 2; int32 adsa = 3; }
greeterservice
public class greeterservice : greeter.greeterbase { public override task<helloreply> sayhello(hellorequest request, servercallcontext context) { var greeting = string.empty; switch (request.languageenum) { case hellorequest.types.language.enus: greeting = "hello"; break; case hellorequest.types.language.zhcn: greeting = "你好"; break; } return task.fromresult(new helloreply { message = $"{greeting} {request.name}", num = new random().next() }); } }
客户端代码
添加greet.proto文件,将protos\greet.proto文件从服务端复制到客户端项目。将greet.proto文件路径添加到项目文件grpcdemo.client.csproj的<itemgroup>节点内。
这里我们不复制,直接定位到相关路径即可。
grpcdemo.client.csproj
<project sdk="microsoft.net.sdk"> <propertygroup> <outputtype>exe</outputtype> <targetframework>netcoreapp3.0</targetframework> </propertygroup> <itemgroup> <packagereference include="google.protobuf" version="3.7.0" /> <packagereference include="grpc.core" version="1.20.1" /> <packagereference include="grpc.tools" version="1.20.1"> <privateassets>all</privateassets> <includeassets>runtime; build; native; contentfiles; analyzers; buildtransitive</includeassets> </packagereference> <!-- include支持*匹配 --> <!-- grpcservices="client"添加该属性构建相关客户端类文件(元数据) --> <protobuf include="..\grpcdemo.server\protos\*.proto" grpcservices="client" /> </itemgroup> </project>
program.cs
static async task main(string[] args) { var serveraddress = "localhost:50051"; //创建连接通道,端口80 var channel = new channel(serveraddress, channelcredentials.insecure); var client = new greeter.greeterclient(channel); //请求 var reply1 = await client.sayhelloasync( new hellorequest { name = "wu", languageenum = hellorequest.types.language.enus }); console.writeline($"{reply1.message} num:{reply1.num}"); var reply2 = await client.sayhelloasync( new hellorequest { name = "wu", languageenum = hellorequest.types.language.zhcn }); console.writeline($"{reply2.message} num:{reply2.num}"); //使用完后应释放资源 await channel.shutdownasync(); console.writeline("已断开连接"); console.writeline("press any key to exit..."); console.readkey(); }
运行
demo地址 https://github.com/wwwu/grpcdemo
参考文档
https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?view=aspnetcore-3.0
https://developers.google.com/protocol-buffers/docs/proto3
https://grpc.io/docs/guides/