​1.实现 gRPC 方法​

​1.1一元方法​

​1.2服务器流式处理方法​

​1.3客户端流式处理方法​

​1.4双向流式处理方法​

​1.5访问gRPC标头​

​1.6访问 gRPC 尾部​

​1.7配置截止时间​

​1.8取消​

​2.Protobuf 消息​

​2.1标量值类型​

​2.2日期和时间​

​2.3可为 null 的类型​

​2.4字节​

​2.5小数​

​2.6列表​

​2.7字典​

​2.8任意​

​2.9Oneof​

​2.10“值​

​2.11Value​

​3.NET gRPC客户端工程集成​

​3.1注册 gRPC 客户端​

​3.2.netframework​

​3.3配置 HttpHandler​

​3.4配置通道和侦听器​

​3.5截止时间和取消传播​

​3.6命名客户端​

​4.暂时性故障处理​

​4.1暂时性故障处理​

​4.2配置gRPC重试策略​

​4.3Hedging​

 

 

前言

官网才是最好的老师 https://docs.microsoft.com/zh-cn/aspnet/core/grpc/?WT.mc_id=DT-MVP-33797&view=aspnetcore-3.0

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

  • 效率至关重要的轻量级微服务。
  • 需要多种语言用于开发的 Polyglot 系统。
  • 需要处理流式处理请求或响应的点对点实时服务

proto 文件

  • gRPC 服务的定义。
  • 在客户端与服务器之间发送的消息。

 

1.实现 gRPC 方法

1.1一元方法

一元方法以参数的形式获取请求消息,并返回响应。 返回响应时,一元调用完成。

Net5 Grpc基础_.net

Net5 Grpc基础_服务器_02

 

1.2服务器流式处理方法

服务器流式处理方法以参数的形式获取请求消息。由于可以将多个消息流式传输回调用方,因此可使

用 ​​responseStream.WriteAsync​​ 发送响应消息。 当方法返回时,服务器流式处理调用完成。

服务器流式处理方法启动后,客户端无法发送其他消息或数据。

Net5 Grpc基础_.net_03

Net5 Grpc基础_服务器_04

 

1.3客户端流式处理方法

客户端流式处理方法在该方法没有接收消息的情况下启动。 ​​requestStream​​ 参数用于从客户端读取消息

返回响应消息时,客户端流式处理调用完成

Net5 Grpc基础_服务器_05

Net5 Grpc基础_.net_06

 

1.4双向流式处理方法

双向流式处理方法在该方法没有接收到消息的情况下启动。 ​​requestStream​​ 参数用于从客户端读取消息。

该方法可选择使用 ​​responseStream.WriteAsync​​ 发送消息。 当方法返回时,双向流式处理调用完成

Net5 Grpc基础_客户端_07

使用 ​​ResponseStream.ReadAllAsync()​​ 创建用于从服务中读取消息的后台任务。

使用 ​​RequestStream.WriteAsync​​ 将消息发送到服务器。

使用 ​​RequestStream.CompleteAsync()​​ 通知服务器它已发送消息。

Net5 Grpc基础_服务器_08

 

1.5访问gRPC标头

标头可通过 ​​ResponseHeadersAsync​​ 进行访问,它会返回元数据的集合。 标头通常随响应消息一起返回;因此,必须等待它们返回。

Net5 Grpc基础_处理方法_09

 

1.6访问 gRPC 尾部

尾部可通过 ​​GetTrailers()​​ 进行访问,它会返回元数据的集合。 在响应完成后,会返回尾部。 因此,在访问尾部之前,必须等待所有响应消息

一元和客户端流式调用必须等待出现 ​​ResponseAsync​​ 后才能调用 ​​GetTrailers()​​:

Net5 Grpc基础_处理方法_10

服务器和双向流式调用必须等到出现响应流,然后才能调用 ​​GetTrailers()​

Net5 Grpc基础_客户端_11

尾部也可通过 ​​RpcException​​ 进行访问,尾部是从 gRPC 客户端引起的异常中检索得到的

Net5 Grpc基础_客户端_12

 

1.7配置截止时间

1.7.1配置截止时间

client

Net5 Grpc基础_.net_13

server

Net5 Grpc基础_客户端_14

1.7.2传播截止时间

Net5 Grpc基础_处理方法_15 

指定 ​​EnableCallContextPropagation​​自动将截止时间和取消令牌传播到子调用

Net5 Grpc基础_服务器_16

 

1.8取消

让 gRPC 客户端可以取消不再需要的长期运行的调用。

通过传递带有 CallOptions.CancellationToken 的取消令牌,或通过调用 ​​Dispose​​取消 gRPC 调用。

Net5 Grpc基础_故障处理_17

 

2.Protobuf 消息

gRPC 使用 Protobuf 作为其接口定义语言 (IDL)。 Protobuf IDL 是一种中性语言格式,用于指定 gRPC 服务发送和接收的消息。 Protobuf 消息在 ​​.proto​​ 文件中定义。

Net5 Grpc基础_客户端_18

 

2.1标量值类型

Net5 Grpc基础_.net_19

Net5 Grpc基础_处理方法_20

 

2.2日期和时间

Net5 Grpc基础_服务器_21

 Net5 Grpc基础_客户端_22

 

2.3可为 null 的类型

Net5 Grpc基础_.net_23

 

Net5 Grpc基础_故障处理_24

 Net5 Grpc基础_.net_25

 

2.4字节

Protobuf 支持标量值类型为 ​​bytes​​ 的二进制有效负载。 C# 中生成的属性使用 ​​ByteString​​ 作为属性类型

