基于Netty高性能RPC框架Nifty协议、传输层、编解码( 四 )

IntegerThriftCodec:
public class IntegerThriftCodec implements ThriftCodec {@Overridepublic ThriftType getType() {return ThriftType.I32;}@Overridepublic Integer read(TProtocol protocol) throws Exception {return protocol.readI32();}@Overridepublic void write(Integer value, TProtocol protocol) throws Exception {Preconditions.checkNotNull(protocol, "protocol is null");protocol.writeI32(value);}}复制代码关于结构体编解码器ReflectionThriftStructCodec前面一大篇幅都是介绍这个 。
不管是哪种编解码器都是非常依赖协议的 , 只是编解码器做了一层抽象屏蔽了细节 , 方便我们使用 。
协议与传输协议TProtocal和传输组件TTransport是紧密相连的 , 协议内部是持有TTransport的 , 而TTransport可以理解为传输层 , 是直接与输出数据容器buffer打交道的;比如使用最多的就是TNiftyTransport , 内部会持有ChannelBuffer , 包含了从netty数据流中获取的ChannelBuffer和之后写到客户端的空的ChannelBuffer 。
我们先简单介绍协议定义了哪些接口 , 然后找个接口来看如何进行数据传输的 。
/** * Protocol interface definition. * */public abstract class TProtocol {protected TTransport trans_;protected TProtocol(TTransport trans) {trans_ = trans;}private boolean serverSide;private String serviceName;// getter, setter/*** Reading methods.*/public abstract TMessage readMessageBegin() throws TException;public abstract void readMessageEnd() throws TException;public abstract TStruct readStructBegin() throws TException;public abstract void readStructEnd() throws TException;public abstract TField readFieldBegin() throws TException;public abstract void readFieldEnd() throws TException;public abstract TMap readMapBegin() throws TException;public abstract void readMapEnd() throws TException;public abstract TList readListBegin() throws TException;public abstract void readListEnd() throws TException;public abstract TSet readSetBegin() throws TException;public abstract void readSetEnd() throws TException;public abstract boolean readBool() throws TException;public abstract byte readByte() throws TException;public abstract short readI16() throws TException;public abstract int readI32() throws TException;public abstract long readI64() throws TException;public abstract double readDouble() throws TException;public abstract String readString() throws TException;public abstract ByteBuffer readBinary() throws TException;/*** Writing methods.*/// ...复制代码里面主要是数据的读和写方法 , 写和读方法是对应的就不同了 。 读的方法基本都会配合TProtocolReader来使用 , 写的方法基本都会配合TProtocolWriter来使用 。

  • 开始和结束消息的读取 , 开始读取方法参数的时候会在初始和结尾进行调用, 可以获得方法的名字和请求的序号 。
  • 开始和结束结构体的读取 , 在正式读取方法参数值的时候和读取完毕后进行调用 , 在TBinaryProtocal中可以认为是空实现 , readStructEnd通常在readMessageEnd之前 。
  • 开始和结束参数的读取 , 每次读取一个参数都会调用 , readFieldBegin返回TField表示参数名称 , 类型和序号,基于此获取编解码器来读取参数值 , 最后再调用readFieldEnd 。
  • 开始和结束集合的读取;
挑个readI32,readString来看在TBinaryProtocal中的使用 。


推荐阅读