大众点评分布式系统监控开源框架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客户端数据在推送到服务端时,一定是按照该顺序传入的字节流.

未完待续...

猜你喜欢

转载自blog.csdn.net/u013202238/article/details/83277774