™技术博客

skywalking | gRPC连接管理

2021年2月17日

gRPC Channel管理

GRPCChannelManager
负责维护Agent与后端OAP集群通信时使用的网络连接

GRPCChannel
gRPC客户端的核心类之一,逻辑上表示一个Channel,底层持有一个TCP链接,负责维护此连接的活性。在RPC调用的任何时机,如果检测到底层连接处于关闭状态(terminated),会尝试重建连接。通常情况下,不需要在RPC调用结束后就关闭Channel,该Channel可以被一直重用,直到整个客户端程序关闭。

ManagedChannelBuilder负责创建客户端ChannelManagedChannelBuilder使用了provider机制,常用有三种

  • NettyChannelBuilder:创建的Channel底层是基于Netty实现的;SkyWalking Agent中用的是NettyChannelBuilder
  • OkHttpChannelBuilder:创建的Channel底层是基于OkHttp库实现的
  • InProcessChannelBuilder:创建进程内通信使用的Channel

GRPCChannel

  • SkyWalking 在ManagedChannel的基础上封装了自己的Channel实现—GRPCChannel;可以添加一些装饰器,如验证权限的修饰器AuthenticationDecorator

GRPCChannelManager
维护了一个GRPCChannel连接以及注册在其上的Listener监听;
还维护一个后台线程定期检测该GRPCChannel的连接状态,如果发现连接断开,则会进行重连

启动流程

boot()方法

  1. 首先会解析agent.config配置文件指定的后端OAP实例地址初始化grpcServers字段
  2. 然后会初始化这个定时任务,初次会立即执行,之后每隔30s执行一次,具体执行的就是GRPCChannelManager.run()方法,其核心逻辑是检测链接状态并适时重连。
  3. notify()方法会循环调用所有注册在当前连接上的GRPCChannelListener实例(记录在listeners集合中)的statusChanged()方法,通知它们连接创建成功的事件
  4. 设置reconnect字段为false,暂时不会再重建连接了
  5. GRPCChannelManager 提供reportError()方法,在其他依赖该网络连接的 BootService 实现发送请求失败时,可以通过该方法将 reconnect 字段设置为 true,并由后台线程重新创建GRPCChannel

扫描二维码,分享此文章