Net5 Grpc基础_客户端_26

Net5 Grpc基础_.net_27

 

2.5小数

Protobuf 本身不支持 .NET ​​decimal​​ 类型,只支持 ​​double​​ 和 ​​float​​。

为 Protobuf 创建自定义 decimal 类型

Net5 Grpc基础_故障处理_28

 

2.6列表

Net5 Grpc基础_服务器_29

Net5 Grpc基础_.net_30

 

2.7字典

Net5 Grpc基础_.net_31

Net5 Grpc基础_服务器_32

 

2.8任意

利用 ​​Any​​ 类型,可以将消息作为嵌入类型使用,而无需 ​​.proto​​ 定义。 

Net5 Grpc基础_处理方法_33

Net5 Grpc基础_处理方法_34

 

2.9Oneof

​oneof​​ 字段是一种语言特性。 编译器在生成消息类时处理 ​​oneof​​ 关键字。 使用 ​​oneof​​ 指定可能返回 ​​Person​​ 或 ​​Error​​ 的响应消息

Net5 Grpc基础_处理方法_35

Net5 Grpc基础_.net_36

 

2.10“值”

​Value​​ 类型表示动态类型的值。 它可以是 ​​null​​、数字、字符串、布尔值、值字典 (​​Struct​​) 或值列表 (​​ValueList​​)。 ​​Value​​ 是一个 Protobuf 已知类型,它使用前面讨论的 ​​oneof​​ 功能

Net5 Grpc基础_故障处理_37

Net5 Grpc基础_服务器_38

 

​2.11Value​​ 特别适用于与 JSON 进行转换

Net5 Grpc基础_服务器_39

 

3.NET gRPC客户端工程集成

gRPC 与 ​​HttpClientFactory​​ 的集成提供了一种创建 gRPC 客户端的集中方式。

 

3.1注册 gRPC 客户端

在 ​​Startup.ConfigureServices​​ 中使用通用的 ​​AddGrpcClient​​ 扩展方法,并指定 gRPC 类型化客户端类和服务地址

Net5 Grpc基础_.net_40

Net5 Grpc基础_处理方法_41

 Net5 Grpc基础_.net_42

 

3.2.netframework

.NET Framework 对 gRPC over HTTP/2 的支持有限。请将该通道配置为使用 WinHttpHandler。

Net5 Grpc基础_客户端_43

 

3.3配置 HttpHandler

​HttpClientFactory​​ 创建 gRPC 客户端使用的 ​​HttpMessageHandler​​。 

server

var channel = GrpcChannel.ForAddress("https://localhost:5001",

                         new GrpcChannelOptions {

                                  HttpHandler = new GrpcWebHandler(new HttpClientHandler())

                          });

 

var client = new Greeter.GreeterClient(channel);

var response = await client.SayHelloAsync(new HelloRequest { Name = ".NET" });

 

client

Net5 Grpc基础_客户端_44

 

3.4配置通道和侦听器

添加客户端在进行 gRPC 调用时将使用的 ​​Interceptor​​ 实例。

Net5 Grpc基础_客户端_45

 

3.5截止时间和取消传播

使用 ​​EnableCallContextPropagation()​​ 自动将截止时间和取消令牌传播到子调用。

Net5 Grpc基础_服务器_46

如果要在调用上下文之外使用客户端,请使用 ​​SuppressContextNotFoundErrors​​ 在配置客户端时禁止显示该错误

Net5 Grpc基础_服务器_47

 

3.6命名客户端

Net5 Grpc基础_客户端_48

 Net5 Grpc基础_故障处理_49

 

4.暂时性故障处理

gRPC 重试是一项功能,允许 gRPC 客户端自动重试失败的调用。

 

4.1暂时性故障处理

客户端应用必须捕获异常并选择如何处理错误。

Net5 Grpc基础_故障处理_50

 

4.2配置gRPC重试策略

​重试策略可以按方法配置,而方法可以使用Names属性进行匹配。MethodName.Default​​,因此它将应用于此通道调用的所有 gRPC 方法。

配置重试策略,状态代码为 ​​Unavailable​​ 的失败 gRPC 调用。

通过设置 ​​GrpcChannelOptions.ServiceConfig​​,将创建的通道配置为使用该重试策略 

MaxAttempts 最大调用尝试次数,包括原始尝试。

InitialBackoff 重试尝试之间的初始退避延迟。

MaxBackoff 最大退避会限制指数退避增长的上限。值必须大于 0。

BackoffMultiplier 每次重试尝试后,退避将乘以该值,并将在乘数大于 1 的情况下以指数方式增加。值必须大于 0。

RetryableStatusCodes 状态代码的集合。 

server

Net5 Grpc基础_故障处理_51

 

client

Net5 Grpc基础_.net_52

 

4.3Hedging

Hedging 是一种备选重试策略。

  • Hedging 的优点是,它可能会更快地返回成功的结果。 它允许同时进行多个 gRPC 调用,并在出现第一个成功的结果时完成。
  • Hedging 缺点是进行了多个调用并且这些调用全部成功。 而仅使用第一个结果,并放弃其余结果。

MaxAttempts Hedging 策略将发送的调用数量上限。

HedgingDelay 第一次调用立即发送,但后续 hedging 调用将按该值延迟发送。  默认值为 0。

NonFatalStatusCodes 指示其他 hedge 调用仍可能会成功的状态代码集合。如果服务器返回非致命状态代码,hedged 调用将继续。

Net5 Grpc基础_故障处理_53