热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

netty客户端服务端能否在一个项目里单元测试_Netty系列带你深入刨析Netty运用IO模型和Reactor模型...

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

1

一 概述

接下来就要接触Netty了,我们先对Netty有一个简单的认识,看下面介绍。11.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仍然会有这个问题,只是发送概率变低了。  
21.2 Netty的架构是什么?

6ad83cb3f8268a409e209001019e43ca.png
  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的好处。

2

二 Netty中的模型(IO、Reactor)

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

32.1 常见IO模型

2.1.1 BIO模型

d4b53290bd7b5fd87d11226bb86d888c.png
对上图分析

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

2.1.2 NIO模型

0440433f02ef1551bf22e0d19e735b4f.png
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操作(包括数据准备、数据复制)完成后,通知⽤户程序,⽤户执⾏后续的业务操作。

59e37353e9981fe4c63617f8e152c0f9.png
4. AIO模型存在问题

a 完成事件的注册和传递,需要操作系统底层提供大量支持。
b Windows 系统下通过 IOCP 实现了真正的异步 I/O。但是目前高并发系统都是部署到Linux上。
c Linux系统支持AIO模型不稳定。该系统下异步都是以NIO实现的。
上文介绍IO模型的三种情况:BIO模型、NIO模型、AIO模型。因为AIO模型是依赖操作系统底层,而且Linux支持不稳定,所以只需对其有个简单认识。NIO相对于BIO减少了堵塞和线程开销。42.2 常见Reactor模型

2.2.1 Reactor模型概述

1.Reactor模型是什么?

是一种并发编程模型,是一种思想,具有指导意义。
2. 常见的Reactor模型

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

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

2.2.1 单线程模型

5736be55fb1d940a17e863cd3824c7cc.png上图说明

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

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

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

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

2.2.2 多线程模型

0b3b33b7aca5da41f17cc21a5f4e8674.png上图说明

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

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

2.2.3 主从多线程模型

50e817fac2c38d9afa1428954789e5ba.png上图说明

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

1. 优点

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

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

6eb96ea6886eef367e48f40c2499eb2b.png1. 上图解释

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

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

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

预告下文

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

END公众号简介

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

公众号福利

1efe9e9e77151fa3494d7c6b07cac977.png

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




推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
  • 开发笔记:python协程的理解
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了python协程的理解相关的知识,希望对你有一定的参考价值。一、介绍什么是并发?并发的本质就是 ... [详细]
  • 前言最近一段时间在整公司项目里一个功能的优化,用到了多线程处理。期间也是踩了不少的坑,在这里想说下我遇到的问题和注意事项。以及怎样知道启动的那些多线程都 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
浩哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有