Netty 简介
1. 什么是 Netty
Netty 是由 JBOSS 提供的一个 Java 开源通讯框架,用以快速开发高性能、高可靠性的网络 IO 程序。它底层很好地封装了 Socket,处理网络通信的一个开源通信框架。通俗说明,Netty 就是解决两个系统之间互相通信的一个框架。
在 Java 领域 Netty 运用非常地广泛,Tomcat、Dubbo、RocketMQ、Zookeeper、Spark、Flink、ElasticSearch 等等这些中间件的网络通讯框架都是基于 Netty 去实现的。
其中 Netty 只是对 Java 原生的通信框架进行了高度的封装,如下图所示:
2. 市场占比
在 Java 语言当中 Netty 基本上是一支独大,涉及到网络通信基本上都是使用 Netty,很少去直接使用 NIO 或者其它类似的第三方框架,目前和 Netty 同一级别的框架主要是 mina,其实 mina 和 Netty 都是同一个人开发的,Netty 比 mina 更晚出现,因此推荐 Netty。
相比 mina 那么 Netty 的优势是什么呢?
- Mina 将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比之下性能会有所下降,Netty 解决了这个设计问题;
- Netty 的文档更清晰,很多 Mina 的特性在 Netty 里都有;
- Netty 比 Mina 使用起来更简单,如果上手只需要掌握模板代码 + 自定义 Handler 即可;
- 它们的架构差别不大,Mina 靠 apache 生存,而 Netty 靠 jboss。Netty 有对 google protocal buf 的支持,有更完整的 IOC 容器支持。
3. Netty 特性
特性 | 说明 |
---|---|
完美设计 | 基于灵活、可扩展的事件驱动模型,可以灵活切换底层的线程模型、IO 模型等 |
高性能 | 高吞吐量、低延迟,尽量减少不必要的内存拷贝 |
健壮性 | 1. 消除由于慢,快,或重载连接产生的 OutOfMemoryError;2. 消除经常发生在 NIO 在高速网络中的应用中的不公平的读 / 写比 |
易用性 | 1. 完善的文档;2. 活跃的社区;3. 简单的 API 让开发者能够快速入门 |
内置功能 | 1. 支持多种协议;2. 内置很多的编解码器;3. 内置很多的拆包器 |
心跳检测 | I/O 超时和 idle 状态检测 |
安全性 | 1. 解决了 NIO 存在的空轮询问题;2. 更可靠的 OutOfMemoryError 预防;3. 应用程序的关闭更简单,更安全 |
4. Netty 版本
目前 Netty 主要有三个大的版本
- 3.x 版本;
- 4.x 版本;
- 5.x 版本;
- 三大版本的差异比较大,目前项目开发的主流版本是 4.x,因此也建议大家主要学习 4.x 这个版本。
5. 为什么要学习 Netty
学习 Netty 的好处是什么呢?
- 掌握 Netty 及其原理,可以为自己找工作、面试时加分。并且让自己的技能得到进阶,是初中级迈向高级的门槛;
- 有助于学习和理解主流中间件的架构思想,很多的中间件都是基于 Netty 去开发的,比如:Dubbo;
- Netty 用来系统网络通信功能,是系统的基石,往往决定一个系统的性能,能否扛得住并发;
- 对于学习和理解分布式架构会有很大的帮助,分布式架构下最核心环节就是应用之间的通讯。
6. 学习基础
Netty 非常的复杂,不建议刚参加工作的同学直接学习它,这样会给自己在学习上增加难度。
列举一些学习 Netty 之前最好先掌握的技术点:
- 掌握多线程、线程池的使用;
- 掌握传统 IO(BIO)的使用,以及了解网络 IO 和磁盘 IO 的基本使用;
- 掌握 Socket 的客户端和服务端之间通讯实现,了解其缺点是什么;
- 掌握 NIO 的思想,和 BIO 比较 NIO 的优势以及如何基于 NIO 去操作磁盘文件和网络通讯,核心组件 Buffer、Channel、Selector 的使用;
- 掌握什么是直接缓冲区、非直接缓冲区、零拷贝;
- 掌握什么是序列化,序列化的原理、常用技术;
- 了解 TCP 协议、Http 协议之间的联系、大概原理;
- 了解 IO 的多路复用大致原理,Epoll 的大概原理;
- 了解什么是长连接、短连接的概念和区别,以及它们的应用场景。
以上是列出一些可以说必备的技术点,掌握之后再去学习 Netty 将会非常的容易。
最新评论
Spring Cloud Alibaba 微服务架构实战 https://pan.baidu.com/s/1jF5voFRoeF0lYAzAPBWSbw?pwd=chqk
命令: nload
真是个良心站点哇,大公无私,爱了爱了
还可以直接搞一张映射表,存 uid | time | source_index, 第一次直接查对应的 time 选出前100, 第二次直接用 CompleteFuture 去分别用 source_in
干得漂亮,多个朋友堵条路
2021.2.2版本的不适用吧
现在还可以用么
激活码有用,感谢分享