gRPC Channel管理
GRPCChannelManager
负责维护Agent与后端OAP集群通信时使用的网络连接
GRPCChannel
gRPC客户端的核心类之一,逻辑上表示一个Channel
,底层持有一个TCP链接,负责维护此连接的活性。在RPC调用的任何时机,如果检测到底层连接处于关闭状态(terminated
),会尝试重建连接。通常情况下,不需要在RPC调用结束后就关闭Channel
,该Channel
可以被一直重用,直到整个客户端程序关闭。
ManagedChannelBuilder
负责创建客户端Channel
,ManagedChannelBuilder
使用了provider
机制,常用有三种
NettyChannelBuilder
:创建的Channel
底层是基于Netty实现的;SkyWalking Agent中用的是NettyChannelBuilder
OkHttpChannelBuilder
:创建的Channel
底层是基于OkHttp
库实现的InProcessChannelBuilder
:创建进程内通信使用的Channel
GRPCChannel
- SkyWalking 在
ManagedChannel
的基础上封装了自己的Channel实现—GRPCChannel
;可以添加一些装饰器,如验证权限的修饰器AuthenticationDecorator
GRPCChannelManager
维护了一个GRPCChannel
连接以及注册在其上的Listener
监听;
还维护一个后台线程定期检测该GRPCChannel
的连接状态,如果发现连接断开,则会进行重连
启动流程
boot()
方法
- 首先会解析
agent.config
配置文件指定的后端OAP实例地址初始化grpcServers
字段 - 然后会初始化这个定时任务,初次会立即执行,之后每隔30s执行一次,具体执行的就是
GRPCChannelManager.run()
方法,其核心逻辑是检测链接状态并适时重连。 notify()
方法会循环调用所有注册在当前连接上的GRPCChannelListener实例(记录在listeners
集合中)的statusChanged()
方法,通知它们连接创建成功的事件- 设置
reconnect
字段为false
,暂时不会再重建连接了 GRPCChannelManager
提供reportError()
方法,在其他依赖该网络连接的BootService
实现发送请求失败时,可以通过该方法将reconnect
字段设置为true
,并由后台线程重新创建GRPCChannel
。
扫描二维码,分享此文章