Netty 入门
# 前言
# 介绍
Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能服务器和客户端
Netty 是由 JBOSS 提供的 Java 开源框架,现为 GitHub 上的独立项目,它是一个异步的、基于事件驱动的网络应用框架,用于快速开发高性能、高可靠性的网络 IO 程序,主要针对在 TCP 协议下、面向 Client 端的高并发应用,或者 Peer-to-Peer 场景下大量数据持续传输的应用,本质上是一个适用于服务器通信相关的多种应用场景的 NIO 框架。
简单地说 Netty 封装了 JDK 的 NIO,不用再写一大堆复杂的代码。既然代替了原生的 NIO,肯定有比它好的理由,主要有如下几点:
1.Netty 底层 IO 模型可以随意切换,比如可以从 NIO 切换到 BIO,但一般很少会这么做。
2.Netty 自带拆包解包,从 NIO 各种繁复的细节中脱离出来,让开发者重点关心业务逻辑。
3.Netty 解决了 NIO 中 Selector 空轮询 BUG,这个 BUG 应该很多人听说过,虽然官方声明 jdk1.6 的 update18 修复了该问题,只不过是降低了发生的概率。
4.对 Selector 做了很多细小的优化,reactor 线程模型能做到高效的并发处理。
# 应用场景
分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC
框架必不可少,Netty
作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC
框架使用(Dubbo
的 RPC
框架使用 Dubbo
协议进行节点间通信,其默认使用 Netty
作为基础通信组件)
游戏行业中,Netty
作为高性能的基础通信组件,方便定制和开发私有协议栈,同时提供了 TCP/UDP
和 HTTP
协议栈,地图服务器之间可以方便的通过 Netty
进行高性能的通信
大数据领域中,经典的 Hadoop
的高性能通信和序列化组件 Avro
的 RPC
框架,也是默认采用 Netty
进行跨界点通信
物联网行业中,牵涉到很多应用传感器和服务器端的数据通信,可以使用 Netty
轻松解决
其他开源场景使用 Netty:Netty.docs: Related projects (opens new window)
# 预备知识
本文默认您已经掌握了Java OOP
编程、Java
多线程编程、Java IO
编程、Java
网络编程、常用的 Java
设计模式(比如观察者模式,命令模式,职责链模式)、常用的数据结构(比如链表),因此相关知识不会过多赘述
# I/O 模型
# BIO
Java BIO
:同步并阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销
BIO
方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4
以前的唯一选择,但程序简单易理解
BIO 是面向流的
# NIO
Java NIO
:同步非阻塞,服务器实现模式为一个线程处理多个请求(连接),即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有 I/O
请求就进行处理
NIO
方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,JDK1.4
开始支持
NIO 是面向缓冲区或者面向块的
注:NIO 本质思想和
HTTP 2.0
使用的多路复用技术相同
# AIO
Java AIO(NIO.2)
:异步非阻塞,AIO
引入异步通道的概念,采用了 Proactor
模式,简化了程序编写,有效的请求才启动线程,它的特点是先由操作系统完成后才通知服务端程序启动线程去处理
AIO
方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS
参与并发操作,编程比较复杂,JDK7
开始支持
# 安装
本次使用版本:Netty4.1.x(5.0 出现重大 BUG,已被抛弃)
# 参考链接
- Netty 入门看这一篇就够了 - 掘金 (juejin.cn) (opens new window)
- Netty 入门与实战教程 - LingBrown - 博客园 (cnblogs.com) (opens new window)
- Netty 学习手册 (dongzl.github.io) (opens new window)
- 超详细 Netty 入门,看这篇就够了!-阿里云开发者社区 (aliyun.com) (opens new window)
- 史上最通俗 Netty 入门长文:基本介绍、环境搭建、动手实战-网络编程/专项技术区 (opens new window)
- Netty 教程 (yiibai.com) (opens new window)