文章目录
- 前言
- 一、基础概念
- 狭义网络
- 网络应用
- 工程库
- 二、总体框架
- 三、应用分层
- 总结
前言
开始之前,咱们先澄清一些基础概念、总体框架和应用分层,避免在后续的讨论中给大家带来误解。
一、基础概念
狭义网络
常规Java后端开发中应用到的计算机网络,基于TCP/IP协议栈,运行在CentOS操作系统下。此外,由于UDP传输本人不擅长,因此后续会更多讨论TCP传输。
网络应用
基于网络完成大部分业务逻辑,网络将整个应用在逻辑上被划分为server端、client端和网络通信三部分。在架构设计时,需要考虑server端和client端的业务划分,网络通信部分则更多关注数据传输方式和网络波动对业务动作的影响。鉴于业务是丰富多样的,后续的内容更多关注在TCP协议下的数据传输方式和网络波动处理相关。
工程库
显然就是Netty,选择原因有这么几个:
- NIO模型在资源占用和延迟上都比较优秀,并解决Java NIO bug;
- 串行无锁化机制使其具有良好的扩展,并保持高性能;
- 提供网络应用开发场景下的定制工具,如HashWheelTimer处理超时,对ByteBuffer的改进,FastThread,基于jmelloc的缓存池管理等。
后续关于Netty的讨论也会围绕这些关键点展开。
二、总体框架
从图中,我们可以得到几点知识:
- Netty在整个网络应用中的位置,以及处理的逻辑实体单位;
- 不同网络层次处理的逻辑实体单位是不同的。当你和别人讨论特定层次的问题时,请注意你的单位是什么。比如你得到一个网络抓包文件,然后筛选出TCP协议的内容,此时的内容都是TCP segment 也就是TCP报文,而不应该是TCP数据包。
- 如果你对软件的特点相对了解就会知道,从上到下带宽越来越宽,那么物理层就是整个带宽的极限,无论我们如何优化上层都不可能超越,就如同道路就是一根单行道路,不改造你咋玩也跑不出4车道的效果。
- Netty本身其实对TCP还是UDP是不挑的,所以在传输层我并没有框定是TCP还是UDP。
三、应用分层
Netty实际解决的问题:
- 从传输层层读取byte[]: 编解码器解决TCP分包/粘包问题,控制发送速率;
- 反序列化为message:I/O逻辑与逻辑处理,解耦包括代码组织解耦和运行时解耦,ChannelPipeline 和 Future, EventLoop
- 序列化message为byte[] :缓存管理和对象池化 BufferManagement和Rcycler
- 连接状态维护;接入管理、心跳保话;
总结
以上就是今天要讲的内容,本文介绍了后续讨论的基本概念、总体框架和应用分层,为后续的讨论打下基础。