nettyAndroid开发

Netty框架

2021-02-17  本文已影响0人  乙腾

Netty框架介绍

1.Netty是 一个异步的,事件驱动的网络应用程序框架。

2.对于JDK中的NIO进行了封装,且支持TCP和UDP网络通信且性能优异。比如:吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制。

3.同时也支持FTP,SMTP,HTTP以及各种二进制和基于文本的传统协议。

为什么用Netty

netty是一个网络编程框架,对于网络传输来说提供了更加简单的api,且性能优异。

Netty 应用场景

Netty 高性能表现在哪些方面

Netty线程模型

众所周知netty框架是一个高并发的网络框架,因为其有一个非常优秀的现成模式。为了对Netty的线程模式有一个更好地理解,需要系统性的了解一下java中的各种线程模式,最后通过Netty框架进行一个直观的对比。

JAVA中IO的线程模型

根据Reactor的数量和处理资源池线程的数量不同,有如下3种典型的实现

Netty线程模型主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor。

传统阻塞I/O服务模型

image.png

模型特点:

问题分析:

Reactor模型

这种模型也比较好理解,针对阻塞IO模型的两个缺点,进行改进。

image.png

其实通过我的角度来看reactor模型和阻塞模型的区别在于

Reactor模型通过在客户端和handler(处理io的对象)之间加了一层,对客户端和handler进行了解耦。

其实每个对于IO的操作都是阻塞的(从IO的角度),所以每个handler(实际处理io操作的对象)对象必然会阻塞线程,而Reactor模型在客户端和handler中增加了一层(又是通过增加一层的思路解决的,这种解耦思路比比皆是),也就是解耦了客户端请求和服务端handler,让多个客户端共用一个阻塞对象,这里用到的就是BIO多路复用IO的模型,多路socket连接,共用一个线程资源,也就解决了一个客户端连接占用一个服务端线程的问题同时具体处理io的操作交给handler线程池去处理,每个线程处理完事之后,可以做到线程回收复用。

以上这句话简化点来说reactor模型的优点就是:

1.基于多路复用IO模型,解决了一个客户端连接对应一个服务端线程的弊端。

2.对于handler(实际处理io的操作)基于线程池复用的模式,回收线程,并服用线程。

reactor模型的说明:

Reactor模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动,区别于阻塞io,只有通道中有数据传输的事件发生后,才给之分配服务端处理io的线程)。

Reactor模式中的核心组成部分:

单Reactor单线程模式

image.png

说明:

acceptor:接收器,接收请求。
select:实现io监听。

模型说明:

这种模型很简单,就是handler和reactor共用一个线程。

缺点:

很明显,当并发量打的时候,同一时间只能处理一个io操作。

单Reactor多线程模型

image.png

说明:

其实这个也很好理解,即reactor单独使用一个线程,处理io的操作交给线程池去处理。

缺点:

reactor处理所有的事件的监听和响应,在单线程运行, 在高并发场景容易出现性能瓶颈

主从Reactor多线程模型

image.png

说明:

这种模式也比较好理解,针对于reactor单线程在并发场景下的瓶颈,让reactor在多线程中运行。

reactor分为多线程模式,主reactor只负责acceptor(接收请求)的业务,而多个子Reactor负责监听和分发。

到此,Reactor模型的所有实现方式就都已经介绍完了,而Netty才用的IO线程模型就是主从reactor模型

Netty模型

image.png

模型说明:

image.png
                                                 I/O Request
                                            via Channel or
                                        ChannelHandlerContext
                                                      |
  +---------------------------------------------------+---------------+
  |                           ChannelPipeline         |               |
  |                                                  \|/              |
  |    +---------------------+            +-----------+----------+    |
  |    | Inbound Handler  N  |            | Outbound Handler  1  |    |
  |    +----------+----------+            +-----------+----------+    |
  |              /|\                                  |               |
  |               |                                  \|/              |
  |    +----------+----------+            +-----------+----------+    |
  |    | Inbound Handler N-1 |            | Outbound Handler  2  |    |
  |    +----------+----------+            +-----------+----------+    |
  |              /|\                                  .               |
  |               .                                   .               |
  | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()|
  |        [ method call]                       [method call]         |
  |               .                                   .               |
  |               .                                  \|/              |
  |    +----------+----------+            +-----------+----------+    |
  |    | Inbound Handler  2  |            | Outbound Handler M-1 |    |
  |    +----------+----------+            +-----------+----------+    |
  |              /|\                                  |               |
  |               |                                  \|/              |
  |    +----------+----------+            +-----------+----------+    |
  |    | Inbound Handler  1  |            | Outbound Handler  M  |    |
  |    +----------+----------+            +-----------+----------+    |
  |              /|\                                  |               |
  +---------------+-----------------------------------+---------------+
                  |                                  \|/
  +---------------+-----------------------------------+---------------+
  |               |                                   |               |
  |       [ Socket.read() ]                    [ Socket.write() ]     |
  |                                                                   |
  |  Netty Internal I/O Threads (Transport Implementation)            |
  +-------------------------------------------------------------------+


上一篇 下一篇

猜你喜欢

热点阅读