1.Netty是由JBOSS提供的一个java开源框架
(1)本质:JBoss做的一个Jar包,一个好使的处理Socket的框架
(2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序
(3)优点:提供异步的、事件驱动的网络应用程序框架和工具
2.Netty简介
(1)Netty本身就是一个高性能、异步事件驱动的NIO框架
<1>提供了对TCP、UDP和文件传输的支持
<2>封装了Java NIO那些复杂的底层细节,提供简单好用的抽象概念
(2)首先它是个框架,是个“半成品”,不能开箱即用
<1>必须得拿过来做点定制,利用它开发出自己的应用程序,然后才能运行
<2>如果应用根本没有高并发的压力,那就不一定要用Netty了
3.Netty的特点
(1)高并发
<1>Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架
<2>对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高
(2)传输快
<1>Netty的传输快其实也是依赖了NIO的一个特性——零拷贝
(3)封装好
<1>Netty封装了NIO操作的很多细节,提供易于使用的API
4.Netty的架构设计
(1)总体结构:Netty 采用了比较典型的三层网络架构进行设计
<1>传输服务:支持 BIO 和 NIO
<2>容器集成:支持 OSGI、JBossMC、Spring、Guice 容器
<3>协议支持:HTTP、Protobuf、二进制、文本、WebSocket 等一系列常见协议都支持
3.1.还支持通过实行编码解码逻辑来实现自定义协议
<4>Core 核心:可扩展事件模型、通用通信 API、支持零拷贝的 ByteBuf 缓冲对象
5.Netty的高性能设计
(1)高性能的三大要素:
<1>传输/IO模型:用什么样的通道将数据发送给对方,BIO、NIO或者AIO
1.1.IO模型在很大程度上决定了框架的性能
1.2.Netty的I/O模型基于非阻塞I/O实现,底层依赖的是JDK NIO框架的Selector
<2>协议:采用什么样的通信协议,HTTP或者内部私有协议
2.1.协议的选择不同,性能模型也不同
2.2.相比于公有协议,内部私有协议的性能通常可以被设计的更优
<3>Reactor线程模型:Reactor线程模型的不同,对性能的影响也非常大
3.1.Reactor单线程模型
3.1.1.指的是所有的I/O操作都在同一个NIO线程上面完成
3.1.2.对于一些小容量应用场景,可以使用单线程模型
3.2.Reactor多线程模型
3.2.1.Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理I/O操作
3.2.2.主要用于高并发、大业务量场景
3.3.主从Reactor多线程模型
3.3.1.特点是服务端用于接收客户端连接的是一个独立的NIO线程池
3.3.2.可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题
(2)Netty的线程模型
<1>Netty的线程模型是去掉线程池的第三种形式的变种
<2>这也是Netty NIO的默认
6.Netty的核心组件
(1)Bootstrap or ServerBootstrap
<1>一个Netty应用通常由一个Bootstrap开始
<2>它主要作用是配置整个Netty程序,串联起各个组件
(2)ChannelInboundHandler
<1>一个最常用的Handler,处理接收到数据时的事件
<2>业务逻辑一般就是写在这个Handler里面的
<3>ChannelInboundHandler就是用来处理核心业务逻辑
(3)ChannelInitializer
<1>当一个链接建立时,有各种各样的Handler实现来处理它
<2>ChannelInitializer便是用来配置这些Handler
<3>它会提供一个ChannelPipeline,并把Handler加入到ChannelPipeline
(4)ChannelPipeline
<1>一个Netty应用基于ChannelPipeline机制
<2>这种机制需要依赖于EventLoop和EventLoopGroup
<3>它们三个都和事件或者事件处理相关
(5)EventLoops/EventLoopGroup
<1>目的是为Channel处理IO操作
<2>一个EventLoop可以为多个Channel服务
<3>EventLoopGroup会包含多个EventLoop
(6)Channel
<1>代表了一个Socket链接,或者其它和IO操作相关的组件
<2>它和EventLoop一起用来参与IO处理
(7) Future or ChannelFuture
<1>在Netty中所有的IO操作都是异步的,因此,不能立刻得知消息是否被正确处理
<2>但是可以过一会等它执行完成或者直接注册一个监听
<3>具体的实现就是通过Future和ChannelFutures
<4>他们可以注册一个监听,当操作执行成功或失败时监听会自动触发
<5>所有的操作都会返回一个ChannelFuture
7.Netty的应用场景
(1)互联网行业
<1>Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信
<2>淘宝消息中间件RocketMQ生产者和消费者之间,也采用Netty进行高性能、异步通信
(2)游戏行业
<1>方便定制和开发私有协议栈,账号登录服务器,地图服务器之间通过Netty进行高性能的通信
(3)大数据领域
<1>经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨界点通信
<2>它的Netty Service基于Netty框架二次封装实现