大众点评分布式系统监控开源框架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客戶端數據在推送到服務端時,一定是按照該順序傳入的字節流.
未完待續...
?
?
?
總結
以上是生活随笔為你收集整理的大众点评分布式系统监控开源框架cat源码阅读(个人笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 圣诞树代码,c语言编程,基于graphi
- 下一篇: 服务器2012还原系统,Windows