You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.1 KiB

结束语 | 静下心来,品味经典

从专栏上线发布到现在,不知不觉三个月时间过去了,感谢你的一路陪伴,今天到了说再见的时候,我想简单回顾一下专栏的内容,并且聊聊我的一些感受。

Tomcat和Jetty发展这么多年已经比较成熟稳定。这些年技术发展迭代速度又很快在一个“追新求快”的时代Tomcat和Jetty作为Java Web开发的必备工具似乎变成了“熟悉的陌生人”。对于很多新同学来说虽然有些Tomcat和Jetty的知识点在面试中会碰到但从侧面来说Tomcat和Jetty似乎没有那么“火”那是不是说如今就没有必要深入学习Tomcat和Jetty了呢只要会用就行呢要回答这个问题我先讲讲为什么我选择这个主题来写专栏吧。我写这个专栏的初心还是希望我们可以静下心来,细细品味经典的开源作品从而进一步提升我们的“内功”。“内功”这个词有些抽象具体来说就是学习大牛们如何设计、架构一个中间件软件系统并且让这些经验可以为自己所用。作为一名IT从业者我认为我们很有必要深入思考一下这些大牛为什么能够创造出这些优秀的作品并且能引领技术的发展呢。

不知道你发现没有,美好的事物往往是整洁而优雅的。但这并不等于简单,而是要将复杂的系统分解成一个个小模块,并且各个模块的职责划分也要清晰合理。与此相反的是凌乱无序,比如你看到一堆互相纠缠在一起的电线,可能会感到不适。

同样的道理,当我们在设计一个软件系统时,追求的目标也应该是整洁和优雅。我觉得首先需要合理划分功能模块,主要是分清楚“变与不变”的边界因为变化往往会给系统实现带来混乱因此需要将“变”的因素控制、隔离起来。如果你发现一个软件系统里有大量if else语句、大量的重复代码、大量的相互依赖那么这个系统多半还有提高的空间所以分清楚“变与不变”十分重要。

从宏观上看中间件实现的功能基本上是稳定不变的它们往往会实现一些协议和规范比如Tomcat作为一个“HTTP服务器 + Servlet容器”它向开发人员屏蔽应用层协议和网络通信细节我们拿到的是一个标准的Request和Response对象而具体业务逻辑则作为变化点交给我们来实现。

从微观上来看Tomcat内部也隔离了变化点和不变点比如Tomcat和Jetty都采用了基于组件化的设计其目的就是为了实现“搭积木式”的高度定制化而组件的生命周期管理有一些共性被提取出来成为接口和抽象类而具体子类实现变化点。

其实当下流行的微服务也是这个思路,首先按照功能将单体应用拆成微服务,拆分的过程中要注意从众多微服务中提取一些共性,而这些共性就会成为一些核心的基础服务,或者成为一些通用库。

设计模式往往是封装变化的一把利器我在专栏里也谈到不少Tomcat和Jetty所采用的设计模式合理地运用设计模式能让我们的代码看起来优雅且整洁。

除此之外我们在编写程序时应该时刻考虑到高性能尤其是开发基础的中间件系统在大数据量、高并发情况下可能一行代码的改动会带来明显的性能提升。高效意味着合理的数据存储和流动方式换句话说其实就是合理地运用数据结构和算法举个最简单的例子在某个场景是选择数组还是链表。如果你深入了解过Tomcat你会发现在许多实际场景中Tomcat都会有针对性的选择所以对于一些常见的数据结构和算法虽然我们不需要深入到实现细节但是一定要知道在什么场景下用哪个。

此外写高性能程序还意味着你需要掌握操作系统底层原理并且深入到JVM底层的实现细节比如我们调用了一个Java APIJVM和操作系统在背后为我们做了什么呢挖得更深一点我们对程序的理解也就更深刻也许就是因为深入的这一小步能够让我们在竞争中脱颖而出。

不知不觉我从Tomcat和Jetty的学习谈到了如何优雅地设计一个复杂的系统。由点及面你可以把Tomcat和Jetty当作一个支点从我们身边“熟悉又陌生”的Tomcat和Jetty入手不光掌握它们的使用更能从它们的源码中汲取经验提升自己的系统设计能力。学习这件事千万不能浮躁很难做到一口吃成大胖子最重要的是需要静下心慢慢体会和思考。我看到不少同学的留言从提问的内容我能感受到你们的好奇心和思考有些问题我也还要去查阅源码才能回答上来在这个过程中我自己也主动或被动的学到不少东西所以说多和同行们交流也非常有必要。

学习永远在路上,最后祝我们一起进步!