zoukankan      html  css  js  c++  java
  • Netty学习篇一 (对netty的基本了解)

    一、netty概念

      Netty 是由 JBOSS 提供的一个异步非阻塞、基于事件驱动的NIO框架,提供了对UDP、TCP以及文件传输的支持,用以快速开发高性能、高可靠、高可定制性的网络应用程序和工具,可用于开发服务端和客户端。

      作为一个当前最流行的异步NIO框架,Netty的全部IO操作都是异步非阻塞的。通过Future-Listener机制,用户能够方便的通过通知机制获得IO操作结果或者是主动获取。Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo 框架内部都采用了 Netty。

    二、netty应用场景

    1、通信行业

    Netty有着高成熟度、异步高性能、高可靠性的优点,凭借这些,Netty在通信行业也是得到了广泛的应用。

    2、大数据领域

    通常,大数据计算都会采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。

    在这样的基础上,因为Netty是目前各个成熟NIO框架当中,综合性能最高的,所以,Netty经常会被选中,用作大数据各节点间的通信。

    3、互联网行业

    随着网站规模的发展,系统并发访问量也是愈来愈高,传统的垂直架构不能够满足需求,所以,从组网的情况来看,高性能的RPC框架是必不可少的东西,而Netty作为异步高性能的通信框架,就经常被当做基础通信组件被RPC框架使用。

    4、企业软件

    企业以及IT集成需要ESB,Netty对多协议支持、私有协议定制的简洁性和高性能是 ESB RPC框架的首选通信组件。

    5、游戏行业

    不管是什么大型网游,又或者是手游,Java语言都得到了广泛的应用,Netty作为高性能的基础通信组件,本身就提供了TCP/UDP和HTTP协议栈,对于定制和开发私有协议栈非常的方便,一些账号登陆服务器、地图服务器之间能够通过Netty进行高性能的通信。

    三、了解NIO和BIO

    JAVA原先是采用的是传统的BIO,为什么后来又研发出了NIO呢?

    首先看看传统的基于同步阻塞IO(BIO)的线程模型图

    BIO主要存在以下缺点:

    1.从线程模型图中可以看到,一连接一线程,因线程数是有限的,所以这样的模型非常消耗资源,最终也导致它不能承受高并发连接的需求

    2.性能低,因为频繁的进行上下文切换,导致CUP利用率低

    3.可靠性差,由于所有的IO操作都是同步的,即使是业务线程也如此,所以业务线程的IO操作也有可能被阻塞,这将导致系统过分依赖网络的实时情况和外部组件的处理能力,可靠性大大降低

    上面的原因就是导致早期的高性能服务器为什么不选用JAVA开发,而是选用C/C++的重要原因。

    为了解决上面的问题,NIO横空出世,下面是NIO的线程模型图

    1.NIO采用了Reactor线程模型,一个Reactor聚合了一个多路复用器Selector,它可以同时注册、监听和轮询成百上千个Channel,这样一个IO线程可以同时处理很多个客户端连接,线程模型优化为1:N(N<最大句柄、数),或M:N(M通常为CUP核数+1)

    2.避免了IO线程频繁的上下文切换,提升了CUP的效率

    3.所有的IO操作都是异步的,所以业务线程的IO操作就不用担心阻塞,系统降低了对网络的实时情况和外部组件的处理能力的依赖

    四、为什么不用JDK原生的NIO?

    先看看JDK的NIO中服务端和客户端的时序图

    服务端:

     客户端:

    从图中我们可以看到,使用JDK原生NIO的不足之处

    1.NIO的类库和API相当复杂,使用它来开发,需要非常熟练地掌握Selector、ByteBuffer、ServerSocketChannel、SocketChannel等

    2.需要很多额外的编程技能来辅助使用NIO,例如,因为NIO涉及了Reactor线程模型,所以必须必须对多线程和网络编程非常熟悉才能写出高质量的NIO程序

    3.想要有高可靠性,工作量和难度都非常的大,因为服务端需要面临客户端频繁的接入和断开、网络闪断、半包读写、失败缓存、网络阻塞的问题,这些将严重影响我们的可靠性,而使用原生NIO解决它们的难度相当大。

    4.JDK NIO中著名的BUG--epoll空轮询,当select返回0时,会导致Selector空轮询而导致CUP100%,官方表示JDK1.6之后修复了这个问题,其实只是发生的概率降低了,没有根本上解决。

    五、为什么选用Netty框架

    1.API使用简单,更容易上手,开发门槛低

    2.功能强大,预置了多种编解码功能,支持多种主流协议

    3.定制能力高,可以通过ChannelHandler对通信框架进行灵活地拓展

    4.高性能,与目前多种NIO主流框架相比,Netty综合性能最高

    5.高稳定性,解决了JDK NIO的BUG

    6.经历了大规模的商业应用考验,质量和可靠性都有很好的验证。

    六、Netty能提供什么服务?

    1.开发异步非阻塞的TCP网络应用程序

    2.开发异步非阻塞的UDP网络应用程序

    3.开发异步文件传输程序

    4.开发异步HTTP程序的服务端和客户端

    5.提供多种编解码的集成框架,包括谷歌Protobuf、JBossMarshalling、Java序列化、压缩编解码、XML解码、字符串编解码等都可以由用户直接使用

    6.提供形式多样的编解码基础类库,可以方便地进行私有协议栈编解码框架的二次开发

    7.基于职责链的Pipeline-Handler机制,可以方便地对网络事件进行拦截和定制

    8.所有的IO操作都是异步的,用户可以通过Future-Listeren机制主动get结果或者等IO线程完成操作之后主动Notify来通知,用户业务线程不需要同步等待

    9.基于链路空闲事件监测的心跳机制

    10.流量控制和整形等等..............

    以上只是对netty的一个基本了解,下一章我们深入探索一下netty在实际应用中发挥的作用!

    我话讲完!谁赞成?谁反对?
  • 相关阅读:
    团队作业第四次—项目系统设计与数据库设计
    团队作业第三次—项目需求分析
    简时——alpha冲刺任务七(5.5)
    简时——alpha冲刺任务六(5.4)
    简时——alpha冲刺任务五(5.3)
    简时——alpha冲刺任务四(5.2)
    简时——alpha冲刺任务三(5.1)
    简时——alpha冲刺日志二(4.30)
    简时——alpha冲刺日志一(4.29)
    TimeMaster—代码规范、冲刺任务与计划
  • 原文地址:https://www.cnblogs.com/wffzk/p/15534256.html
Copyright © 2011-2022 走看看