6

作者: 01010100 | 来源:发表于2018-03-16 17:59 被阅读26次

Netty:

1、总体描述,

应用场景Netty是一个高性能、异步事件驱动的NIO框架。封装了Java NIO那些复杂的底层细节,给你提供简单好用的抽象概念来编程。应用场景:首先它是个框架,是个“半成品”,不能开箱即用,你必须得拿过来做点定制,利用它开发出自己的应用程序,然后才能运行(就像使用Spring那样)。 高性能基础通信组件。

2、Netty VS NIO

1)跨平台与兼容性:NIO算是底层的APIs需依赖系统的IO APIs。但Java NIO发现在不同系统平台会出现问题。 NIO2只支持JDK1.7+,而且没提供DatagramSocket,故NIO2不支持UDP协议。 而Netty提供统一接口,同一语句无论在JDK6.X 还是JDK7.X 都可运行,无需关心底层架构功能!2)JAVA NIO的ByteBuffer构造函数私有,无法扩展。Netty提供了自己的ByteBuffer实现,通过简单APIs对其进行构造、使用和操作,一此解决NIO的一些限制。

3)NIO对缓冲区的聚合与分散操作可能会导致内存泄漏。直到JDK1.7才解决此问题。

4)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。

5)使用JAVA NIO需要具备其他的额外技能做铺垫,例如熟悉Java多线程编程。这是因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。

6)可靠性能力补齐,工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等问题。7)JDK NIO的BUG,例如臭名昭著的epoll bug,它会导致Selector空轮询,最终导致CPU 100%。3、epoll bugJDK的NIO类库有一个epoll死循环bug,它会导致Selector空轮询,IO线程CPU达到100%,严重影响系统运行。

netty从api使用层面对该bug进行了规避解决:1)对Selector的select操作周期进行统计。每完成一次空的select操作进行一次计数。2)在某个周期内如果连续N次空轮询,则说明触发了JDK NIO的epoll死循环bug。3)创建新的Selector,将出现bug的Selector上的channel重新注册到新的Selector上。4)关闭bug的Selector,使用新的Selector进行替换。

5、启动Demo与线程池模型

EchoServer:

public void run() { 

 // 创建一个ServerBootstrap启动工具类 // 构造方法里传入NioServerSocketChannelFactory 

 ExecutorService boss = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerBoss", true));

 ExecutorService worker = Executors.newCachedThreadPool(new NamedThreadFactory("NettyServerWorker", true)); 

 ServerBootstrap bootstrap = new ServerBootstrap( 

 //构建一个创建NioServerSocketChannel的工厂类NioServerSocketChannelFactory 

 new NioServerSocketChannelFactory( boss, worker));

 // Set up the ChannelPipelineFactory.pipeline主要负责管理channel和netty之间消息的传递 

 bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

 public ChannelPipeline getPipeline() throws Exception { 

 //传入echoServerHandler 

 return Channels.pipeline(new EchoServerHandler()); 

 } });

 // Bind and start to accept incoming connections. 

 bootstrap.bind(new InetSocketAddress(port));}

boss pool:处理Acceptor事件,负责连接的建立,连接建立后将交由worker pool处理,默认一个线程

worker pool:处理I/O读写事件,线程池默认大小,netty=处理器个数*2,dubbo=处理器个数 + 1

在真正的业务中,还应该添加自己的业务线程池,而不应该把业务处理放在netty的worker pool中。

NioEventLoopGroup:线程池

EventLoopGroup bossGroup = new NioEventLoopGroup(1);

EventLoopGroup workerGroup = new NioEventLoopGroup();

ServerBootstrap b = new ServerBootstrap();

b.group(bossGroup, workerGroup)

 .channel(NioServerSocketChannel.class) 

.option(ChannelOption.SO_BACKLOG, 100)

 .handler(new LoggingHandler(LogLevel.INFO)) 

.childHandler(new ChannelInitializer() { ..

ChannelPipeline:

ChannelPipline:包含一系列handler,如编解码handler处理器,addLast,利用事件传输机制,handler按顺序触发

相关文章

  • #知识体系精深营#六月+12次作业+第20组2小组+ynqj_a

    6-1 6-1 6-2 6-2 6-3 6-3 6-4 6-4 6-5 6-5 6-6 6-6 6-7 6-7 6...

  • 无标题文章

    1 2 2 3 5 6 6 6 6 6 6 8 3 6

  • 6+6=6

    【九洲芳文】 我不再记得安妮,这句话在一段时间内反复出现在我脑子里,侵蚀着我的神经,仿佛在强迫我遗忘记忆里某些很重...

  • 6/6

    今天又被骂了,会议又出错了,心情更糟了,即使有人开始分担工作,但是还是很晚下班。昨晚去运动,后来也没自己的份,这样...

  • 6/6

    口号(如:父母的高度就是孩子的起点)#孩子第二个30天目标:早睡加早起,培养清理整理书包学习桌面的能力 妈妈第二个...

  • 6/6

    通过这些年的实验,都证实了一点,自己所想的所要的都慢慢一点一点的实现了。所以,只要敢想,敢做,我们最终会成为自己想...

  • 6/6

    分解目标:个人月任务除以24。当天目标未完成,累计到第二天。 月度工作安排:第一周资源积累。第二周开单积累。第三周...

  • 6 6

    这是六月三日的的月亮

  • 6/6

    今天很难得的从构思开始写日记,写我自己真的想表达的事情 昨天晚上开小会说到了人际关系,现在公司的核心成员就我,大凯...

  • 【2018.10.16 】今日精进

    6:01-6:04赖床 6:04-6:12洗脚刷牙接水 6:12–6:32瑜伽 6:33-6:40洗脸 6:55–...

网友评论

    本文标题:6

    本文链接:https://www.haomeiwen.com/subject/decqqftx.html