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.

52 lines
7.1 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | Java程序员如何快速成长
你好我是李号双很高兴你走进我的“深入拆解Tomcat & Jetty”专栏与我和其他同学一起探讨熟悉又陌生的Tomcat和Jetty。
如果你和我一样选择了Java Web开发这个方向并且正在学习和提高的路上你一定思考过这个问题
**我怎样才能成长为一名高级程序员或者架构师?**
对于这个问题每个人的答案都可能都不太一样我先来讲讲我的经历。十年前我在实习的时候是做嵌入式系统开发用的开发语言是C和C++。出于我个人的兴趣爱好当时我想转Java在学了一段时间的Java后发现Java上手还是挺快的API比较齐全而且也不需要自己来管理内存感觉比C语言高级。毕业后我也顺利地找到了一个Java开发的工作入职后我的工作主要是实现一些小模块很多时候通过代码的复制粘贴再稍微改改就能完成功能这样的状态大概持续了一年。
在这个过程中虽然我对Java语法更加熟悉了也“背”过一些设计模式用过一些Web框架但是我很少有机会将一些Java的高级特性运用到实际项目中因此我对它们的理解也是模糊的。那时候如果让我独立设计一个系统我会感到非常茫然不知道从哪里下手对于Web框架我也只是知道这样用是可以的不知道它背后的原理是什么。并且在我脑子里也没有一张Java Web开发的全景图比如我并不知道浏览器的请求是怎么跟Spring中的代码联系起来的。
后来我分析发现,我的知识体系在广度和深度上都有问题。为了突破这个瓶颈,我当时就想,为什么不站在巨人的肩膀上学习一些优秀的开源系统,看看大牛们是如何思考这些问题的呢。
于是我注意到了像Tomcat和Jetty这样的Web容器觉得它们很神奇只需要把Web应用打成WAR包放到它的目录下启动起来就能通过浏览器来访问了我非常好奇Web容器是如何工作的。此外Tomcat的设计非常经典并且运用了方方面面的Java技术而这些正好是我欠缺的于是我决定选择Tomcat来深入研究。
学习了Tomcat的原理之后我发现Servlet技术是Web开发的原点几乎所有的Java Web框架比如Spring都是基于Servlet的封装Spring应用本身就是一个Servlet而Tomcat和Jetty这样的Web容器负责加载和运行Servlet。你可以通过下面这张图来理解Tomcat和Jetty在Web开发中的位置。
![](https://static001.geekbang.org/resource/image/e2/d8/e213f384983f5420884aa085b27eded8.jpg)
随着学习的深入我还发现Tomcat和Jetty中用到不少Java高级技术比如Java多线程并发编程、Socket网络编程以及反射等等。之前我仅仅只是了解这些技术为了面试也背过一些题但是总感觉“知道”和“会用”之间存在一道鸿沟。通过对Tomcat和Jetty源码的学习我学会了在什么样的场景下去用这些技术这一点至关重要。
还有就是系统设计能力Tomcat和Jetty作为工业级的中间件它们的设计非常优秀比如面向接口编程、组件化、骨架抽象类、一键式启停、对象池技术以及各种设计模式比如模板方法、观察者模式、责任链模式等之后我也开始模仿它们并把这些设计思想运用到实际的工作中。
在理解了Web容器以及JVM的工作原理后我开始解决线上的疑难杂症并且尝试对线上的Tomcat进行调优。性能的提升也是实实在在的成果我也因此得到了同事们的认可。
总之在这个过程中,我逐渐建立起了自己的知识体系,也开始独立设计一个系统,独立解决技术难题,也就是说我渐渐具备了**独当一面**的能力,而这正是高级程序员或者架构师的特质。
概括一下,独当一面的能力,离不开**技术的广度和深度**。
技术的广度体现在你的知识是成体系的,从前端到后端、从应用层面到操作系统、从软件到硬件、从开发、测试、部署到运维…有些领域虽然你不需要挖得很深,但是你必须知道这其中的“门道”。
而技术的深度体现在对于某种技术,你不仅知道怎么用,还知道这项技术如何产生的、它背后的原理是什么,以及它为什么被设计成这样,甚至你还得知道如何去改进它。
但是人的精力是有限的广度和深度该如何权衡呢我建议找准一个点先突破深度而Tomcat和Jetty就是非常好的选择。但同时它们也是比较复杂的具体应该怎么学呢我想通过这个专栏来分享一些我的经验。
首先我们要学习一些基础知识比如操作系统、计算机网络、Java语言面向对象设计、HTTP协议以及Servlet规范等。
接下来我们会学习Tomcat和Jetty的总体架构并从全貌逐步深入到各个组件。在这个过程中我会重点关注组件的工作原理和设计思路比如这个组件为什么设计成这样设计者们当时是怎么考虑这个问题的。然后通过源码的剖析加深你的理解。**更重要的是帮你学会在真实的场景下如何运用Java技术**。
同时我还会通过Jetty与Tomcat的对比比较它们各自的设计特点让你对选型有更深的理解。并且通过思考和总结帮你从中提炼一些通用的设计原则以及实现高性能高并发的思路。
在深入了解Tomcat和Jetty的工作原理之后我会从实战出发带你看看如何监控Tomcat的性能以及怎么从内存、线程池和I/O三个方面进行调优同时我也还会分析和解决一些你在实际工作中可能会碰到的棘手问题。
在这个过程中我还会介绍Tomcat和Jetty支持的Servlet新技术比如WebSocket和异步Servlet等我会重点分析这些新技术是从何而来以及Tomcat和Jetty是如何支持的。这些都是Web技术的最新动向你可以在自己的工作中根据需要选用这些新技术。
总之弄懂了Tomcat和JettyJava Web开发对你来说就已经毫无“秘密”可言。并且你能体会到大神们是如何设计Tomcat和Jetty的体会他们如何思考问题、如何写代码。比如怎样设计服务端程序的I/O和线程模型、怎样写高性能高并发程序、Spring的IoC容器为什么设计成这个样子、设计一个中间件或者框架有哪些套路等…这些都能快速增加你的经验值。
成长的道路没有捷径不仅需要上进心和耐心还要保持对知识的好奇心。如果你也想在技术和视野上有所突破拥有独当一面的能力从Tomcat和Jetty入手是一个非常好的选择我也邀请你与我一起探究Tomcat和Jetty的设计精髓一起收获经验、享受成长。
最后如果你正在Java Web开发这条路上向着架构师的方向狂奔欢迎你给我留言讲讲你所付出的努力、遇到了哪些问题或者写写你对这个专栏的期待期待与你交流。