1. Netty 是什么?
Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化了TCP和UDP套接字服务器等网络编程。
从Netty的架构图中我们可以看出Netty的核心有三点:
- 零拷贝能力的缓冲
- 通用通信API
- 可扩展的事件模型
2.Netty往事回首
2.1 Netty作者
Netty是由Trustin Lee(韩国、Line公司)2004年开发。上边的图片就是作者本人,我在github上盗的图😝。Netty从开源至今也有16个年头了,不得不佩服作者的毅力,现在依旧是更新的很频繁。一直在紧追JDK的脚步。
2.2 Netty版本演变
2004年6月 Netty2 发布
声称是Java社区中第一个基于时间驱动的应用网络框架
2008年10月 Netty3 发布
2013年7月 Netty4 发布
2013年12 发布Netty5.0.0.Alpha 1
2015年11月废弃5.0.0
2.3 为什么废弃了5.0?
我们看下官方的解答,图片中红框中的话是Norman Maurer(德国、Apple公司、Netty主要维护者之一)给的解答,翻译过来的意思是,使用ForkJoinPool的主要变化增加了复杂性,并且没有表现出明显的性能优势。使所有分支保持同步也需要大量工作,而实际上并不需要它。所以他就提出要废弃这个版本,废弃5.0主要原因就是:
- 过于复杂,并且性能上没有优势
- 精力有限,维护不过来了。
3. 为什么选择Netty?
3.1 为什么舍近求远?
netty做的更多:
- 支持常用的应用层协议
- 解决传输问题:粘包、半包现象
- 支持流量整形
- 完善的断连、idle等异常处理
netty做的更好:
规避了JDK NIO bug
经典epoll bug:异常唤醒导致cpu 100%
api更有好、更强大
隔离变化,屏蔽细节
3.2 为什么不选择其他?
Apache Mina
Netty和Apache Mina是同一个作者,但是作者本人更推荐Netty,因为Netty是尝试从零开始重建Mina并解决已知的问题。
Sun Grizzly
这个和Netty一样都是诞生于2004年,但是它的热度不如Netty,使用的人也比较少,目前已经不维护了,最近一次更新已经是三年前了。
Apache Switf NIO、ACE等
其他语言的,不是java的所以不考虑。
Cindy
声明周期短
Tomcat、Jetty
通信部分还没有独立出来。
4. Netty社区现状
Github
https://github.com/netty/netty
目前Netty存在多个稳定版本,在github上stat23.9k、fork 11.4k。
应用现状:
- 截止2020年6月,40000+项目使用。统计方法:依赖项中声明io.netty:netty-all
- 截止2020年6月,有465名贡献者。
- 最新发布的版本为4.1.50.Final。
5. 典型项目
- 数据库:Cassandra
- 大数据:Spark、Hadoop
- Message Queue:Rocketmq
- 检索:Elasticsearch
- 框架:gRPC、Aparche Dubbo、Spring5
- 分布式协调器:Zookeeper
- 工具类:async-http-client
6.Netty的趋势
- 更多流行协议的支持
- 紧跟Jdk新功能步伐
- 更多易用、人性化功能(ip地址黑白名单,流量整形等)
- Netty应用越来越多