pinpoint的Collector-TCP源码分析

    xiaoxiao2021-03-26  5

    备忘,初步认识。

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

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

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

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

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

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

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

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

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

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

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

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

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

    如果当packetType为application_Send时调用

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

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

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

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

    转载请注明原文地址: https://ju.6miu.com/read-500122.html

    最新回复(0)