距离上个项目使用netty很久了,在学习分布式的时候,发现很多框架都是基于netty实现的,重新将netty又捡回来再思考一遍。
为何选netty
netty的产生是由一系列的技术驱动的。首先是socket编程bio的资源效率较低,驱动产生了nio,但是裸的nio想变成工业级的通讯框架难度是非常大的。netty的出现完美的弥补了这个空白,让普通程序员可以快速写出工业级的框架。
在java领域,对比于同类级的通讯框架,例如mina,netty具有简单易用、性能高、社区不断在维护等良好的优势,可以说是当前基于java的最完美的通讯框架,如果让我再写socket程序,毫不犹豫直接选择netty。
从更高的层次考虑netty,至少可以思考如下两个点:
- rpc的角度,netty提供了一个rpc框架的基础和大部分基础设施,例如说安全、内存、简单的白名单等各种基础设施,做rpc不选netty选谁。
- 反应式编程,netty性能非常高,nio reactor模式,量体裁衣的异步channelFuture、ChannelPormise设计,最终早就了高性能的反应式编程经典。
各种领域不同视角思考,不选netty选谁?
netty的量体裁衣
我比较喜欢基于原理或者基础级的量体裁衣式的设计。
例如说redis,它的数据结构设计就是基于基本数据结构针对redis设计要求的一种量体裁衣,堪称完美。
netty中也有同样的量体裁衣,看ChannelFuture、ChannelPromise、EventLoop的设计,这就是基于java concurrence的管程设计,结合netty的nio读写的业务特性,专门设计了ChannleFure、ChannelPromise、EventLoop,高性能、高效率,完美的和业务特性结合在一起。这块代码也是netty粘合层代码中最难理解的一层代码。但是深入下去了,不由的赞叹作者的功力深厚,能够具有量体裁衣的能力,最终早就艺术上的完美。
netty的全面和功能强大
netty中包含了各种知识点
- 典型的有粘包和拆包,为了用户界面的方便,设计了我前两篇文章提到的固定字符、固定长度、协议性的三种handler。
- netty中隐藏了socket参数知识,对于各种socket参数也需要深入学习。
- netty对于内存的管理,设计了内存门限,通过管理内存门限,使得netty在合理的内存界限内波动。
- netty对于安全的管理,设计了一套对应的handler
深入挖掘,发现知识点很多。
小结
再拾netty,我感觉自己能进一步感受到netty在设计艺术上的美了,这个美是建立在netty的作者强大的知识基础上的。体会美深入了一个层次,但是更需要多动手实践实践,挖掘细节。后续打算针对一些点再多写几篇。
网友评论