Netty基础篇线程模型介绍
Posted 码农的修炼之道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty基础篇线程模型介绍相关的知识,希望对你有一定的参考价值。
一.Netty是什么?
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
以上这个定义来自百度百科,简单来说Netty就是一个服务器端的网络通信框架,用于处理网络请求,和你自己写一个简单的服务器没什么本质上的区别,只不过Netty做的更强大。因为它是一个基于网络IO的通信框架,不受限于网络协议,所以他的应用范围就很广。比如你如果要开发一个分布式应用,需要RPC(Remote Procedure Call Protocol)进行应用间数据交互。一般情况下你需要设计一套自己的私有协议,基于TCP或者UDP。再比如说游戏行业,玩家长时间在线和服务器进行交互,你可以使用现有的协议比如HTTP来完成数据交互。但是你要知道HTTP可是为浏览器而生的,包含了很多不必要的信息,从节省流量的角度来说肯定是不合理的。当你需要使用私有的网络协议时,Netty这种纯粹基于网络IO的高性能、高可靠性的通信框架就派上用场了,因为你可以进行高度的定制化。当然Netty也对现有的网络协议支持的也很好,比如Http/Https/Websocket等。
二.高效的Reactor线程模型
在介绍Netty的线程模型之前先了解下什么是Reactor线程模型,这个模型最大的特色是基于IO多路复用技术,从而能极大地提高线程处理IO的能力。
Reactor线程模型一般分为以下三种:
(1)Reactor单线程模型
如下图所示,Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成。
很显然这种单线程的reactor模型是不能满足某些高负载、大并发场景的,因为即使是异步非阻塞IO,所有的IO操作都不会导致阻塞,但说到底也就只有一个线程,处理能力毕竟有限。
(二)Reactor多线程模型
在此基础上又演化出了Reactor多线程模型,示意图如下:
主要有这几个特点:
1.有一个专门一个NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求
2.网络IO操作-读、写等由一个NIO线程池负责,由这些NIO线程负责消息的读取、解码、编码和发送;
3.一个NIO线程可以同时处理N条链路,但是一个链路只对应一个NIO线程,防止发生并发操作问题。
(三)主从Reactor多线程模型
多线程Reactor模型已经能够满足绝大多数的场景,但是当客户端连接数过多的时候,比如百万级的并发量,那么只用一个线程来接收请求就会显得力不从心了。于是第三种主从Reactor多线程模型应运而生,最大的特点就是:服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。模型图如下:
Netty就是采用了这种经典的Reactor线程模型设计,但是具体采用了哪一种呢?答案是这三种都支持,通过在启动类中创建不同的EventLoopGroup实例并通过适当的参数配置就可以实现,具体怎么操作以后再说。
以上是关于Netty基础篇线程模型介绍的主要内容,如果未能解决你的问题,请参考以下文章
Netty模型篇一:Netty 线程模型架构 & 工作原理 解读