基于Netty高性能RPC框架Nifty协议、传输层、编解码( 二 )
继续往下看: TProtocolReader:
public
是不是很容易理解 , 拿到key和value的编解码器后 , 不停的往下读即可 。
比较疑问的地方就是这里没有涉及到循环遍历i , 实际上这是关于map的协议来决定的 , protocal.readMapBegin在TBinaryProtocal中的实现是 , 依次读取一个字节 , 一个字节 , 4个字节分别表示key的类型 , value的类型和 元素数量 。 得到了map中元素数量tMap.size后 , 由于每次读取key和value的时候buffer中的指针都会移动 , 读完了value后 , 能保证下次读到的就是下一个元素的key 。 最后将结果放到构建的hashMap中即可 。
1.2. 读取结构体方法的形参里面除了基本类型 , 集合类型外 , 经常还能遇到结构体类型 , 对于java来说就是对象 , 这个时候对应的处理如下 。
case STRUCT: {return factory.generateThriftTypeCodec(ThriftCodecManager.this, type.getStructMetadata());}复制代码
做点小改动 , 在这里使用一个新的ThriftCodecManager构造方法 , 传入编解码器工厂类ReflectionThriftCodecFactory
ThriftCodecManager manager = new ThriftCodecManager(new ReflectionThriftCodecFactory());复制代码
其实还有个工厂类CompilerThriftCodecFactory , 看名字是个自建编译器的工厂类 , 看过内部实现代码多而且不大好理解 , 所以这里使用反射方式的编解码器工厂类 。
ReflectionThriftCodecFactory继承自ThriftCodecFactory , 提供了获取编解码器的方法 。
public interface ThriftCodecFactory{ThriftCodec> generateThriftTypeCodec(ThriftCodecManager codecManager, ThriftStructMetadata metadata);}复制代码
ReflectionThriftCodecFactory的实现如下:
public class ReflectionThriftCodecFactory implements ThriftCodecFactory {@Overridepublic ThriftCodec> generateThriftTypeCodec(ThriftCodecManager codecManager, ThriftStructMetadata metadata) {switch (metadata.getMetadataType()) {case STRUCT:return new ReflectionThriftStructCodec<>(codecManager, metadata);case UNION:return new ReflectionThriftUnionCodec<>(codecManager, metadata);default:throw new IllegalStateException(format("encountered type %s", metadata.getMetadataType()));}}}复制代码
那么问题就是, ThriftStructMetadata如何得到以及干嘛用的, 看名字就知道这是保存结构体元数据的. 由type.getStructMetadata()得到, 那么问题就是如何构造的ThriftType . 其实在最开始构造ThriftServiceProcessor的时候就构造好了,
创建过程比较复杂 , 简单来说就是:构建ThriftServiceProcessor的时候 , 会将构建ThriftServiceMetadata;而构建ThriftServiceMetadata的时候会构建ThriftMethodMetadata;构建 的时候会构建List; 每个ThriftFieldMetadata都代表一个方法形参 , 内部持有一个ThriftType, 到这里就知道了ThriftType是属于ThriftFieldMetadata , 在构建ThriftMethodMetadata的时候会得到ThriftType , 如何得到?其实就是根据方法形参得到ThriftType的 , 从目录类ThriftCatalog获取到 , 其内部存有一个Type和ThriftType的映射 , 来简单看下 。
推荐阅读
- 华硕基于WRX80的主板现身 为AMD Ryzen Threadripper Pro打造
- 微软新版电子邮件客户端截图曝光:基于网页端Outlook
- 优刻得边缘计算产品正式更名UEC,打造低延时、高性能、低成本计算平台
- 曝光 | 小鹏或春节前推送NGP更新,基于高精地图可自动变道
- 基于Spring+Angular9+MySQL开发平台
- 玩游戏为什么推荐你买魅族17 不仅仅是高性能
- 14款华为手机/平板公测EMUI 11:全部基于麒麟980
- AI赋能,让消防、用电更“智慧”
- 深入理解Netty编解码、粘包拆包、心跳机制
- 基于安卓11打造!魅族17系列将升级全新Flyme 8