从开源项目中学习
对于程序员来说,这个时代是最好的时代。随着软硬件的快速发展,电脑变得越来越便宜,获取一台用于编程的电脑不再是大问题。更重要的是,当你拥有了电脑后,获取编程知识的途径相比以往也更加丰富,有各种在线课程手把手地带你一步一步学习,有各种专栏把总结好的知识教给你。当然这些都是被动地接受知识,要想真正地掌握还是离不开实践,而研究开源项目就是一种好的实践方式。
对于程序员来说,这个时代是最好的时代。随着软硬件的快速发展,电脑变得越来越便宜,获取一台用于编程的电脑不再是大问题。更重要的是,当你拥有了电脑后,获取编程知识的途径相比以往也更加丰富,有各种在线课程手把手地带你一步一步学习,有各种专栏把总结好的知识教给你。当然这些都是被动地接受知识,要想真正地掌握还是离不开实践,而研究开源项目就是一种好的实践方式。
通过 netstat 命令查看网络状态,其中有一列展示的是 socket 的状态,熟练掌握这些状态的含义有助于连接状态的分析与问题排查。
在使用 netty 开发网络应用时,通常会设置 ChannelOption.SO_BACKLOG
,不知你有没想过这个参数的作用是什么。
tcpdump 是一个强大的抓包工具,它可以用于抓取指定网络端口上的数据,这在某些场景下会非常有用。tcpdump 的命令参数相当复杂,打开它的 man page,你会发现有好多页内容,真让人头大。此外它的日志输出格式也比较独特,如果不了解规则的话将很难读懂。
学习一门新的语言,通常是以 HelloWorld 开始的。类似地,学习一个网络框架,通常是以 EchoServer 开始的。接下来我们就来看下如何通过 netty 实现一个 EchoServer。
fastjson 提供了一个全局的修改序列化配置的方式。如果你对某个类型的默认序列化方式不满意,或者想指定自定义类型的序列化方式,那么你可以通过修改全局配置的方式实现。
当多个线程使用同时同一个 PoolArena
分配内存时,因为存在竞争关系,所以会导致内存分配性能下降。为了减少冲突,PooledByteBufAllocator
会提供多个 PoolArena
,并通过 PoolThreadCache
分配给每个 FastThread
线程,同一个线程多次分配释放的过程中,还会使用到缓存,以降低多次内存分配的压力。
最近花时间研究了下 Netty 的内存管理实现,感觉挺有意思的,但也明显地感觉到,这部分功能要比其他功能模块更难理解。在这个过程中,我一直在想,如果能有这么一张图,能够说明内存管理的模块组成、各个模块之间的关系以及其实现原理,那么我就可以以更短的时间读懂相关源码了。因此,我将自己的一些理解画成了图。如果你也对这块内容感兴趣,兴许这篇文章能有所帮助。
Unpooled
是 netty 提供的一个工具类,通过它可以方便地创建各种类型的 ByteBuf
。需要注意的是,通过 Unpooled
创建的是非池化的 ByteBuf
,在注重性能的场景需要使用各种 PooledByteBuf
。接下来我们就来看下 Unpooled
类是如何使用的。
Netty server 在启动过程中会触发一系列的 Inbound 事件,它的流程是怎样的呢?