Netty入门

Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端。

Netty拥有一个充满活力并且不断壮大的用户社区,其中不乏大型公司,如Apple、Twitter、Facebook、Google、Square和Instagram,还有流行的开源项目,如Infinispan、HornetQ、Vert.x、Apache Cassandra和Elasticsearch

使用netty的优势

  • 使用 Netty 构建应用程序,你不必是一名网络编程专家
  • 使用 Netty 比直接使用底层的 Java API 容易得多
  • Netty 推崇良好的设计实践,例如,将你的应用程序逻辑和网络层解耦

网络编程介绍

  • Java API,就是传统的Sokcet编程,每一个Socket对应一个读写线程,这里这要的问题是,业务逻辑很难和底层的网络通信解耦,另一个问题就是,性能问题,如果出错或者中断的socket回收不彻底,很容造成内存浪费等性能问题,而且不容易排查。

传统Java Socket编程模型

  • Java NIO,Java 对于非阻塞 I/O 的支持是在 2002 年引入的,位于 JDK 1.4 的 java.nio 包中。java.nio.channels.Selector 是Java 的非阻塞 I/O 实现的关键。它使用了事件通知 API以确定在一组非阻塞套接字中有哪些已经就绪能够进行 I/O 相关的操作。这也是netty框架底层实现的基础,可以通过阅读netty源码发现。这种模型可以通过一个线程处理多个socket连接,通过Selector实现。

使用Selector非阻塞IO

  这里就涉及到线程模型的概念,介绍一下主流的网络编程线程模型——Reactor线程模型。

  Reactor 模型是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式,Reactor模型包括两个组件,Reactor和Handler

  Reactor:负责监听和分发事件,这个实现的底层原理其实就是JavaNIO的Selector。

  Handler:处理器,负责处理Reactor委派来的事件的具体业务逻辑,也就是说,实际的业务逻辑在这里实现。

 

  根据Reactor和Handler运行在是不是同一个线程以及Reactor的数量又可以分为三种Reactor模型。

  • 单Recactor单线程
  • 单Reactor多线程
  • 主从Reactor多线程(netty采用的模型)

下面介绍三种Reactor模型

  单Reactor单线程:顾名思义,一个Reactor一个线程,只有一个Reactor和可能多个Handler都在一个线程中运行,一个Reactor既处理接受请求事件也要处理读写事件,当有大量并发访问时,很容易产生性能问题,尤其是在处理耗时任务时。

 

 

   

  单Reactor多线程:只有一个Reactor,也是既处理接受请求事件也处理读写事件,但是具体的处理逻辑运行在其他线程,即Handler运行在其他线程。这种模型解决了执行长时间耗时任务的问题,但是并没解决当连接增多,读写事件频繁造成的Reactor压力增大,产生性能问题。

 

 

 

  主从Reactor多线程:存在多个Reactor,,每一个Reactor运行在一个线程中,Reactor主线程就负责接收新来接事件,然后将新的连接派发给Reactor子线程,Reactor子线程负责处理速写事件,Handler运行在另一个线程,专门负责处理业务逻辑。这种模型的性能是最优越的,他可以一个Reactor主线程对应多个Reactor子线程,天然适用于高并发场景。Netty框架就是采用这种模型的加强版,netty可以支持多个Reactor主线程,强大到没朋友。

 

  下面开始简单介绍一下netty的各个组件。

  1. 引导:包括ServerBootstrap和Bootstrap,就是服务器端引导和客户端引导,服务器端引导是将在其上监听并接受传入连接请求的端口,客户端引导就是将客户端socket连接到远程节点
  2. Channel:在Java网络编程中就是Socket,netty多socket进行了包装,常用的基于tcp协议的就是,NioServerSocketChannel服务器端,NIoSocketChannel客户端
  3. EventLoop:定义了 Netty 的核心抽象,用于处理连接的生命周期中所发生的事件
  4.  ChannelFuture :Netty中的所有IO操作都是异步的,就是执行之后立即返回,在某一个时间点确定其结果。
  5. ChannelHandler,ChannelPipline,ChannelHandlerContext,三者关系很密切,相互关联引用,不太容易理解,这里放一张图,先有一个印象
  6.  

  7. ByteBuf:Netty的数据容器,JDK中ByteBuffer的替代品,功能更强大灵活。

   由于netty结构很庞大和复杂,而各个组件之间关联性有很强,要想理解的透彻需要阅读源码,为了帮助大家阅读源码,梳理了netty几个主要的流程,帮助大家更快速的阅读源码,不至于一头雾水,放弃阅读。

  Netty源码分析

 

posted @ 2020-03-22 11:40  OptimisticCoder  阅读(128)  评论(0编辑  收藏  举报