1. 程式人生 > >大眾點評分散式系統監控開源框架cat原始碼閱讀(個人筆記)

大眾點評分散式系統監控開源框架cat原始碼閱讀(個人筆記)

cat 資料接收 TcpSocketReceiver
該類中startServer(port)方法用於啟動netty,設定訊息解碼器MessageDecoder和訊息編碼器ClientMessageEncoder
訊息傳輸使用訊息header+訊息body格式,解碼器中訊息前4個位元組即int型別用於儲存訊息body的長度,當訊息可讀長度
大於等於訊息頭所讀長度時,讀取整個訊息,呼叫CodecHandler類中的靜態方法decode進行解析,該方法先讀取訊息body
的前3個位元組並轉成String,如果是"PT1"則呼叫PlainTextMessageCodec類進行解析,如果是"NT1"則呼叫NativeMessageCodec
類進行解析,否則丟擲異常.解析成功之後返回 MessageTree 介面型別的實現類.
預設系統有兩個實現類DefaultMessageTree和NullMessageTree

PlainTextMessageCodec 的解析過程
PlainTextMessageCodec實現MessageCodec介面,public decode方法首選呼叫ByteBuf的readInt()目的向後移動4位元組,
readIndex指向訊息body開頭部分,並建立DefaultMessageTree物件,呼叫private方法decode繼續解析,
該方法通過成員屬性ThreadLocal物件嘗試獲取Context物件,Context類有兩個成員物件一個是ByteBuf,一個是char[],
ByteBuf用於存放訊息body,可以通過動態賦值,並在decode方法退出前被移除,而char[]只能在物件建立時初始化為1MB,充當快取使用,如果未獲取到則建立,保證每個NIOEventLoop執行緒上只有一個Context物件.decode方法中呼叫decodeHeader方法解析一些基本資料例如id,domain,hostname等等,然後判斷訊息體時候後剩餘資料,有則呼叫decodeMessage方法解析

PlainTextMessageCodec類中decodeHeader(ctx, tree)方法解析過程
decodeHander方法通過呼叫成員屬性BufferHelper物件解析,該方法需要傳入Context物件和資料流分隔符,
從原始碼可以看出,cat中將一些換行符使用2位元組得文字替換,因此在未找到分隔符之前
遍歷讀取每個byte,並替換2位元組換行符文字為1位元組換行符,一旦找到則停止讀取,並將讀取得byte轉為字串
資料流得讀取會一定readIndex,但是decodeHeader方法卻多次呼叫該方法解析id,domain,hostname等等,因為
可以推斷cat客戶端資料在推送到服務端時,一定是按照該順序傳入的位元組流.

未完待續...