引言
今天是12月13日,心情是无比沉重,先辈们度过的那段沉痛岁月让人难以想象,如今作为后辈的作者只能鞭策自己精进学习,为争取早日成为大佬而努力奋斗。
在这特殊的日子里,徘徊了许久,作者下决心要学习一下关于实时通讯的框架,对比眼下的各种框架,作者就义无反顾的选择了较为火热的netty4 框架。
netty简介
netty的官网简介描述如下。
Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.
‘Quick and easy’ doesn’t mean that a resulting application will suffer from a maintainability or a performance issue. Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, Netty has succeeded to find a way to achieve ease of development, performance, stability, and flexibility without a compromise.
netty框架所需的jdk环境
网上的各位大佬都说netty开发的环境需要严格匹配,对于netty4来说,最好时选择jdk8,否则就会有系统报错的风险,作者持着严谨的态度,决定打开官网,netty官网官网描述如下:
No additional dependencies, JDK 5 (Netty 3.x) or 6 (Netty 4.x) is enough
Note: Some components such as HTTP/2 might have more requirements. Please refer to the Requirements page for more information.
上述内容表明若想使用netty4,则必须采用jdk1.6以上的版本,所以此处我们采用了jdk8,
同步和异步
对于同步(synchronization)和异步(asynchronization),
顾名思义,如果有A,B,C三个事件,当A事件执行的同时B事件同时执行,那么事件A和B可以说是同步的,而C事件是当A和B事件完成之后发生执行,那么C事件与A、B事件异步,如spi ,iic之类片级总线都是采用同步通讯完成,而两台微机之间的通讯若uart之类的通讯方式则采用异步通讯。
阻塞和非阻塞
当计算机中存在A和B两个线程,计算机中现有的资源为C、D。A和B线程都要获取计算机资源,A线程获得C,D资源时,需要等待获取完C资源后,才能获取D资源,如果C资源没有获取完毕,则一直处于等待状态,而B线程先获取C资源,若 C资源没有准备好,则直接访问D资源,对于线程A和B访问资源C和D的这个过程来说,A线程对应的过程为阻塞过程,B线程对应的过程为非阻塞过程。
IO和NIO
io(input/output)也就是计算机的输入输出,io分为阻塞式(block)BIO和(non-block)NIO,也就是NIO,NIO的最大特点是该IO不会出现阻塞的情况,即“胸有成竹”,而BIO则需要“排队等待”。BIO和NIO都属于IO
BIO、 NIO、 AIO、异步阻塞的理解
BIO一般是指同步阻塞IO,NIO表示同步非阻塞IO,这两种IO都是同步IO
NIO结构图:
selecter本质是一个线程,他会主动的轮询,channel为双向通道,我们可以通过channel进行读写数据到buffer,channel的本质是读写的工具,我们可以将channel注册到selector,下图所示的这种架构设计就体现了NIO的特点。
AIO是异步非阻塞,器例图与NIO类似,采用中断的方式,当对应的channel释放完毕了,通知clientx和selector选择对应的channel。
异步阻塞,a线程正在使用计算机资源C,b线程需要使用c,但b线程暂时无法使用资源c,处于阻塞状态,且b线程是处于空转状态,根本就没有发挥异步的优势,当a线程使用完资源c后,中断通知b线程,b线程开始使用资源c,这种方式没有多大意义。
netty reactor 模型
单线程模型示意图如下所示:
对应单线程模型而言,虽然也采用了AIO,但是由于是单线程运作,处理并发量非常有限,所以这种方式在开发中一般是不用的。
多线程模型就随之而生:
多线程模型的特点是用专门的AIO类的Reactor单线程负责将客户端的请求发送到服务端,服务端将这些请求存入线程池,由线程池来选择接通哪一个channel,
主从线程模型
主线程负责用户请求,握手、安全认证、登录、而当一个线程由主线程处理完毕之后就直接将这个线程丢给从线程池,从线程池主要处理一些io相关的操作,如IO读写,编解码操作,从而大大提升并发处理能力,这个过程可以形象的比喻为“专人干专事”。
郑重声明:作者无任何商业目的,只用于学习交流,以上博文中的图片均采用网络图片,如有任何不妥,请及时联系作者更改。