关于netty的功能和良好的体现在七层网络运用开发中咱们是众所周知的,我为什么还要再谈这个问题呢?首先在我日常的工作中netty的确给我带来了许多便当的地方,比方netty稳定的功能、良好的并发体现、多协议适配、动态编解码的安装、丰厚的编解码器。
咱们在享受netty根底网络库开发的便当之处也要结合实际的场景来谈谈它的优势,咱们首先从运用的角度来看一个网络运用处理的流程管理。
sequenceDiagram
网络数据->>协议处理: 网络协议解码
协议处理->>事务处理: 事务目标转化
事务处理->>协议处理: 事务目标转化协议
协议处理->>网络数据: 网络协议编码
一个网络结构应该具有的才能
在我没有用netty开发的时分我考虑的问题比较简单比方才能处理tcp协议/udp协议再做一些东西类就能够,虽然下面的图是针对netty的优势画的但是咱们能经过它来考虑一个优异的网络结构应该是什么样的。
下面我针对实际的事务场景来阐明一下我作为网络运用开发者应该考虑的问题和结合netty做一些阐明
1、网络数据接纳和发送阶段
关于网络数据的接纳和发送咱们是离不开byte[]数据流的,那么咱们处理网络运用就需求不停的分配byte[]和释放byte[],咱们在java编程方面习惯运用new关键字来创立一个目标,那么这个目标从分配到释放要经过gc处理无论是minor gc仍是 full gc 都需求经过废物回收的扫描处理。咱们为了进步功能就考虑到内存池,池化才是咱们解决较高目标的分配和释放最好的方法,咱们再看池就有许多池比方内存池目标池,咱们经过复用的方法来循环使用这样就能够进步功能不再经过gc的方法去管理咱们的目标。netty的关于网络过来的数据最大的优势便是内存池管理这儿就包含了jemalloc的内存分配管理所以我认为netty关于网络数据的接纳和发送有更好的功能体现。
2、事务目标处理阶段
关于网络的数据咱们最终要转化成事务目标,假如咱们用new的方法去创立,比方1000w个请求假如单纯运用new的方法去创立咱们要创立1000w个实例,这儿咱们不评论jvm内存模型管理1000w个目标的价值是巨大的,假如咱们看总量1000w但实际的qps确是 1w 那是不是咱们用目标池的方法来管理这些目标会更好。
3、网络协议编解码处理阶段
关于运用开发来说除非是做是做固定协议的编解码处理,在协议选择上咱们会对协议设计选择两种方法,1、选择私有协议作为开发规范,2、选择通用规范协议作为开发规范。在平常咱们触摸的协议处理中许多都是固定协议的,这儿假如你不用netty去做也没问题只需咱们完成一套协议就能够,那假如咱们需求考虑多协议适配甚至比方tls通道,socks协商,多协议接入,动态改变协议处理,关于这种协议咱们就需求一个应变才能较强的结构,netty中的pipline流程动态安装现在是其它网络结构没有的。在了解动态安装这件事情上咱们能够幻想一个工厂的流水线,而这条流水线是能够动态安装的只需求我进行必要的环节重组就能够生产不同的产品。
4、规范协议编解码支撑
关于一个优异的网络开发结构首先要考虑到通用协议的适配,比方tcp protobuf、http1、http2、http3(quic)、dns、redis、mqtt 这样咱们在开发这些协议的时分只需求组装上就能够直接运用,你说这有多便当。