Netty介绍(二)
netty-all是集合了Netty所有模块的全集。
也可以按需引入,比如只想使用netty-codec-redis
比如一个Handler
,EchoServerHandler
继承自ChannelInboundHandlerAdapter,它又实现了ChannelInboundHandler接口。
Inbound或Outbound表示方向,所以实质处理是ChannelHandler
只覆盖channelRead()方法,它在收到消息时被调用。
public class EchoServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
System.out.println(ctx.channel().remoteAddress() + " -> Server :" + msg);
// 写消息到管道
ctx.write(msg);// 写消息
ctx.flush(); // 冲刷消息
// 上面两个方法等同于 ctx.writeAndFlush(msg);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// 当出现异常就关闭连接
cause.printStackTrace();
ctx.close();
}
}
NioEventLoopGroup用来处理IO操作的多线程事件循环器。
多少个线程,在哪里看呢?
Netty底层是基于Java NIO实现,因此也使用了Selector模型
Selector模型解决了阻塞IO中,一个客户端一个线程
的问题。
可以监视一个或多个NIO通道,识别何时可以使用一个或多个NIO通道进行数据传输,
这样,一个线程可以管理多个通道,从而管理多个网络连接。
Node.js也用到了类似的机制。
Channel和Selector的关系确定后,一旦Channel处于某种就绪的状态,就可以被Selector查询到。
通过调用Selector的select方法完成。
Channel是java NIO的一个抽象,代表一个连接到如设备、文件、网络socket等的连接;或是一个可以完成IO操作的程序。
回调Callback是通知相关方某个操作已经完成最常用的方法之一
Netty的使用,当一个回调发生,事件可以被ChannelHandler的接口处理,
如Channel有可读消息时,EchoServerHandler的回调方法channelRead()
会被调用
Future提供了另一个当操作完成时如何通知应用的方法。
责任链模式的优点:请求和处理分开
请求者不知道谁处理;处理者不知道请求的全貌
有点像流水线的工位
ChannelPipeline接口设计,就采用责任链模式,底层采用双向链表,
将链上的各个处理器串联起来。每个请求到来,ChannelPipeline中所有的处理器都有机会处理它。
- 点赞
- 收藏
- 关注作者
评论(0)