官网地址: https://netty.io/
快速入门:https://netty.io/wiki/user-guide-for-4.x.html
Netty 是一个 NIO 客户端服务器框架,方便快速、简单地开发网络应用程序。
NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。
注意:netty 5.x版本被弃用了,现在推荐的版本是4.x。被弃用的原因是5.x的API太复杂了,而且不稳定。
特性
设计
- 对于多种传输类型具有统一的API。
- 基于灵活的、可扩展的事件模型,这个事件模型可以清晰的分离关注点。
- 可以定制线程模型,可以是单线程,或者是有一个或多个线程的线程池,例如SEDA。
- 支持无连接的数据报套接字(从3.1版本开始)。
性能
- 更好的吞吐量,更低的延迟。
- 更少的资源消耗。
- 最小化不必要的内存拷贝。
安全
-
完全支持SSL/TLS和StartTLS。(
扩展:StartTLS不是一个协议,而是一个用在邮件的命令,邮件客户端通过StartTLS告诉服务器端要将不安全的协议升级为安全的协议,比如SSL或TLS。参见:https://mailtrap.io/blog/starttls-ssl-tls/
netty架构
官方文档:https://netty.io/3.8/guide/#architecture
下面是netty的整体架构图。
强大的缓冲数据结构(Rich Buffer Data Structure)
Netty拥有自己的buffer API,它具有下面的特点:
- 如果有需要,可以定义自己的buffer类型。
- 通过内建的复合buffer类型可以达到零拷贝(zero copy)
- 提供开箱即用的动态buffer类型。
- 不需要调用flip()方法。注:这个flip()是java中buffer的方法,作用是调整buffer的起始位置和容量。
- 比ByteBuffer速度快。
ChannelBuffer的组合与切分
在通信层(communication layers)进行数据传输的时候,数据经常会被组合和切分。
Netty支持零拷贝方式,具体是通过将ChannelBuffer指向需要的buffer,以此消除对数据拷贝的需要。
统一的异步I/O API
Netty通过抽象各种传输协议的操作,编写了统一的异步I/O接口。
基于Netty的应用程序从一个传输协议切换到另外一个传输协议非常的容易,只需要修改几行代码就可以完成。
基于拦截器模式的事件模型
Netty拥有定义良好的事件模型。当实现自己的事件类型的时候,不会打破已经存在的代码。
支持快速开发的高级组件
Netty提供了许多的高级特性支持快速开发网络应用程序。
编解码框架
Netty提供了编解码框架,可以将socket的数据接收与业务代码进行分离。
支持SSL/TLS
在java里面要支持SSL/TLS是非常复杂的,需要自己管理javax.net.ssl.SSLEngine。
Netty提供了SslHandler来处理SSLEngine中的细节和陷进。
开发程序的时候,只需要将SslHandler放入到ChannelPipeline中就可以了。
HTTP的实现
HTTP其他的实现都是在较高的层次,都已经是封装好了,开发者可以直接使用。
Netty在较低层次提供了对HTTP协议的操作,开发者可以根据自己的需要在netty http上实现特殊的功能,比如传输1GB的大文件。
WebSocket的实现
WebSocket可以在单个TCP Socket上建立双向、全双工的通信通道。WebSocket的设计目标是支持数据在Web 浏览器和服务器之间流动。
Netty实现了WebSocket协议。
整合Google Protocol Buffer
通过ProtobufEncoder和ProtobufDecoder,可以将the Google Protocol Buffers Compiler (protoc)生成的消息接入到Netty。
总结
Netty的架构由三部分组成——buffer、channel、event model,其他高级特性都是在这三个核心组件上构建的。
netty要解决的问题
通用的协议,比如HTTP,在某些特定的场景下并不能很好的发挥作用,比如传输大文件、多人游戏、实时的金融信息,在这些场景下就需要实现特定的协议来满足需求。
解决方案
Netty项目致力于提供一个异步的事件驱动网络应用程序框架,并且提供工具加速高性能、高扩展协议服务器和客户端的构建。
Netty的底层哲学是设计出给你舒适体验的API和实现。