文章目录
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200607164845994.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pIT1VKSUFOX1RBTks=,size_16,color_FFFFFF,t_70)
-
Netty抽象出两组线程池
BossGoup
专门负责接收客户端的连接,Worker
专门负责网络的读写 -
BossGroup
和WorkerGroup
类型都是NioEnventLoopGroup
-
NioEnventLoopGroup
相当于一个事件循环组,这个组含有多个事件循环,每一个事件循环是NioEventLoopp
-
NioEnventLoop表示一个不断循环的执行处理任务的线程,每个NioEnventLoop
都有一个Selector
,用于监听绑定在其上的sockety
的网络通讯 -
NioEnventLoopGroup
可以有多个线程,既可以含有多个NioEventLoop
-
每个Boss NioEnvenetLoop循环执行的步骤有3步:
- 轮询accept事件
- 处理accept事件,与client监理连接,生成NioSocketChannel
,并将其注册到某个Worker NIOEventLoop
上的Selector
- 出路任务队列的任务,即runAllTasks -
每个Workert NioEventLoop循环执行的步骤
- 轮询read
、write
事件
- 处理I/O
事件,即read、write
事件,在对应NioSocjetChannel
处理
- 处理任务队列的任务,即runAllTasks
-
每个WorkerNIOEventLoop处理业务时,会使用
PipeLine(管道)
、PipeLine
中包含了Channel
,即通过pipeLine
可以获取对应通道,管道中维护了很多处理器
BootStrap、ServerBootStrap(配置引导类)
-
BootStrap意思是引导,一个Netty应用通常由一个BootStrap开始,主要作用是配置整个
Netty
程序,串联各个组件,Netty中BootStrap类是客户端程序的启动引导类,ServerBootStrap是服务端启动引导类 -
常见的方法有
//使用链式编程来进行设置、
bootstrap.group(bossGroup,workerGroup)//设置两个线程组
.channel(NioServerSocketChannel.class)//使用NioSocektyChannel作为服务器的通道实现
.option(ChannelOption.SO_BACKLOG,128)//设置线程队列的连接个数
.childOption(ChannelOption.SO_KEEPALIVE,true)//设置保持活动联结状态
.childHandler(new ChannelInitializer<SocketChannel>() {
//ChannelPipeLine是一个Handler集合,它负责处理和拦截
//inbound或者outbound的事件和操作,相当于贯穿Netty的链
//也已
//给pipeline设置处理器
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new NettyServerHandler());
}//创建一个通道测试对象
});//给workergroup的EnventLoop对应的管道设置处理器
Future、ChannelFuture
Netty中所有的IO操作都是异步的,不能立刻得到消息是否被正确处理,单丝可以过一会等他执行完成或者直接注册一个监听,具体的实现就是通过Future和ChannelFutures,他们可以注册一个监听,当操作执行成功或失败监听会子动触发注册监听的事件。
常见的监听方法有
- Channel channel:返回当前正在进行IO操作的通道
- ChannelFuture sync()等待异步操作执行完毕
Channel
** 不同协议,不同阻塞类型的连接都有不同的Channel类型与之对应,常用的Channel类型有**
EnventLoopGroup和其实现类NioEventLoopGroup
Selector(聚合在NioEventGroup)
- Netty基于Selector对象实现I/O多路复用,通过selector一个线程可以监听多个Channel事件
- 当向一个Selector中注册Channel后,Selector内部的机制就可以自动不断的查询select这些注册的Channel是否有就绪的I/O事件(例如可读,可写,网络连接完成等),这样程序就可以很简单的使用一个线程高效的管理多个Channel
ChannelHandler及其实现类
- ChannelHandler是一个接口,处理I/O事件或拦截I/O操作,并将其转发到其
ChannelPipeLine(业务处理链)中的下一个处理程序
- ChannelHandler本身没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以继承它的子类
- ChaneelHandler及其
- ChannelInboundHandler用于处理入站I/O事件
- ChannelOutboundHandler用于处理出栈I/O操作
- 我们经常需要自定义一个Handler类取继承ChannelInboundHandlerAdapter,然后通过重写相应方法实现业务逻辑,我们接下来看看一般都需要重写哪些方法:
PipeLine和ChannelPipeLine
- ChannelPipeLine是一个Handler的集合,它负责处理和拦截inbound或者outbound的事件和操作,相当于一个贯穿
Netty
的链(也可以这样理解:ChannelPipeLine是保存C hannelHnadler
的List,用于处理或拦截Channel的入站事件和出站事件) - ChannelPipeLine实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及Channel中各个的
ChannelHandleer
如何相互交互 - 在Netty中每个Channel都有且仅有一个ChannelPipeLine与之对应,它们的组成关系如下:
//使用链式编程来进行设置、
bootstrap.group(bossGroup,workerGroup)//设置两个线程组
.channel(NioServerSocketChannel.class)//使用NioSocektyChannel作为服务器的通道实现
.option(ChannelOption.SO_BACKLOG,128)//设置线程队列的连接个数
.childOption(ChannelOption.SO_KEEPALIVE,true)//设置保持活动联结状态
.childHandler(new ChannelInitializer<SocketChannel>() {
//ChannelPipeLine是一个Handler集合,它负责处理和拦截
//inbound或者outbound的事件和操作,相当于贯穿Netty的链
//也已
//给pipeline设置处理器
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new NettyServerHandler());
}//创建一个通道测试对象
});//给workergroup的EnventLoop对应的管道设置处理器