Netty概述
Netty是由Jboss提供的一个异步,基于事件驱动的高性能网络通信开源框架,可以快速的开发高性能,高可靠的网络IO程序,其实就是对Java原生IO的优化和重写。
Netty主要是针对TCP协议下(TCP/IP->JDK原生IO->NIO->Netty),面向Client客户端的高并发应用,或者P2P场景下大量数据持续传输应用。
Netty本质就是一个NIO框架,适用于服务端通讯相关的多种应用场景。
在了解学习Netty之前必须要对NIO熟悉 https://www.cnblogs.com/songgj/p/14398390.html
Netty应用场景
Netty作为一个基础的网络框架应用很广,一般有如下一些场景会使用到:
1. 互联网行业
在分布式系统中各个节点之间需要远程服务调用, 高性能的 RPC框架必不可少, Netty 作为异步高性能的通信框架, 往往作为基础通信组件被这些 RPC 框架使用。
典型的应用有阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信, Dubbo 协议默认使用 Netty 作为基础通信组件, 用于实现各进程节点之间的内部通信
2. 游戏行业
无论是手游服务端还是大型的网络游戏, Java 语言得到了越来越广泛的应用,Netty 作为高性能的基础通信组件, 提供了 TCP/UDP 和 HTTP 协议栈, 方便定制和开发私有协议栈,
账号登录服务器,用户上线/下线感知等。
3. 地图服务器之间可以方便的通过 Netty 进行高性能的通信。
4. 大数据领域
经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨界点通信,它的Netty Service基于Netty框架二次封装实现。
其它的使用到netty项目可以看这个地址 https://netty.io/wiki/related-projects.html
为什么要使用Netty
1、原生NIO存在的问题
NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector
、ServerSocketChannel
、SocketChannel
、ByteBuffer
等。
1. 需要具备其他的额外技能:要熟悉 Java
多线程编程,因为 NIO
编程涉及到 Reactor
模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。
2. 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
3. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug
,它会导致 Selector
空轮询,最终导致 CPU
100%。直到 JDK 1.7 版本该问题仍旧存在,没有被根本解决。