网络编程是后端开发工程师绕不开的话题,HTTP
服务器又是Web
开发的核心之一。
得益于Spring
等框架对其进行的良好封装,我们在日常开发业务时很少需要关注Tomcat
服务器或其他Web
服务器中的内部细节。
但想要进一步修炼自己的内功,深入网络编程可谓是一条必经之路。
在Java
的网络编程领域中,Netty
框架可以说是其中的佼佼者,但其源码的层级较深,逻辑也相对复杂,从源码入手学习网络编程会是一条非常坎坷的道路。
那我们为什么不从头开始,自己设计并实现一个完备的网络编程框架呢?
恰逢JDK21
中推出了虚拟线程和堆外内存与Native
方法调用等功能,并引入了非常多的新语法特性。这给我们调用操作系统API
实现网络框架带来了非常多的便利。
于是,小册作者 benrush 决定利用这些功从头开始构建一个简洁的,在满足代码高可读性、整体高可用性的前提下,兼顾高并发低延迟需求的网络框架,尽可能代替Netty
在需要自定义网络协议通信的项目中进行使用。
现在就有了这样一本小册。
本小册会使用许多从JDK8
至JDK21
以来发布的新语法特性,从 0 开始设计并构建一个基于TCP
协议实现的网络框架,带大家逐行完成代码的编写、调试,并最终通过压力测试验证该网络框架的性能。
具体来说,小册分为基础篇和实战篇。
其中,基础篇分为两大部分。
第一部分:第 1 节到第 5 节。这部分主要讲解整个实战项目的基础知识,我会着重介绍本次实战中使用到的JDK21
虚拟线程和堆外内存管理的相关知识,方便日常使用JDK8
进行开发的读者们快速的上手一些JDK
新特性,这些特性也会在本次实战中使用到。同时,我会讲解一些简单的C
语言知识,方便之前没有了解过C
语言的读者理解。
第二部分:第 6 节到第 10 节。这部分主要讲解TCP
协议、socket
网络编程 、IO
多路复用模型和Reactor
线程模型,以及使用SSL/TLS
层进行加密等相关知识。这部分主要是为我们后续网络框架实战开发打下理论基础,帮助大家了解如何去构建一个健壮的、功能强大的多线程网络框架。
而在实战篇中,我将带领大家手把手来完成整个网络框架。从设计到实现,再到最终实现并通过压力测试。
最后的最后,我们还会对整个构建的过程进行总结,并列出一些后续可优化的方向,以便大家能够继续延伸和完善。
作者介绍
benrush,物联网平台开发工程师。工作以来,一直从事物联网平台开发相关的工作,负责维护海量设备与物联网平台之间使用MQTT
、HTTP
以及一系列自定义网络协议进行网络通信,确保消息传输时的高效性与稳定性,因此对于网络编程的领域有着比较深的理解。
平时热衷于使用Java
语言新特性进行开发,目前正在基于Project Loom
提供的虚拟线程与Project Panama
提供的堆外内存访问 API 从头开发一款全新的开源微服务框架,该小册中的网络框架就属于其中的一部分。
你会学到什么?
Java 开发知识点:
- 利用虚拟线程的特性,用更低的资源消耗获取更高的并发度;
- 利用 Project Panama 提供的 API 管理堆外内存的周期,并利用 FFI 对 C 语言或其他语言构建的动态库进行函数调用;
- 设计一个多线程应用,保障整体线程安全,且高效完成业务逻辑;
- 将实现一个网络框架大任务拆分成多个子模块,同时保障对外提供 API 的易用性和整体代码的可读性。
实现具有以下特征的网络框架:
- 可基于 TCP 协议自定义网络协议并实现具体业务;
- 可正确管理多线程之间交互时的线程安全性,满足低延时和高并发的需求,且系统整体维持较低的负载;
- 可正确管理堆外内存的生命周期,确保不出现内存泄漏等问题;
- 可兼容 IPV4 和 IPV6 两种协议;
- 支持极简从裸 TCP 连接切换至使用 OPENSSL 库提供的 SSL/TLS 加密连接;
- 可在 Windows 系统、Linux 系统和 macOS 系统中跨平台使用,并提供一致的对外 API;
- 适配 JDK21 中推出的虚拟线程模型,在平台线程和虚拟线程之间无感切换;
- 在使用虚拟线程处理业务请求,返回简单 json 字符串的场景下,本网络框架在吞吐量和延时方面具备一定优势。
适宜人群
- 服务端开发,网络中间件开发,以及所有想要深入学习网络编程的相关从业者;
- 计算机专业相关的在校学生或是平时忙于业务开发,未曾深入研究过服务器底层原理的开发者;
- 想要快速上手
JDK21
中的新特性,并在实际工作中进行应用的Java
开发者; - 工作中涉及大量网络开发,但没仔细研究过底层原理,想要深入学习的开发者。