Netty结构
引导器Bootstrap
作为整个Netty客户端和服务端的程序入口
可以把netty的核心组件组装在一起
EventLoop是Netty Reactor线程模型的核心处理引擎
举例:一个简单的HTTP服务器
Netty也可以方便地开发一个HTTP服务器,Netty程序如何配置启动,以及引导器如何与核心组件产生联系
只需要两个类就可以完成一个最简单的HTTP服务器:服务器启动类和业务逻辑处理类
服务端启动类
所有服务端启动类都可以通过如下结构进行开发
java
public class HttpServer {
public void start(int port) throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.localAddress(new InetSocketAddress(port))
.childHandler(new
ChannelInitializer<SocketChannel>(){
public void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast("codec", new HttpServerCodec())
.addLast("compressor", new HttpContentCompressor())
.addLast("aggregator", new HttpObjectAggregator(65536))
.addLast("handler", new HttpServerHandler());
}
})
.childOption(ChannelOption.SO_KEEPALIVE, true);
ChannelFuture f = b.bind().sync();
System.out.println("Http Server started? Listening on" + port);
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
new HttpServer().start(8088);
}
}
服务端业务逻辑处理类
HttpServerHandler是业务自定义的逻辑处理类,它是入站ChannelInboundHandler类型的处理器,负责接收解码后的http请求数据,并将请求处理结果写回客户端
二级目录
通过上面两个类,可以完成Http服务最基本的请求响应流程
启动
通过请求
获取结果
采用主从多线程Reactor模型:
boss是主reactor,worker是从reactor,他们分别使用不同的NioEventLoopGroup,主reactor负责处理把channel注册到从reactor上,从reactor负责channel生命周期上的所有I/O事件
Channel初始化(设置Channel类型)
注册ChannelHandler
在Netty中可以通过ChannelPipeline去注册多个Channel Handler。
每个ChannelHandler各司其职,这样可以实现最大化的代码复用,充分体现了Netty设计的优雅之处
pipeline管理的多个channelHandler, I/O事件依次在多个channelHandler中传播,handler负责应用逻辑处理上述HTTP服务器示例当中使用链式的方式,加载了多个channelHandler,包含http编解码器,http content压缩处理器,http消息聚合处理器,自定义业务逻辑处理器
结合HTTP请求-响应,分析数据在ChannelPipeline中的流向
设置Channel参数
端口绑定
引导器实践流程
事件调度层
EventLoop的实现原理
Reactor线程模型
线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。
Reactor模式负责将读写事件分发给对应的读写事件处理者
单线程模型
所有I/O操作(连接建立、数据读写、事件分发)都是由一个线程完成的。
一个线程支持处理的连接数有限,CPU很容易打满,性能方面有明显瓶颈
当多个事件被同时触发,只要有一个事件没有处理完,其他后面的事件就无法执行
线程在处理I/O事件时,Select无法同时处理连接建立、事件分发等操作
如果I/O线程一直处于满负荷状态,可能造成服务端节点不可用
多线程模型
Reactor多线程模型将业务逻辑交给多个线程进行处理,除此之外多线程模型在其他方面与单线程模型保持一致
主从多线程模型
EventLoop是什么
是一种事件等待和处理的程序模型
可以解决多线程资源消耗高的问题
Netty如何实现EventLoop
Reactor线程模型的事件处理引擎
每个EventLoop线程都维护一个Selector选择器和任务队列taskQueue
主要负责处理I/O事件、普通任务和定时任务
事件处理机制
Channel生命周期的所有事件处理都是线程独立的,不同的NioEventLoop线程之间不会发生任何交集
EventLoop最佳实践
1.网络连接建立过程中三次握手、安全认证的过程,建议采用Boss和Worker两个EventLoopGroup
2.对于耗时较长的ChannelHandler可以考虑维护一个业务线程池
将编解码后的数据封装成Task进行异步处理
3.如果业务逻辑执行时间较短,建议直接在ChannelHandler中执行
4.不宜设计过多的ChannelHandler
服务编排层
eventLoop时Netty的调度中心,监听I/O事件、信号事件、定时事件是由ChannelPipeline中所定义的ChannelHandler完成
内部结构
双向链表构造
接口设计