「Netty系列」带你深入刨析Netty运用IO模型和Reactor模型

周五咯,今天上班主要实现多个服务端如何通信,如何实现每个服务端部署多台。运维不在没法安装Redis,下周继续这块功能实现。继续不加班,文章走起。前面几篇文章讲述了Netty前置知识,接下来正式介绍Netty。我们都知道Netty基于NIO实现的,但是相对NIO有什么好处呢?从IO模型和Reactor模型来刨析Netty。

 

一 概述

接下来就要接触Netty了,我们先对Netty有一个简单的认识,看下面介绍。

1.1 初步了解Netty

  1. Netty是什么?

Netty是一个高性能的、异步的、基于事件驱动的网络应用型框架。
  1. 为什么使用netty?

a Netty是基于Java的NIO实现的,对各种API进行统一封装。    
b 基于事件模型,我们可以在对应事件编码自己业务。让开发者聚焦业务。   
c 高度可定制线程模型,单线程,一个或者多个线程池。    
d Netty只依赖JDK底层api。    
e 在通信方面,减少不必要内存拷贝,提高性能。    
f 在安全方面,完整的SSL/TLS和StartTLS。 
  1. Netty相对于NIO有什么优势?

a 对NIO中的API进行封装,使用简单。    
b 写出高质量的NIO程序,需要多线程和网络编程的知识积累。   
c NIO可靠性差,如:客户端从连、网络闪退、半包读写、失败缓存等问题。   
d NIO会导致Selector空轮询,最终导致CPU100%,jdk1.7仍然会有这个问题,只是发送概率变低了。  

 

1.2 Netty的架构是什么?

  1. 核心(Core)

a 可扩展的事件模型。         
b 统一的通信api(无论是http还是socket都使用同意的api)。      
c 零拷贝机制与字节缓冲区。 
  1. 传输服务(Transport Services)

a 支持socket和datagram(数据报)。     
b 支持http协议。    
c In-VM Pipe(管道协议)。 
  1. 协议支持(Protocol Support)

a http 以及 websocket。     
b SSL 安全套接字协议⽀持。      
c Google Protobuf (序列化框架)。       
d ⽀持zlib、gzip压缩。    
e ⽀持⼤⽂件的传输。    
f RTSP(实时流传输协议,是TCP/IP协议体系中的⼀个应⽤层协议)。    
g ⽀持⼆进制协议并且提供了完整的单元测试。  

 

上面已经对Netty有个简单的认识,也了解使用Netty的好处。下面从IO模型和Reactor模型这两个角度来刨析使用Netty的好处。

二 Netty中的模型(IO、Reactor)

为什么学习Netty时候,为什么要刨析IO模型和Reactor模型呢?我也有这个疑问。查看下面文章,能否有个结论?欢迎在评论区写下独到见解。

 

2.1 常见IO模型

2.1.1 BIO模型


对上图分析

a 客户端的并发数和服务端的线程数是一样多,随着并发量增加服务端线程数增加,服务端性能下降。     
b 当连接创建后,该线程没有操作,会进行堵塞,不会释放线程。极大浪费服务器资源。

2.1.2 NIO模型

1. 对上图组件解释

a Buffer:是缓冲区、底层通过数组实现。在NIO中所有的读写操作都是基于Buffer的。Java基本类型除了boolean都有缓冲区对象。 

b Channel:通常叫为通道,用于连接客户端和服务端。是双向的,可以读也可以写。 

c Selector:通常叫多路复用器,用于找出注册其上的发生读和写的channel。原理如下:        
 Selector不断轮询其上面的Channel,Channel发生读或者写,就会被Slector挑选出来。然后通过SelectionKey获取就绪Channel集合,进行IO读写操作。

2. 对上图进行分析

一个线程处理多个通道,避免多线程之间上下问切换造成系统开销。通道只有事件的时候,才进行读写操作。

2.1.3 AIO模型

1. 为什么要引入AIO模型

在NIO中,Selector多路复⽤器在做轮询时,如果没有事件发⽣,也会进⾏阻塞。
如何能把这个阻塞也优化掉呢?那么AIO就在这样的背景下诞⽣了。

2. AIO简介

叫异步IO,该异步依赖操作系统底层异步IO。

3. AIO的基本流程

用户线程通过系统调用,告知kernel内核启动某个IO操作,用户线程返回。kernel内核在
整个IO操作(包括数据准备、数据复制)完成后,通知⽤户程序,⽤户执⾏后续的业务操作。


