Netty解碼器

Netty解碼器也是非常重要的一個模塊, 服務端接收到客戶端發送過來的消息, 準確說是字節數組, Netty底層已經將它們讀取成ByteBuf了, 但是這些ByteBuf是沒有任何含義的, 就像一些’散兵遊勇’, 我們現在要把它們解碼成我們認識的業務類.


下面的代碼是摘取自RocketMQ源碼

<code>this.serverBootstrap.group(this.eventLoopGroupBoss, this.eventLoopGroupSelector)
.channel(useEpoll() ? EpollServerSocketChannel.class : NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024)
.option(ChannelOption.SO_REUSEADDR, true)
.option(ChannelOption.SO_KEEPALIVE, false)
.childOption(ChannelOption.TCP_NODELAY, true)
.childOption(ChannelOption.SO_SNDBUF, nettyServerConfig.getServerSocketSndBufSize())
.childOption(ChannelOption.SO_RCVBUF, nettyServerConfig.getServerSocketRcvBufSize())
.localAddress(new InetSocketAddress(this.nettyServerConfig.getListenPort()))
.childHandler(new ChannelInitializer<socketchannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(defaultEventExecutorGroup, HANDSHAKE_HANDLER_NAME, handshakeHandler).addLast(defaultEventExecutorGroup, encoder, new NettyDecoder(),
new IdleStateHandler(0, 0, nettyServerConfig.getServerChannelMaxIdleTimeSeconds()),
connectionManageHandler,
serverHandler
);
}
});/<socketchannel>/<code>

大家可以看到一個NettyDecoder類, 它就是一個解碼器.

解碼器一般分為兩類, 一類是消息幀解碼器, 一類是業務解碼器. 消息幀解碼器就是將那些’散兵遊勇’解碼成符合事先約定好的消息格式, 也就是解決消息粘包的問題; 經過消息幀解碼器, 解碼成具有含義的消息幀, 再通過業務解碼器將消息幀解碼成我們認識的業務類.


Netty解碼器

Netty提供了4個主要的消息幀解碼器 :

FixedLengthFrameDecoder 基於固定長度解碼器

LineBasedFrameDecoder 基於換行符解碼器

DelimiterBasedFrameDecoder 基於分隔符解碼器

LengthFieldBasedFrameDecoder 基於長度解碼器

RocketMQ中的解碼器NettyDecoder也是繼承了LengthFieldBasedFrameDecoder解碼器. 在接下來的文章中我們會詳細說明這些解碼器如何實現解碼.


分享到:


相關文章: