gRPC
文章平均质量分 71
呜呜呜啦啦啦
这个作者很懒,什么都没留下…
展开
-
gRPC Transport
gRPC TransportTransport 分为 ClientTransport 和 ServerTransport,分别用于客户端和服务端ClientTransportClientTransport 与真正的 IP 地址是一一对应的,用于建立连接,创建流实现ClientTransport 有多个继承接口和实现类:支持失败的实现类 FailingClientTransport,客户端启动时创建的流会快速失败支持生命周期管理的接口 ManagedClientTransport支持延迟原创 2021-04-04 09:13:41 · 820 阅读 · 3 评论 -
gRPC Stream
gRPC StreamStream 在 gRPC 中代表一个真正的请求,包含要发送的 消息;Stream 分为 ClientStream 和 ServerStreamClientStreamClientStream 接口继承 Stream 接口,有多个实现类或抽象实现类:ForwardingClientStream: 用于转发的 ClientStream,支持代理真正的流,可以用于触发一些动作,如统计等NoopClientStream: 不做任何操作的 ClientStream,用于空实现原创 2021-04-04 09:13:09 · 2441 阅读 · 0 评论 -
gRPC Server 端请求处理流程
gRPC Server 端请求处理流程文章目录gRPC Server 端请求处理流程初始化处理请求请求整体处理流程1. 读取 Settings 帧2. 接收 header3. 流创建事件4. 流 ready 事件5. 执行流创建任务6. 提交要求指定数量的消息任务7. 执行流 ready 任务8. 执行读取指定数量的消息任务并提交有可用消息任务9. 执行有新的可用消息任务10. 提交半关闭请求任务11. 执行半关闭任务处理响应1. 执行业务逻辑处理2. 发送响应内容1. 发送响应 header2. 发送原创 2021-04-04 09:12:38 · 2036 阅读 · 1 评论 -
gRPC Server 端启动流程
gRPC Server 端启动流程gRPC Server 启动流程,底层实现以 Netty 为例;核心类io.grpc.ServerServer 的定义接口,实现类是 io.grpc.internal.ServerImpl,实现了服务、方法与方法处理器的绑定,端口监听,不同类型的 Server 实现的调用,Server 生命周期管理等io.grpc.BindableService由编译器生成的服务抽象类的基础接口,并将实现类绑定到服务器,提供将服务的实现的实例绑定到 Server 的方式原创 2021-04-04 09:11:45 · 3241 阅读 · 0 评论 -
gRPC Server 端关闭流程
gRPC Server 端关闭流程关闭 Server关闭 Server 可以使用 shutdown 或者 shutdownNow 方法shutdownserver.shutdown().awaitTermination(10, TimeUnit.SECONDS);io.grpc.internal.ServerImpl#shutdown开始顺序的关闭 Server,已经存在的请求会继续执行,新的请求会被拒绝public ServerImpl shutdown() { boolean原创 2021-04-04 09:11:16 · 5378 阅读 · 1 评论 -
gRPC Gateway 使用
gRPC Gateway 使用gRPC Gateway 可以代理 gRPC 服务,接收 HTTP 请求,并转为 gRPC 请求由服务进行处理,并将返回结果转换为 HTTP 响应发送给调用者 gRPC Gateway支持代理单个服务或者多个服务,当代理多个服务时,可以通过命名解析实现转发请求快速使用启动项目git clone https://github.com/helloworlde/grpc-gateway.git & cd grpc-gatewaymake all 访问原创 2021-04-04 09:10:42 · 1323 阅读 · 0 评论 -
gRPC Client 启动流程
gRPC Client 启动流程gRPC 启动初始化的流程,使用 Netty 作为底层的实现初始化 ChannelChannel 的初始化通过 ChannelBuilder 构建这里通过 forTarget 设置了要解析的服务名称,会通过 NameResolver 解析,转换为具体的地址ManagedChannel channel = ManagedChannelBuilder.forTarget("grpc-server")原创 2021-04-03 12:17:35 · 2424 阅读 · 0 评论 -
gRPC-Channel
gRPC ChannelChannel 是用于执行 RPC 请求的概念上的端点连接,基于负载和配置,一个 Channel 可以有 0 或多个真实连接Subchannel 代表逻辑连接,最多维护一个物理连接发送 RPC,对应多个 TransportChannel 有多个子类:ManagedChannel: 实现了生命周期管理能力的抽象子类ManagedChannelImpl: ManagedChannel 的实现类,Channel 的主要实现ManagedChannelOrphanWrapp原创 2021-04-03 12:17:03 · 5490 阅读 · 0 评论 -
gRPC 自定义健康检查
gRPC 自定义健康检查在 gRPC 中自定义健康检查逻辑,用于检查特定的组件(如检查 Redis、MQ 等),或者结合其他的服务组件一起使用(如使用 Spring Boot 的健康检查)实现gRPC 的健康检查服务是通过 health.proto定义的health.protosyntax = "proto3";package grpc.health.v1;option csharp_namespace = "Grpc.Health.V1";option go_package =原创 2021-04-03 12:16:32 · 1341 阅读 · 0 评论 -
gRPC 重试流程
gRPC 重试流程当第一次调用失败,流监听器关闭的时候,会根据请求的处理状态和方法的配置,判断是否需要重试请求的处理状态有三种,在io.grpc.internal.ClientStreamListener.RpcProgress中定义:PROCESSED: 请求被正常处理,按照返回的状态码决定是否要重试REFUSED: 没有被服务端的应用逻辑层处理,直接重试,不计入重试次数DROPPED: 请求被负载均衡丢弃了,不重试,如果是对冲则取消其他的对冲请求,直接提交发起请求io.grpc.s原创 2021-04-03 12:16:05 · 2037 阅读 · 1 评论 -
gRPC 中使用 Channelz
gRPC 中使用 ChannelzgRPC 提供了 Channelz 用于对外提供服务的数据,用于调试、监控等;根据服务的角色不同,可以提供的数据有:服务端: Servers, Server, ServerSockets, Socket客户端: TopChannels, Channel, SubchannelChannelz 服务定义参考 Channelz 的设计 gRPC Channelz 以及服务定义 channelz.proto,提供了以下方法:service Channelz {/原创 2021-04-03 12:15:21 · 20980 阅读 · 0 评论 -
gRPC 中监听 Sream 和 Transport 的事件
gRPC 中监听 Sream 和 Transport 的事件gRPC 提供了拦截器可以监听请求的事件,但是对于 Stream 或者 Transport 的具体事件,无法通过拦截器实现;gRPC 提供了 StreamTracer 和 TransportFilter 支持这样的能力StreamTracerStreamTracer 用于监听流的所有事件,包括流关闭、出入站消息、出入站流大小等信息StreamTracer 有用于客户端的 ClientStreamTracer 和用于服务端的 ServerSt原创 2021-04-03 12:14:48 · 976 阅读 · 0 评论 -
gRPC 中泛化调用服务接口
gRPC 中泛化调用服务接口gRPC 没有直接支持泛化调用,protobuf 可以不依赖于生成的代码实现调用,所以可以通过反射接口间接实现泛化调用要求 Server 端提供 grpc.reflection.v1alpha.ServerReflection 服务,用于获取服务的描述文件大致的流程是:根据方法名称,调用服务端反射服务的方法,获取方法所在 proto 文件的描述根据 proto 描述文件,获取文件描述、服务描述,用于重新构建要被调用方法的方法描述 MethodDescriptor根据原创 2021-04-03 12:14:12 · 3422 阅读 · 0 评论 -
gRPC 中的核心概念
gRPC 中的核心概念StubStub 层暴露给开发者,提供类型安全的绑定到正在适应的数据模型/IDL/接口ChannelChannel 层是传输处理之上的抽象,适合拦截器、装饰器,并比 Stub 层暴露更多的行为给应用一个 Channel 可能有多个 SubchannelSubchannelSubchannel 代表负载均衡过的 ChannelChannel 状态CONNECTINGChannel 正在尝试建立连接,并且正在等待名称解析,TCP连接建立或TLS握手所涉及的步骤之一,原创 2021-04-03 12:13:38 · 827 阅读 · 1 评论 -
gRPC 中打印请求二进制日志
gRPC 中打印请求二进制日志gRPC 支持将请求调用的参数、Header 等信息以二进制的方式输出到文件中,方便在必要时排查问题使用1. 添加依赖binlog 的依赖在 grpc-services中,所以需要有该依赖dependencies { implementation("io.grpc:grpc-services:${grpcVersion}")}2. 添加 BinaryLogSink 实现@Slf4jpublic class CustomBinaryLogSink im原创 2021-04-03 12:13:05 · 876 阅读 · 0 评论 -
gRPC 中 Binlog 打印原理
gRPC 中 Binlog 打印原理gRPC 支持将请求调用的参数、Header 等信息以二进制的方式输出到文件中使用binlog 的依赖在 grpc-services中,所以需要有该依赖创建 Channel 时指定BinaryLog binaryLog = BinaryLogs.createBinaryLog(new TempFileSink(), "*");this.channel = ManagedChannelBuilder.forAddress(host, port)原创 2021-04-03 12:12:31 · 372 阅读 · 0 评论 -
gRPC 使用自定义的 NameResolver
gRPC 使用自定义的 NameResolver在使用注册中心时,gRPC 并未提供注册中心的服务发现,需要自己实现 NameResolverProvider 和 NameResolverNameResolverNameResolver 里面重写了 start 和 refresh 方法,这两个方法都调用一个 resolve 方法做服务发现;resovle 方法内部通过服务名从注册中心拉取服务实例列表,然后调用 Listener 的 onResult方法,将实例列表传递给 LoadBalancer原创 2021-03-28 11:40:44 · 2967 阅读 · 1 评论 -
gRPC 使用自定义的 LoadBalancer
gRPC 使用自定义的 LoadBalancergRPC 中提供了 round_robin, pick_first, grpclb, HealthCheckingRoundRobin 等负载均衡的实现,默认使用HealthCheckingRoundRobin,该负载均衡支持检查 Subchannel 的健康状态LoadBalancer 主要类包括 LoadBalancerProvider, LoadBalancer, SubchannelPicker, LoadBalancer.SubchannelSt原创 2021-03-28 11:40:12 · 1775 阅读 · 1 评论 -
gRPC 命名解析
gRPC 命名解析命名解析根据服务的 URI,从注册中心获取并解析服务实例 IP,默认支持 schema 为 DNS,grpclb,xds 等gRPC 的命名解析的父类接口是 NameResolverNameResolver 包含有多个子类,用于实现命名解析每个 NameResolver 都有一个 Provider,用于创建 NameResolver 实例;所有的 Provider 都注册到 NameResolverRegistry 中,NameResolverRegistry 创建 Facto原创 2021-03-28 11:39:24 · 1519 阅读 · 0 评论 -
gRPC 拦截器和监听器
gRPC 拦截器和监听器gRPC 拦截器用于在请求执行之前执行,以实现校验授权,记录调用行为,插入其他逻辑等;拦截器有 ClientInterceptor 和 ServerInterceptor,分别用于客户端和服务端客户端拦截器接口定义ClientInterceptor@ThreadSafepublic interface ClientInterceptor { <ReqT, RespT> ClientCall<ReqT, RespT> interceptC原创 2021-03-28 11:38:51 · 2672 阅读 · 1 评论 -
gRPC 健康检查
gRPC 健康检查在 gRPC 中使用健康检查,在负载均衡前通过健康检查,只对健康的 Subchannel 发起请求,保证请求的成功率使用Server 端健康检查是一个独立的 Service,需要在 Server 端显式添加健康检查服务健康检查定义了两个方法,一个适用于单次请求的 check 方法,另一个是适用于 Stream 流的 watch 方法Server 端的健康检查由 io.grpc.services.HealthStatusManager控制,抽象类是 io.grpc.health原创 2021-03-28 11:38:15 · 1884 阅读 · 0 评论 -
gRPC 健康检查
gRPC 健康检查在 gRPC 中使用健康检查,在负载均衡前通过健康检查,只对健康的 Subchannel 发起请求,保证请求的成功率使用Server 端健康检查是一个独立的 Service,需要在 Server 端显式添加健康检查服务健康检查定义了两个方法,一个适用于单次请求的 check 方法,另一个是适用于 Stream 流的 watch 方法Server 端的健康检查由 io.grpc.services.HealthStatusManager控制,抽象类是 io.grpc.health原创 2021-03-28 11:37:48 · 1534 阅读 · 0 评论 -
gRPC 负载均衡
gRPC 负载均衡gRPC 内定义了 LoadBalancer 接口,用于负载均衡LoadBalancer 中的主要方法handleResolvedAddress:处理 NameResolver 解析的地址,用于创建 SubchannelhandleNameResolutionError: 处理命名解析失败,会销毁已经存在的 SuchannelrequestConnection: 创建连接,会为 Subchannel 初始化 Transport,并建立连接LoadBalancer原创 2021-03-28 11:37:12 · 2862 阅读 · 2 评论 -
gRPC 服务使用 TLS 加密
gRPC 服务使用 TLS 加密gRPC 支持使用 TLS 对请求进行加密SSL(Secure Socket Layer,安全套接字),是面向连接的网络层和应用层协议之间的一种协议层;SSL 通过互相认证、使用数字签名确保完整性、使用加密确保隐私性,以实现客户端和服务端之间的安全通讯TLS(Transport Layer Security, 传输层安全协议),用于两个应用程序之间提供保密性和数据完整性SSL是基于 HTTP 之下 TCP 之上的一个协议层,在SSL更新到3.0时,IETF对SSL3原创 2021-03-28 11:36:40 · 2046 阅读 · 0 评论 -
gRPC 服务间调用事件流程
gRPC 服务间调用事件流程调用流程可监听的事件客户端ClientCall客户端调用,用于执行客户端的调用行为checkStart:开始调用request:指定发送消息的数量sendMessage:发送消息到缓冲区halfClose:半关闭,会将消息发送给 Server 端cancel:调用失败时取消ClientCall.Listener调用监听器,监听调用事件onReady:流就绪事件,用于非 UNARY 和 SERVER_STREAM 的请求onHeaders:当接收原创 2021-03-28 11:36:03 · 1641 阅读 · 1 评论 -
gRPC 反射服务
gRPC 反射服务gRPC 提供了 grpc.reflection.v1alpha.ServerReflection 服务,在 Server 端添加后可以通过该服务获取所有服务的信息,包括服务定义,方法,属性等;可以根据获取到的服务信息调用其他的方法,实现泛化调用;gRPC 调试工具 grpcurl 和 gRPC Swagger 等工具都是通过这种方式实现的定义参考 GRPC Server Reflection Protocol 和 reflection.proto该服务只有一个双向流的方法 Se原创 2021-03-28 11:34:13 · 6704 阅读 · 1 评论 -
gRPC 对冲原理
gRPC 对冲原理gRPC 对冲开启后,当请求在指定的时间间隔后没有返回时,会发起对冲请求,继续等待,如果依然没有返回,则重复发送直到接收到返回结果或者超时取消对冲适用于当下游服务部分节点故障无法及时响应或者响应不及时的场景,通过对冲可以减少请求的失败率,但是可能会导致延时增加对冲和重试的流程相似,在第一次发起请求的时候根据服务名和方法名决定使用哪种策略;如果是对冲策略,则在发起请求时提交一个延时任务,这个任务会发起一个新的请求,并在执行的时候再发起一个请求,并将这些请求添加到队列中;多个请求哪个先返原创 2021-03-27 21:37:15 · 815 阅读 · 0 评论 -
gRPC 超时时间与重试时间间隔
gRPC 的超时时间生效机制以及重试超时时间间隔超时时间配置对指定的服务和方法单独设置超时时间,timeout 作用于所有的 RPC 请求(无论是否重试,都会在 timeout 的时间之后超时,进行中的重试请求会被取消){ "methodConfig": [ { "name": [ { "service": "io.github.helloworlde.grpc.UserInfo.原创 2021-03-27 21:34:55 · 4464 阅读 · 0 评论