1.实现 gRPC 方法
1.8取消
2.Protobuf 消息
2.4字节
2.5小数
2.6列表
2.7字典
2.8任意
2.10“值
3.NET gRPC客户端工程集成
4.暂时性故障处理
前言
官网才是最好的老师 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一元方法
一元方法以参数的形式获取请求消息,并返回响应。 返回响应时,一元调用完成。
1.2服务器流式处理方法
服务器流式处理方法以参数的形式获取请求消息。由于可以将多个消息流式传输回调用方,因此可使
用 responseStream.WriteAsync
发送响应消息。 当方法返回时,服务器流式处理调用完成。
服务器流式处理方法启动后,客户端无法发送其他消息或数据。
1.3客户端流式处理方法
客户端流式处理方法在该方法没有接收消息的情况下启动。 requestStream
参数用于从客户端读取消息
返回响应消息时,客户端流式处理调用完成
1.4双向流式处理方法
双向流式处理方法在该方法没有接收到消息的情况下启动。 requestStream
参数用于从客户端读取消息。
该方法可选择使用 responseStream.WriteAsync
发送消息。 当方法返回时,双向流式处理调用完成
使用 ResponseStream.ReadAllAsync()
创建用于从服务中读取消息的后台任务。
使用 RequestStream.WriteAsync
将消息发送到服务器。
使用 RequestStream.CompleteAsync()
通知服务器它已发送消息。
1.5访问gRPC标头
标头可通过 ResponseHeadersAsync
进行访问,它会返回元数据的集合。 标头通常随响应消息一起返回;因此,必须等待它们返回。
1.6访问 gRPC 尾部
尾部可通过 GetTrailers()
进行访问,它会返回元数据的集合。 在响应完成后,会返回尾部。 因此,在访问尾部之前,必须等待所有响应消息
一元和客户端流式调用必须等待出现 ResponseAsync
后才能调用 GetTrailers()
:
服务器和双向流式调用必须等到出现响应流,然后才能调用 GetTrailers()
尾部也可通过 RpcException
进行访问,尾部是从 gRPC 客户端引起的异常中检索得到的
1.7配置截止时间
1.7.1配置截止时间
client
server
1.7.2传播截止时间
指定 EnableCallContextPropagation
自动将截止时间和取消令牌传播到子调用
1.8取消
让 gRPC 客户端可以取消不再需要的长期运行的调用。
通过传递带有 CallOptions.CancellationToken 的取消令牌,或通过调用 Dispose
取消 gRPC 调用。
2.Protobuf 消息
gRPC 使用 Protobuf 作为其接口定义语言 (IDL)。 Protobuf IDL 是一种中性语言格式,用于指定 gRPC 服务发送和接收的消息。 Protobuf 消息在 .proto
文件中定义。
2.1标量值类型
2.2日期和时间
2.3可为 null 的类型
2.4字节
Protobuf 支持标量值类型为 bytes
的二进制有效负载。 C# 中生成的属性使用 ByteString
作为属性类型
2.5小数
Protobuf 本身不支持 .NET decimal
类型,只支持 double
和 float
。
为 Protobuf 创建自定义 decimal 类型
2.6列表
2.7字典
2.8任意
利用 Any
类型,可以将消息作为嵌入类型使用,而无需 .proto
定义。
2.9Oneof
oneof
字段是一种语言特性。 编译器在生成消息类时处理 oneof
关键字。 使用 oneof
指定可能返回 Person
或 Error
的响应消息
2.10“值”
Value
类型表示动态类型的值。 它可以是 null
、数字、字符串、布尔值、值字典 (Struct
) 或值列表 (ValueList
)。 Value
是一个 Protobuf 已知类型,它使用前面讨论的 oneof
功能
2.11Value
特别适用于与 JSON 进行转换
3.NET gRPC客户端工程集成
gRPC 与 HttpClientFactory
的集成提供了一种创建 gRPC 客户端的集中方式。
3.1注册 gRPC 客户端
在 Startup.ConfigureServices
中使用通用的 AddGrpcClient
扩展方法,并指定 gRPC 类型化客户端类和服务地址
3.2.netframework
.NET Framework 对 gRPC over HTTP/2 的支持有限。请将该通道配置为使用 WinHttpHandler。
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
3.4配置通道和侦听器
添加客户端在进行 gRPC 调用时将使用的 Interceptor
实例。
3.5截止时间和取消传播
使用 EnableCallContextPropagation()
自动将截止时间和取消令牌传播到子调用。
如果要在调用上下文之外使用客户端,请使用 SuppressContextNotFoundErrors
在配置客户端时禁止显示该错误
3.6命名客户端
4.暂时性故障处理
gRPC 重试是一项功能,允许 gRPC 客户端自动重试失败的调用。
4.1暂时性故障处理
客户端应用必须捕获异常并选择如何处理错误。
4.2配置gRPC重试策略
重试策略可以按方法配置,而方法可以使用Names属性进行匹配。MethodName.Default
,因此它将应用于此通道调用的所有 gRPC 方法。
配置重试策略,状态代码为 Unavailable
的失败 gRPC 调用。
通过设置 GrpcChannelOptions.ServiceConfig
,将创建的通道配置为使用该重试策略
MaxAttempts 最大调用尝试次数,包括原始尝试。
InitialBackoff 重试尝试之间的初始退避延迟。
MaxBackoff 最大退避会限制指数退避增长的上限。值必须大于 0。
BackoffMultiplier 每次重试尝试后,退避将乘以该值,并将在乘数大于 1 的情况下以指数方式增加。值必须大于 0。
RetryableStatusCodes 状态代码的集合。
server
client
4.3Hedging
Hedging 是一种备选重试策略。
- Hedging 的优点是,它可能会更快地返回成功的结果。 它允许同时进行多个 gRPC 调用,并在出现第一个成功的结果时完成。
- Hedging 缺点是进行了多个调用并且这些调用全部成功。 而仅使用第一个结果,并放弃其余结果。
MaxAttempts Hedging 策略将发送的调用数量上限。
HedgingDelay 第一次调用立即发送,但后续 hedging 调用将按该值延迟发送。 默认值为 0。
NonFatalStatusCodes 指示其他 hedge 调用仍可能会成功的状态代码集合。如果服务器返回非致命状态代码,hedged 调用将继续。