4. AIO模型存在问题

a 完成事件的注册和传递,需要操作系统底层提供大量支持。
b Windows 系统下通过 IOCP 实现了真正的异步 I/O。但是目前高并发系统都是部署到Linux上。
c Linux系统支持AIO模型不稳定。该系统下异步都是以NIO实现的。

 

上文介绍IO模型的三种情况:BIO模型、NIO模型、AIO模型。因为AIO模型是依赖操作系统底层,而且Linux支持不稳定,所以只需对其有个简单认识。NIO相对于BIO减少了堵塞和线程开销

 

2.2 常见Reactor模型

2.2.1 Reactor模型概述

1.Reactor模型是什么?

是一种并发编程模型,是一种思想,具有指导意义。

2. 常见的Reactor模型

单线程模型、多线程模型、主从多线程模型。Netty非常友好支持前面三种模型,一般采用主从架构方式。

3. Reactor模型三种角色

a Reactor 监听和分配事件
b Acceptor 处理客户端新连接,并分配请求到处理链中。
c Handler 将自身和事件绑定,执行读写操作(完成channel的读入,执行业务逻辑并将结果写道channel)。

2.2.1 单线程模型

上图说明

a 一个线程完成业务处理。
b Reactor相当于一个多路复用器,用于监听事件,并把发生的事件传递给Handler或者Acceptor。
c 如果是建立连接事件,Reactor传递给Acceptor。如果是读写事件,Reactor传给Handler。

1. 优点

a 优点
 结构简单、单线程完成,没有进程通信问题。对一些业务场景简单,对性能要求不高的应用场景。

2. 缺点

a 发挥不了服务器多核优势

b 客户端连接过多导致客户端连接多,Reactor线程负载过重。导致客户端连接超时,
  最终导致大量信息积压。性能低。
  
c 单点故障后,导致系统通信故障。

2.2.2 多线程模型

上图说明

相对于单线程而言,不同点在于,Handler只负责用户响应和事件分发。真正业务逻辑在work线程池中处理。

1. 存在问题

a 多线程数据共享比较复杂。如子线程完成业务处理后,把结果传递给主线程Reactor,
  就会涉及数据的互斥和保护机制。
  
b Reactor承担所有的监听和响应。如果百万客户端连接,获取服务端进行客户端握手安
  全认证,认证本身就很消耗性能。

2.2.3 主从多线程模型


上图说明

a Reactor分成两个部分,MainReactor负责监听server socket,用来处理网络io建立,
将建立的socketChannel指定注册给SubReactor。
b SubReactor建立和socket数据交互和事件业务处理。

1. 优点

a 响应快不必为单个同步事件所阻塞,虽然Reactor本身是同步的
b 可扩展性强 通过扩展SubReactor充分利用CPU资源
c 可复用性高 该模型和具体事件处理逻辑无关,具有很高复用性。

2.2.4 Netty模型(主要是主从多线程模型)


1. 上图解释

a 在netty模型中,负责处理新连接的是BossGroup,负责其他事件的是WorkGroup。
 (Group代表线程池的概念)
 
b NioEventLoop表示一个不断循环处理任务的线程,用于监听绑定在上面的读/写事件。

c PipeLine里面放着一个个ChannelHandler,ChannelHandler用于业务处理。

 

上文介绍了Reactor三种模型:单线程、多线程、主从多线程模型。也对三种模型有了个认识。来看看Netty常用的主从多线程模型,将监听客户端事件,建立连接、业务处理,且分开,对高并发更好的支持。感觉我对这三种模型没有深刻印象,欢迎留言区,留下各位高见。

 

预告下文

从实战带你实现服务端和客户端之间通信,并带你了解下各个组件的作用,执行原理。(与本篇文章一起发布的,感兴趣进入公众号,查看菜单Netty系列)

 

-----------------------------------------------------END---------------------------------------------------

 

公众号简介

在上班之余,学习黑马架构课程一段时间了。持续的分享一些干货,如:Netty、MySQL、缓存、中间件、中台、自动化部署、设计模式、JVM、Spring源码、MyBatis源码。如果你想对该公众号有深入了解,在公众号回复【故事】。

公众号福利

关注公众号,回复【架构面试】,获取架构课程面试题。如果有任何建议或者想说的话,请直接向公众号发消息。运营小姐姐看到后会立即处理。烦请耐心等待!蟹蟹!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值