Netty小记

Netty是由JBOSS提供的一个java网络框架,是对jdk nio的封装。有时候需要自定义协议,netty就必不可少了,可以用netty对协议进行高度的定制化.

Netty中的概念

EventLoopGroup -> 相当于一个线程池,一般一个服务中有两个EventLoopGroup,一个用于接收请求,另一个用于处理IO操作。一般是这样的:

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

ServerBootstrap sb = new ServerBootstrap();
sb.group(bossGroup, workerGroup);

一个EventLoopGroup有多个EventLoop, 一个EventLoop可以被视为一个线程,每当新的请求到来(新的Channel创建),就会在EventLoopGroup里注册,同时EventLoopGroup会分配一个EventLoop给这个Channel。从开始到这个Channel被销毁前,这个Channel只能被它绑定的EventLoop执行。

Netty采用的是一种叫 data flow 的处理机制,类似于Unix的管道,每一个Channel都有一个自己的ChannelPipeline,每一个pipeline会有多个ChannelHandler,handler链式执行数据。Handler分为Inbound和Outbound两类,request对应Inbound的handler,response对应Outbound的handler。Handler的使用非常简单,只需要集成一个ChannelInboundHnadlerAdapter,重写一些方法,如channelRead,channelReadComplete和exception, 或者更简单地继承SimpleChannelInboundHandler,重写channelRead0()就好。

在解析处理请求的时候需要对数据格式进行转换,相当于序列化/反序列化, Netty提供了编码和解码的接口: MessageToByteEncoder和ByteToMessageEncoder,其实这两个类分别继承了ChannelInboundHandlerAdapter和ChannelOutboundHandlerAdapter,自己写的类只需要重写decode()或者encode()即可。

Boottrap/ServerBootstrap是启动类,分别负责启动客户端和服务器端,装配EventLoopGroup,handler等等。

Written on August 5, 2020