扩展
- Netty 官方文档
- 《Netty in Action》—— Norman Maurer
- 《Netty 权威指南》—— 李林锋
扩展
JSON(JavaScript Object Notation)是一种基于文本的数据交换格式。几乎所有的编程语言都有很好的库或第三方工具来提供基于 JSON 的 API 支持,因此你可以非常方便地使用任何自己喜欢的编程语言来处理 JSON 数据。
本文主要从 Java 语言的角度来讲解 JSON 的应用。
JSON 起源于 1999 年的 JS 语言规范 ECMA262 的一个子集(即 15.12 章节描述了格式与解析),后来 2003 年作为一个数据格式ECMA404(很囧的序号有不有?)发布。
2006 年,作为 rfc4627 发布,这时规范增加到 18 页,去掉没用的部分,十页不到。
Java 官方的序列化存在许多问题,因此,很多人更愿意使用优秀的第三方序列化工具来替代 Java 自身的序列化机制。 如果想详细了解 Java 自身序列化方式,可以参考:Java 序列化
序列化库技术选型:
原因很简单,就是 Java 默认的序列化机制(ObjectInputStream 和 ObjectOutputStream)具有很多缺点。
不了解 Java 默认的序列化机制,可以参考:Java 序列化
Netty 是一款基于 NIO(Nonblocking I/O,非阻塞 IO)开发的网络通信框架。
IO 即 Input/Output(输入和输出),指的是计算机内存与外部设备之间拷贝数据的过程。Java 提供了丰富的 IO 模型支持,包括传统的 BIO(同步阻塞)、NIO(多路复用)和 AIO(异步非阻塞)。理解各种 IO 模型的特性和适用场景,是构建高性能 Java 应用的基础。
UNIX 系统下的 I/O 模型有 5 种:
BIO(Blocking IO)即同步阻塞 IO,是 Java 传统的 IO 模型,基于 java.io 包实现。BIO 以流(Stream)为单位处理数据,分为字节流和字符流两大类。其特点是 API 简洁、易于理解,但在高并发场景下每个连接需要一个线程,资源开销大。BIO 适用于连接数较少且固定的场景。
BIO(blocking IO) 即阻塞 IO。指的主要是传统的 java.io 包,它基于流模型实现。流从概念上来说是一个连续的数据流。当程序需要读数据的时候就需要使用输入流读取数据,当需要往外写数据的时候就需要输出流。
【Java IO】专题涵盖 Java 输入输出体系的核心知识,包括 BIO(同步阻塞)、NIO(多路复用)、AIO(异步非阻塞)三种 IO 模型的原理与实践。同时深入序列化与反序列化机制,涉及 JDK 原生序列化、Protobuf、Hessian 等主流方案的对比与应用。
BIO、NIO、AIO、I/O 多路复用、ReactorBIO、字节流、字符流、InputStream、SocketNIO、Channel、Buffer、Selector、零拷贝Serializable、serialVersionUID、transient、Protobuf、JSONNIO(Non-blocking IO / New IO)是 JDK 1.4 引入的 IO 模型,位于 java.nio 包中。NIO 基于多路复用(Multiplexing)思想,通过 Channel、Buffer、Selector 三大核心组件,实现了一个线程管理多个 Channel 的高性能 IO 模型。NIO 是 Netty、Mina 等高性能网络框架的基础。
在传统的 Java IO 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需要为每个连接创建一个线程,而线程的创建和切换都是有开销的。