天天看点

pinpoint的Collector-TCP源码分析

备忘,初步认识。

TCP源码其实就是对netty的封装,包括编码解码和处理。所以前提条件必须熟悉netty的编程。

源码查看是首先是applicationContext-collector.xml这个文件,这个文件是bean的注册类,其中有其调用的关系,大部分是通过构造方法注入对象的,然后在对象中有@PostConstruct注解标注方法的运行(该注解在构造方法调用完成之后执行),也有通过InitializingBean 对象加载的。

TCPReceiver类在在Spring容器加载时通过构造方法注入对象。具体实现在applicationContext-collector.xml文件中。

pinpoint的Collector-TCP源码分析

其中包括collectorConfiguration(配置文件读取)、tcpDispatchHandlerWrapper(tcp分发封装类)serverAcceptor(pinpoint的tcp处理类,请求处理的核心)、clusterService。

其中serverAcceptor是核心的一个类(com.navercorp.pinpoint.rpc.server.PinpointServerAcceptor)。该类的构造方法就是一个Netty服务的创建过程。

pinpoint的Collector-TCP源码分析
pinpoint的Collector-TCP源码分析
pinpoint的Collector-TCP源码分析

其中第98行调用createBootStrap方法是一个标准的netty创建过程。

第99行就是针对netty配置参数

第100行调用addPipeline方法创建ServerPipelineFactory工厂对象,其中构造方法参数nettyChannelHandler对象是SimpleChannelHandler的实现类。而工厂对象是ChannelPipelineFactory的实现类,重写getPipeline方法,增加编码、解码、和处理的类(也就是构造方法传递的参数,即实现了SimpleChannelHandler的nettyChannelHandler对象),

pinpoint的Collector-TCP源码分析

nettyChannelHandler对象即PinpointServerChannelHandler类,该类覆盖了channelConnected、channelDisconnected、channelClosed、messageReceived方法,比较重要的方法为channelConnected(客户端连接),messageReceived(消息接收)

channelConnected方法中创建了DefaultPinpointServer对象。在该对象中增加监听,其中第85行着重注意一下,this.messageListener对象就是TCPReceiver对象在start中this.serverAcceptor.setMessageListener中的匿名ServerMessageListener对象(如下图)。

pinpoint的Collector-TCP源码分析

这里主要是自定义状态,通过事件监听状态的流转。

messageReceived方法获取连接时创建的对象DefaultPinpointServer对象(channelConnected方法创建)调用对象的messageReceived方法,此处的message是经过解码之后的的Packet对象(前面说过的解码),然后根据packetType做相应的分发处理。

针对某一个分发做一个分析

pinpoint的Collector-TCP源码分析

如果当packetType为application_Send时调用

pinpoint的Collector-TCP源码分析

即调用TCPReceiver类start方法this.serverAcceptor.setMessageListener中的匿名ServerMessageListener对象进行处理,该方法继续调用本类的私有方法处理,如下

pinpoint的Collector-TCP源码分析

此方法中,worker为一个线程池对象。Dispath实现了Runnable接口,以此会调用run方法

pinpoint的Collector-TCP源码分析

run方法首先反序列化数据(Thrift),然后调用TCPReceiver构造方法提供的的dispatchHandler,

然后调用具体实现类TcpDispatchHandler的dispatchSendMessage方法。然后更加具体的类调用相应的方法。实现对象持久化的需求。

pinpoint的Collector-TCP源码分析
pinpoint的Collector-TCP源码分析