蚂蚁课堂每特学院-2期netty高级.pdf
Netty高级
Netty快速
什么是Netty
Netty是一个基于JAVANIO类库的异步通信框架,它的架构特点是:异步非阻塞、基于驱动、高
性能、高可靠性和高可定制性。
Netty应用场景
1.分布式开源框架中dubbo、Zookeeper,MQ底层rpc通讯使用就是netty。
2.游戏开发中,底层使用netty通讯。
为什么选择netty
在本小节,我们总结下为什么不建议开发者直接使用JDK的NIO类库进行开发的:
1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、
SocketChannel、ByteBuffer等;
2)需要具备其它的额外技能做铺垫,例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,
你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序;
3)可靠性能力补齐,工作量和难度都非常大。例如客户端断连重连、网络闪断、半包读写、失败
缓存、网络拥塞和异常码流的处n理等等,NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工
作量和难度都非常大;
4)JDKNIO的BUG,例如臭名昭著的epollbug,它会导致Selector空轮询,最终导致CPU100%。
声称在JDK1.6版本的update18修复了该问题,但是直到JDK1.7版本该问题仍旧存在,只不过该bug发生
概率降低了一些而已,它并没有被根本解决。该BUG以及与该BUG相关的问题单如下:
Netty服务器端
classServerHandlerextendsSimpleChannelHandler{
/**
*通道关闭的时候触发
*/
@Override
publicvoidchannelClosed(ChannelHandlerContextctx,ChannelStateEvente)throwception{
System.out.println(channelClosed);
}
/**
*必须是连接已经建立,关闭通道的时候才会触发.
*/
@Override
publicvoidchannelDisconnected(ChannelHandlerContextctx,ChannelStateEvente)throwception{
super.channelDisconnected(ctx,e);
System.out.println(channelDisconnected);
}
/**
*捕获异常
*/
@Override
publicvoidexceptionCaught(ChannelHandlerContextctx,ExceptionEvente)throwception{
super.exceptionCaught(ctx,e);
System.out.println(exceptionCaught);
}
/**
*接受消息
*/
publicvoidmessageReceived(ChannelHandlerContextctx,MessageEvente)throwception{
super.messageReceived(ctx,e);
//