1. 程式人生 > >pinpoint的Collector-TCP原始碼分析

pinpoint的Collector-TCP原始碼分析

備忘,初步認識。

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方法。然後更加具體的類呼叫相應的方法。實現物件持久化的需求。


相關推薦

pinpoint的Collector-TCP原始碼分析

備忘,初步認識。 TCP原始碼其實就是對netty的封裝,包括編碼解碼和處理。所以前提條件必須熟悉netty的程式設計。 原始碼檢視是首先是applicationContext-collector.xml這個檔案,這個檔案是bean的註冊類,其中有其呼叫的關係,大部分是通

以太坊p2p網路(五):P2P模組TCP連線池網路通訊機制原始碼分析

上節中通過設定靜態節點BootstrapNodes節點來發現更多全網的其他節點,這部分只是發現節點並找出其中可以ping通的節點,但是還沒有進行使用,還沒建立TCP連線進行資料傳輸,協議處理等。 這裡主要分析P2P系統的TCP連線池的建立,以及是怎麼跟其他節點通

java tcp底層原始碼分析

TCP服務端實現      //定義伺服器端socket並指定監聽埠     ServerSocket serverSocket = new ServerSocket(5937);     //呼叫阻塞式方法來獲取客戶端連線的socket     Socket socke

TCP擁塞控制演算法BBR原始碼分析

  BBR是谷歌與2016年提出的TCP擁塞控制演算法,在Linux4.9的patch中正式加入。該演算法一出,瞬間引起了極大的轟動。在CSDN上也有眾多大佬對此進行分析討論,褒貶不一。   本文首先對原始碼進行了分析,並在此基礎上對BBR演算法進行總結。 ##

Linux TCP/IP 協議棧原始碼分析

一.linux核心網路棧程式碼的準備知識 1. linux核心ipv4網路部分分層結構: BSD socket層: 這一部分處理BSD socket相關操作,每個socket在核心中以struct socket結構體現。這一部分的檔案 主要有:/net/so

ZMQ原始碼分析(五) --TCP通訊

zmq支援tcp,inpro,ipc,pgm,epgm,tipc等通訊方式。只要在address中指定地址格式即可透明支援對應的通訊方式。這裡我們以最常用的tcp為例分析zmq資料在網路間傳輸的流程,這部分是zmq中最複雜也是最重的部分,在分析流程之前,先看一下

Linux TCP/IP 協議棧原始碼分析(一)

---------------------------------------------------------------------------------------------------------------------         這篇文章寫於三年前,當時

muduo原始碼分析之實現TCP網路庫(連線的接收和關閉)

在EventLoop、Channel、Poller三個類中完成對一般描述符、事件迴圈(poll)的封裝。實現了Reactor的基本功能,接下來則需要將網路套接字描述符、I/O函式、等進行封裝。 1.傳統的TcpServer 在進行封裝之前需要明確我們需要

mybatis原理,配置介紹及原始碼分析

前言 mybatis核心元件有哪些?它是工作原理是什麼? mybatis配置檔案各個引數是什麼含義? mybatis只添加了介面類,沒有實現類,為什麼可以直接查詢呢? mybatis的mapper對映檔案各個引數又是什麼含義? mybatis-spring提供哪些機制簡化了原生mybatis? m

Spark原始碼分析之Spark Shell(上)

https://www.cnblogs.com/xing901022/p/6412619.html 文中分析的spark版本為apache的spark-2.1.0-bin-hadoop2.7。 bin目錄結構: -rwxr-xr-x. 1 bigdata bigdata 1089 Dec

Android與JS之JsBridge使用與原始碼分析

在Android開發中,由於Native開發的成本較高,H5頁面的開發更靈活,修改成本更低,因此前端網頁JavaScript(下面簡稱JS)與Java之間的互相呼叫越來越常見。 JsBridge就是一個簡化Android與JS通訊的框架,原始碼:https://github.com/lzyzsd

Flink on Yarn模式啟動流程原始碼分析

此文已由作者嶽猛授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 Flink on yarn的啟動流程可以參見前面的文章 Flink on Yarn啟動流程,下面主要是從原始碼角度看下這個實現,可能有的地方理解有誤,請給予指正,多謝。 --> 1.命令列啟動yarn sessi

菜鳥帶你看原始碼——看不懂你打我ArrayList原始碼分析(基於java 8)

文章目錄 看原始碼並不難 軟體環境 成員變數: 構造方法 核心方法 get方法 remove方法 add方法 結束 看原始碼並不難 如何學好程式設計?如何寫出優質的程式碼?如

區塊鏈教程Fabric1.0原始碼分析flogging(Fabric日誌系統)

  區塊鏈教程Fabric1.0原始碼分析flogging(Fabric日誌系統),2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆記 之 flo

區塊鏈教程Fabric1.0原始碼分析流言演算法Gossip服務端二

  區塊鏈教程Fabric1.0原始碼分析流言演算法Gossip服務端二 Fabric 1.0原始碼筆記 之 gossip(流言演算法) #GossipServer(Gossip服務端) 5.2、commImpl結構體方法 //conn.serviceConnection(),啟動連線服務 func (

區塊鏈教程Fabric1.0原始碼分析流言演算法Gossip服務端一

  區塊鏈教程Fabric1.0原始碼分析流言演算法Gossip服務端一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆記 之 gossip(流

PyTorch--雙向遞迴神經網路(B-RNN)概念,原始碼分析

  關於概念:   BRNN連線兩個相反的隱藏層到同一個輸出.基於生成性深度學習,輸出層能夠同時的從前向和後向接收資訊.該架構是1997年被Schuster和Paliwal提出的.引入BRNNS是為了增加網路所用的輸入資訊量.例如,多層感知機(MLPS)和延時神經網路(TDNNS)在輸入資料的靈活性方面是非

Android ADB 原始碼分析(三)

前言 之前分析的兩篇文章 Android Adb 原始碼分析(一) 嵌入式Linux:Android root破解原理(二)   寫完之後,都沒有寫到相關的實現程式碼,這篇文章寫下ADB的通訊流程的一些細節 看這篇文章之前,請先閱讀 Linux的SOCKET

Android Adb 原始碼分析

扭起屁股得意洋洋 最近,我負責的專案因為臨近量產,把之前的userdebug版本關閉,轉成了user版本,增加selinux的許可權,大家都洋溢在專案準備量產的興奮和喜悅之中不能自拔 誰知,好景不長,user版本釋出之後,各種bug接踵而來,但是因為user版本許可權的原因,我們之前保留

【Spring Boot】(29)、SpringBoot整合Mybatis原始碼分析

在【Spring Boot】(23)、Spring Boot整合Mybatis的章節中講述了SpringBoot整合Mybatis的過程,以及一些配置說明,這節主要講解一下整合的原始碼。 廢話不多說,直接進入今天的主題。 閱讀過我之前寫的文章的童靴,肯定知道SpringBoot整合第三方