点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/SkyWalking/collector-remote-module/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 SkyWalking 3.2.6 正式版
1. 概述
本文主要分享 SkyWalking Collector Remote 远程通信服务。该服务用于 Collector 集群内部通信。
目前集群内部通信的目的,跨节点的流式处理。Remote Module 应用在 SkyWalking 架构图如下位置( 红框 ) :
FROM https://github.com/apache/incubating-skywalking
下面我们来看看整体的项目结构,如下图所示 :
下面,我们从接口到实现的顺序进行分享。
2. collector-remote-define
collector-remote-define
:定义远程通信接口。项目结构如下 :
整体流程如下图:
我们按照整个流程的处理顺序,逐个解析涉及到的类与接口。
2.1 RemoteModule
org.skywalking.apm.collector.remote.RemoteModule
,实现 Module 抽象类,远程通信 Module 。
#name()
实现方法,返回模块名为 "remote"
。
#services()
实现方法,返回 Service 类名:RemoteSenderService 、RemoteDataRegisterService 。
2.2 RemoteSenderService
org.skywalking.apm.collector.remote.service.RemoteSenderService
,继承 Service 接口,远程发送服务接口,定义了 #send(graphId, nodeId, data, selector)
接口方法,调用 RemoteClient ,发送数据。
2.3 RemoteClientService
org.skywalking.apm.collector.remote.service.RemoteClientService
,继承 Service 接口,远程客户端服务接口,定义了 #create(host, port, channelSize, bufferSize)
接口方法,创建 RemoteClient 对象。
2.4 RemoteClient
org.skywalking.apm.collector.remote.service.RemoteClient
,继承 java.lang.Comparable
接口,远程客户端接口。定义了如下接口方法:
2.5 CommonRemoteDataRegisterService
在说 CommonRemoteDataRegisterService 之前,首先来说下 CommonRemoteDataRegisterService 的意图。
在上文中,我们可以看到发送给 Collector 是 Data 对象,而 Data 是数据的抽象类,在具体反序列化 Data 对象之前,程序是无法得知它是 Data 的哪个实现对象。这个时候,我们可以给 Data 对象的每个实现类,生成一个对应的数据协议编号。
org.skywalking.apm.collector.remote.service.CommonRemoteDataRegisterService
,通用远程数据注册服务。
2.5.1 RemoteDataRegisterService
org.skywalking.apm.collector.remote.service.RemoteDataRegisterService
,继承 Service 接口,远程客户端服务接口,定义了 #register(Class<? extends Data>, RemoteDataInstanceCreator)
接口方法,注册数据类型对应的远程数据创建器( RemoteDataRegisterService.RemoteDataInstanceCreator
)对象。
CommonRemoteDataRegisterService 实现了 RemoteDataRegisterService 接口,#register(Class<? extends Data>, RemoteDataInstanceCreator)
实现方法。
另外,AgentStreamRemoteDataRegister 会调用 RemoteDataRegisterService#register(Class<? extends Data>, RemoteDataInstanceCreator)
方法,注册每个数据类型的 RemoteDataInstanceCreator 对象。注意,例如 Application::new
是 RemoteDataInstanceCreator 的匿名实现类。
2.5.2 RemoteDataIDGetter
org.skywalking.apm.collector.remote.service.RemoteDataIDGetter
,继承 Service 接口,远程数据协议编号获取器接口,定义了 #getRemoteDataId(Class<? extends Data>)
接口方法,根据数据类型获取数据协议编号。
CommonRemoteDataRegisterService 实现了 RemoteDataIDGetter 接口,#getRemoteDataId(Class<? extends Data>)
实现方法。
2.5.3 RemoteDataInstanceCreatorGetter
org.skywalking.apm.collector.remote.service.RemoteDataInstanceCreatorGetter
,继承 Service 接口,远程数据创建器的获取器接口,定义了 #getInstanceCreator(remoteDataId
接口方法,根据数据协议编号获得远程数据创建器( RemoteDataInstanceCreator )。
CommonRemoteDataRegisterService 实现了 RemoteDataInstanceCreatorGetter 接口,#getInstanceCreator(remoteDataId)
实现方法。
2.6 RemoteSerializeService
org.skywalking.apm.collector.remote.service.RemoteSerializeService
,远程通信序列化服务接口,定义了 #serialize(Data)
接口方法,序列化数据,生成 Builder 对象。
2.7 RemoteSerializeService
org.skywalking.apm.collector.remote.service.RemoteDeserializeService
,远程通信序反列化服务接口,定义了 #deserialize(RemoteData, Data)
接口方法,反序列化传输数据。
3. collector-remote-grpc-provider
collector-remote-grpc-provider
,基于 Google gRPC 的远程通信实现。
项目结构如下 :
默认配置,在 application-default.yml
已经配置如下:
remote: gRPC: host: localhost port: 11800
host: localhost
port: 11800
3.1 RemoteModuleGRPCProvider
org.skywalking.apm.collector.remote.grpc.RemoteModuleGRPCProvider
,实现 ModuleProvider 抽象类,基于 gRPC 的组件服务提供者实现类。
#name()
实现方法,返回组件服务提供者名为 "gRPC"
。
module()
实现方法,返回组件类为 RemoteModule 。
#requiredModules()
实现方法,返回依赖组件为 cluster
、gRPC_manager
。
#prepare(Properties)
实现方法,执行准备阶段逻辑。
#start()
实现方法,执行启动阶段逻辑。
#notifyAfterCompleted()
实现方法,方法为空。
3.2 GRPCRemoteSenderService
org.skywalking.apm.collector.remote.grpc.service.GRPCRemoteSenderService
,继承 ClusterModuleListener 抽象类,实现 RemoteSenderService 接口,基于 gPRC 的远程发送服务实现类。
3.2.1 注册发现
通过继承 ClusterModuleListener 抽象类,实现了监听 Collector 集群节点的加入或离开。
3.2.2 负载均衡
RemoteModuleGRPCProvider 基于不同的选择器 ( Selector ) ,提供不同的客户端选择( org.skywalking.apm.collector.remote.grpc.service.selector.RemoteClientSelector
)实现 :
3.3 GRPCRemoteClientService
org.skywalking.apm.collector.remote.grpc.service.GRPCRemoteClientService
,实现 RemoteClientService 接口,基于 gRPC 的远程客户端服务实现类。
#create(host, port, channelSize, bufferSize)
实现方法,创建 GRPCRemoteClient 对象。
3.4 GRPCRemoteClient
友情提示:本小节会涉及较多 gRPC 相关的知识,建议不熟悉的胖友自己 Google ,补充下姿势。
org.skywalking.apm.collector.remote.grpc.service.GRPCRemoteClient
,实现 RemoteClient 接口,基于 gRPC 的远程客户端实现类。
#push(graphId, nodeId, data)
实现方法,异步发送消息到远程 Collector 。
RemoteMessageConsumer ,批量消费本地队列的数据,逐条发送数据到远程 Collector 节点。
3.5 RemoteCommonServiceHandler
org.skywalking.apm.collector.remote.grpc.handler.RemoteCommonServiceHandler
,实现 org.skywalking.apm.collector.server.grpc.GRPCHandler
接口,继承 RemoteCommonServiceGrpc.RemoteCommonServiceImplBase 抽象类,远程通信通用逻辑处理器。
其中,RemoteCommonServiceGrpc.RemoteCommonServiceImplBase 在 RemoteCommonService.proto
文件的定义如下图:
#call(StreamObserver<Empty>)
实现方法,代码如下:
3.6 GRPCRemoteSerializeService
org.skywalking.apm.collector.remote.grpc.service.GRPCRemoteSerializeService
,实现 RemoteSerializeService 接口,基于 gRPC 的远程通信序列化服务实现类。
3.7 GRPCRemoteDeserializeService
org.skywalking.apm.collector.remote.grpc.service.GRPCRemoteDeserializeService
,实现 GRPCRemoteDeserializeService 接口,基于 gRPC 的远程通信反序列化服务实现类。
4. collector-remote-grpc-provider
collector-remote-kafka-provider
:基于 Kafka 的远程通信实现。
目前暂未完成。
TODO 【4005】collector-remote-grpc-provider
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
如果你喜欢这篇文章,喜欢,转发。
生活很美好,明天见(。・ω・。)ノ♡