Java / Netty 简介

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 的优势是什么呢?

  1. Mina 将内核和一些特性的联系过于紧密,使得用户在不需要这些特性的时候无法脱离,相比之下性能会有所下降,Netty 解决了这个设计问题;
  2. Netty 的文档更清晰,很多 Mina 的特性在 Netty 里都有;
  3. Netty 比 Mina 使用起来更简单,如果上手只需要掌握模板代码 + 自定义 Handler 即可;
  4. 它们的架构差别不大,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 的好处是什么呢?

  1. 掌握 Netty 及其原理,可以为自己找工作、面试时加分。并且让自己的技能得到进阶,是初中级迈向高级的门槛;
  2. 有助于学习和理解主流中间件的架构思想,很多的中间件都是基于 Netty 去开发的,比如:Dubbo;
  3. Netty 用来系统网络通信功能,是系统的基石,往往决定一个系统的性能,能否扛得住并发;
  4. 对于学习和理解分布式架构会有很大的帮助,分布式架构下最核心环节就是应用之间的通讯。

6. 学习基础

Netty 非常的复杂,不建议刚参加工作的同学直接学习它,这样会给自己在学习上增加难度。

列举一些学习 Netty 之前最好先掌握的技术点:

  1. 掌握多线程、线程池的使用;
  2. 掌握传统 IO(BIO)的使用,以及了解网络 IO 和磁盘 IO 的基本使用;
  3. 掌握 Socket 的客户端和服务端之间通讯实现,了解其缺点是什么;
  4. 掌握 NIO 的思想,和 BIO 比较 NIO 的优势以及如何基于 NIO 去操作磁盘文件和网络通讯,核心组件 Buffer、Channel、Selector 的使用;
  5. 掌握什么是直接缓冲区、非直接缓冲区、零拷贝;
  6. 掌握什么是序列化,序列化的原理、常用技术;
  7. 了解 TCP 协议、Http 协议之间的联系、大概原理;
  8. 了解 IO 的多路复用大致原理,Epoll 的大概原理;
  9. 了解什么是长连接、短连接的概念和区别,以及它们的应用场景。

以上是列出一些可以说必备的技术点,掌握之后再去学习 Netty 将会非常的容易。