December 23, 2020
gRPC
gRPC 中监听 Sream 和 Transport 的事件gRPC 提供了拦截器可以监听请求的事件,但是对于 Stream 或者 Transport 的具体事件,无法通过拦截器实现;gRPC 提供了 StreamTracer 和 TransportFilter 支持这样的能力
Stream ...
Read more
December 15, 2020
gRPC
gRPC Server 端请求处理流程[TOC]
初始化
创建并启动 ServerTransport
在 Server 启动的时候,最终调用 NettyServer 的 start() 方法,为 ServerBootstrap 添加了 ChannelInitializer,最终,当有新的连 ...
Read more
December 5, 2020
gRPC
gRPC Server 端启动流程gRPC Server 启动流程,底层实现以 Netty 为例;
核心类
io.grpc.Server
Server 的定义接口,实现类是 io.grpc.internal.ServerImpl,实现了服务、方法与方法处理器的绑定,端口监听,不同类型的 ...
Read more
December 5, 2020
gRPC
gRPC Server 端关闭流程关闭 Server关闭 Server 可以使用 shutdown 或者 shutdownNow 方法
shutdown1server.shutdown().awaitTermination(10, TimeUnit.SECONDS);
io.grpc.i ...
Read more
November 18, 2020
gRPC
gRPC ChannelChannel 是用于执行 RPC 请求的概念上的端点连接,基于负载和配置,一个 Channel 可以有 0 或多个真实连接
Subchannel 代表逻辑连接,最多维护一个物理连接发送 RPC,对应多个 Transport
Channel 有多个子类:
Man ...
Read more
November 17, 2020
gRPC
gRPC Client 启动流程gRPC 启动初始化的流程,使用 Netty 作为底层的实现
初始化 ChannelChannel 的初始化通过 ChannelBuilder 构建这里通过 forTarget 设置了要解析的服务名称,会通过 NameResolver 解析,转换为具体的地址
...
Read more
November 8, 2020
gRPC
gRPC StreamStream 在 gRPC 中代表一个真正的请求,包含要发送的 消息;Stream 分为 ClientStream 和 ServerStream
ClientStreamClientStream 接口继承 Stream 接口,有多个实现类或抽象实现类:
Forwar ...
Read more
October 22, 2020
gRPC
gRPC TransportTransport 分为 ClientTransport 和 ServerTransport,分别用于客户端和服务端
ClientTransportClientTransport 与真正的 IP 地址是一一对应的,用于建立连接,创建流
实现ClientTrans ...
Read more
September 29, 2020
gRPC
gRPC 使用自定义的 LoadBalancergRPC 中提供了 round_robin, pick_first, grpclb, HealthCheckingRoundRobin 等负载均衡的实现,默认使用HealthCheckingRoundRobin,该负载均衡支持检查 Subcha ...
Read more
September 20, 2020
gRPC
gRPC 超时时间与重试时间间隔
gRPC 的超时时间生效机制以及重试超时时间间隔
超时时间配置对指定的服务和方法单独设置超时时间,timeout 作用于所有的 RPC 请求(无论是否重试,都会在 timeout 的时间之后超时,进行中的重试请求会被取消)
123456789101112 ...
Read more
September 20, 2020
gRPC
gRPC 中的核心概念StubStub 层暴露给开发者,提供类型安全的绑定到正在适应的数据模型/IDL/接口
ChannelChannel 层是传输处理之上的抽象,适合拦截器、装饰器,并比 Stub 层暴露更多的行为给应用一个 Channel 可能有多个 Subchannel
Subcha ...
Read more
September 20, 2020
gRPC
gRPC 重试流程当第一次调用失败,流监听器关闭的时候,会根据请求的处理状态和方法的配置,判断是否需要重试
请求的处理状态有三种,在io.grpc.internal.ClientStreamListener.RpcProgress中定义:
PROCESSED: 请求被正常处理,按照返回的状 ...
Read more
September 20, 2020
gRPC
gRPC 对冲原理gRPC 对冲开启后,当请求在指定的时间间隔后没有返回时,会发起对冲请求,继续等待,如果依然没有返回,则重复发送直到接收到返回结果或者超时取消
对冲适用于当下游服务部分节点故障无法及时响应或者响应不及时的场景,通过对冲可以减少请求的失败率,但是可能会导致延时增加
对冲和重试 ...
Read more
September 20, 2020
gRPC
gRPC 自定义健康检查在 gRPC 中自定义健康检查逻辑,用于检查特定的组件(如检查 Redis、MQ 等),或者结合其他的服务组件一起使用(如使用 Spring Boot 的健康检查)
实现gRPC 的健康检查服务是通过 health.proto定义的
health.proto
1 ...
Read more
September 20, 2020
gRPC
gRPC 健康检查在 gRPC 中使用健康检查,在负载均衡前通过健康检查,只对健康的 Subchannel 发起请求,保证请求的成功率
使用Server 端健康检查是一个独立的 Service,需要在 Server 端显式添加健康检查服务
健康检查定义了两个方法,一个适用于单次请求的 ch ...
Read more
September 20, 2020
gRPC
gRPC 负载均衡gRPC 内定义了 LoadBalancer 接口,用于负载均衡
LoadBalancer 中的主要方法
handleResolvedAddress:处理 NameResolver 解析的地址,用于创建 Subchannel
handleNameResolutio ...
Read more
September 20, 2020
Kubernetes
HPA 使用自定义的指标自动扩缩容Kubernetes 支持使用自定义的指标作为 HPA 的依据;
KEDA 是基于事件驱动的自动扩缩容组件;主要有两部分:
Agent: 用于触发和停用扩缩容,通过 keda-operator 实现
Metrics: 用于收集指标,提供给 Agent,通过 ...
Read more
September 20, 2020
gRPC
gRPC 命名解析命名解析根据服务的 URI,从注册中心获取并解析服务实例 IP,默认支持 schema 为 DNS,grpclb,xds 等
gRPC 的命名解析的父类接口是 NameResolver
NameResolver 包含有多个子类,用于实现命名解析每个 NameResolve ...
Read more
September 20, 2020
gRPC
gRPC 使用自定义的 NameResolver在使用注册中心时,gRPC 并未提供注册中心的服务发现,需要自己实现 NameResolverProvider 和 NameResolver
NameResolver
NameResolver 里面重写了 start 和 refresh 方 ...
Read more
September 20, 2020
gRPC
gRPC 中 Binlog 打印原理gRPC 支持将请求调用的参数、Header 等信息以二进制的方式输出到文件中
使用binlog 的依赖在 grpc-services中,所以需要有该依赖
创建 Channel 时指定
12345BinaryLog binaryLog = Binary ...
Read more