Asp.Net Core Grpc 入门实践
tom 2021-05-07 19:32:18 2021-05-07 103 0
Grpc简介
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
在 gRPC 中,客户端应用程序可以直接调用不同计算机上的服务器应用程序上的方法,就像它是本地对象一样,从而更轻松地创建分布式应用程序和服务。它基于定义服务的想法,指定了参数和返回类型的远程过程调用的方法。服务器端实现这个接口并运行grpc服务来处理客户端的请求,客户端调用相同的方法完成请求。.NET 上的 gRPC 的简介gRPC 的主要优点是:
现代高性能轻量级 RPC 框架。 协定优先 API 开发,默认使用协议缓冲区(Protocol Buffers),允许与语言无关的实现。 可用于多种语言的工具,以生成强类型服务器和客户端。 支持客户端、服务器和双向流式处理调用。 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
效率至关重要的轻量级微服务。 需要多种语言用于开发的 Polyglot 系统。 需要处理流式处理请求或响应的点对点实时服务。 低延迟、高度可扩展的分布式系统。 开发与云服务器通信的移动客户端。 设计一个需要准确、高效且独立于语言的新协议。 分层设计,以启用扩展,例如。身份验证、负载平衡、日志记录和监控等
Protocol Buffers
在C#中会生成一个名为FirstMessage的类,基本格式如下:first.protosyntax="proto3"; //指定协议版本package my.project;//C# namespace MyProjectoption csharp_namespace="GrpcDemo.Protos"; //生成C#代码时命名空间message FirstMessage{ int32 id=1; string name=2; bool is_male=3;}
定义服务:
指定输入HelloRequest和输出HelloReply,以及方法名SayHello C#会生成对应的类和方法。
// The greeter 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 greetingsmessage HelloReply { string message = 1;
指定字段数据类型
字段编号
每个字段都会有一个唯一的字段编号,这个非常重要。json中传递数据是以字段名为key,protobuf 是以字段编号为主,所以不要轻易变化编号。
范围 1 到 15 中的字段编号需要一个字节进行编码,范围 16 到 2047 中的字段编号需要两个字节。所以需要为使用频繁的字段编号预留字段号1到15,并且为可能添加的元素预留一点字段号。指定字段规则
- required:必填效验?
- optional ?
- repeated 可以出现多次,类似list
四种定义方式
一元Unary RPC
rpc SayHello(HelloRequest) returns (HelloResponse);
服务流Server streaming Rpcs
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
客户端流Client streaming RPCs
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
双向流Bidirectional streaming RPCs
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
![](https://daimanet.oss-cn-beijing.aliyuncs.com/2021/2021-05/2021-05-08/4474b8a8ccfc48e9ab9d116545531f57_5.png?x-oss-p