架构设计
文章目录
1.核心组件
1.1 Channel
netty 通道顶层接口
- AbstractChannel
顶层抽象类,内部主要维护面信息
private final Channel parent;
private final ChannelId id;
private final Unsafe unsafe;
private final DefaultChannelPipeline pipeline;
private final VoidChannelPromise unsafeVoidPromise = new VoidChannelPromise(this, false);
private final CloseFuture closeFuture = new CloseFuture(this);
private volatile SocketAddress localAddress;
private volatile SocketAddress remoteAddress;
//该channel所绑定的事件循环器
private volatile EventLoop eventLoop;
//是否已注册到eventloop
private volatile boolean registered;
private boolean closeInitiated;
虽然有众多实现,但下面两为较为核心实现,后面重点分析该两实现
3. NioSocketChannel 表示Nio客户端 Socket连接,内部封装了底层的nio socket
3. NioServerSocketChannel 表示Nio服务端 Socket ,主要用于接收客户端入处理,内部封装底层的nio ServerSocket
4. ReflectiveChannelFactory channel创建工厂,客户端或服务端channel都由该工厂通过反射来创建,通道在创建的过程中,就为其创建一个ChannelPipeLine,用于后继管理ChannelHandler
1.2 EventLoopGroup
事件循环组接口
上面标记了常用的核心实现
- NioEventLoop 从上面继承关系可知该类绑定单个线程
- NioEventLoopGroup 从源码可得知一组NioEnventLoop,是一对多的关系
1.3 ChannelHandler
通道处理器,设计用于出入站事件流处理,例如,接入事件,读事件,写事件,编解码等
- ChannelInboundHandler 继承于ChannelHandler,入站事件处理顶层接口,客户端channle的注册(eventloop),读取channel消息
- ChannelOutboundHandler 继承于ChannelHandler,出 站事件处理顶层接口,服务端绑地址端口,客户端连接服务端等操作
- ChannelDuplexHandler 集成了出入事件的处理,用于简化应用程序,应用业务处更通常继续这个类去实现
1.4 ChannelHandlerContext
- AbstractChannelHandlerContext 从该抽象中,可知channelHandlerContext 实质是一个双向链表结构,有两个继承者分别为
- DefaultChannelHandlerContext 内部维护了一个ChannelHandler
- HeadContext 并没有维护一个ChannelHandler,而是实现了ChannelOutboundHandler,ChannelInboundHandler 接口,其自身就是一个handler,可见其会处理一部分出入站事
- TailContext 也没有维护一个ChannelHandler,而是实现了ChannelInboundHandler接口,其自身就是一个handler,可见其专业处理部分入站事件
1.5 ChannelPipeLine
专用于出入事件handler链管理,事件处理链路流向管理,每新建一个channel将为其他创建一个新PipeLine,并将相应的handler
- DefaultChannelPipeline ChannelPipeLine 接口默认实现,创建实例时,默认创建HeadContext,TailContext实例
1.6 AbstractBootstrap
抽象启动引导类,具有实现有客户端和服务端
-
Bootstrap 客户端启动类
作用主要服务启动客端socket连接服务端,通常绑定一个EventLoopGroup处理各种出入端事件 -
ServerBootstrap 服务端启动类
作用主要服务启动服务端Socket,并开启接受客户端接入,通常绑定两个EventLoopGroup,一个作用于客户端socket接入事件,一个用于处理客户端其它事件,如read或write等事 -
ServerBootstrapAcceptor 客户端接入处理器
服务端(ServerBootstrap)初始化是被添加到SeverSocketChannel所在的PipeLine后面
public void channelRead(ChannelHandlerContext ctx, Object msg) {
//收到NioSocketChannel接入
final Channel child = (Channel) msg;
child.pipeline().addLast(childHandler);
setChannelOptions(child, childOptions, logger);
for (Entry<AttributeKey<?>, Object> e: childAttrs) {
child.attr((AttributeKey<Object>) e.getKey()).set(e.getValue());
}
try {
//给刚接入的channel绑定一个eventloop
childGroup.register(child).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (!future.isSuccess()) {
forceClose(child, future.cause());
}
}
});
} catch (Throwable t) {
forceClose(child, t);
}
}