gitbook/深入拆解Tomcat & Jetty/docs/94962.md
2022-09-03 22:05:03 +08:00

83 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 01 | Web容器学习路径
你好,我是李号双。在开篇词里我提到要成长为一名高级程序员或者架构师,我们需要提高自己知识的广度和深度。你可以先突破深度,再以点带面拓展广度,因此我建议通过深入学习一些优秀的开源系统来达到突破深度的目的。
我会跟你一起在这个专栏里深入学习Web容器Tomcat和Jetty而作为专栏更新的第1篇文章我想和你谈谈什么是Web容器以及怎么学习Web容器。根据我的经验在学习一门技术之前想一想这两个问题往往可以达到事半功倍的效果。
## Web容器是什么
让我们先来简单回顾一下Web技术的发展历史可以帮助你理解Web容器的由来。
早期的Web应用主要用于浏览新闻等静态页面HTTP服务器比如Apache、Nginx向浏览器返回静态HTML浏览器负责解析HTML将结果呈现给用户。
随着互联网的发展我们已经不满足于仅仅浏览静态页面还希望通过一些交互操作来获取动态结果因此也就需要一些扩展机制能够让HTTP服务器调用服务端程序。
于是Sun公司推出了Servlet技术。你可以把Servlet简单理解为运行在服务端的Java小程序但是Servlet没有main方法不能独立运行因此必须把它部署到Servlet容器中由容器来实例化并调用Servlet。
而Tomcat和Jetty就是一个Servlet容器。为了方便使用它们也具有HTTP服务器的功能因此**Tomcat或者Jetty就是一个“HTTP服务器 + Servlet容器”我们也叫它们Web容器。**
其他应用服务器比如JBoss和WebLogic它们不仅仅有Servlet容器的功能也包含EJB容器是完整的Java EE应用服务器。从这个角度看Tomcat和Jetty算是一个轻量级的应用服务器。
在微服务架构日渐流行的今天开发人员更喜欢稳定的、轻量级的应用服务器并且应用程序用内嵌的方式来运行Servlet容器也逐渐流行起来。之所以选择轻量级是因为在微服务架构下我们把一个大而全的单体应用拆分成一个个功能单一的微服务在这个过程中服务的数量必然要增加但为了减少资源的消耗并且降低部署的成本我们希望运行服务的Web容器也是轻量级的Web容器本身应该消耗较少的内存和CPU资源并且由应用本身来启动一个嵌入式的Web容器而不是通过Web容器来部署和启动应用这样可以降低应用部署的复杂度。
因此轻量级的Tomcat和Jetty就是一个很好的选择并且Tomcat它本身也是Spring Boot默认的嵌入式Servlet容器。最新版本Tomcat和Jetty都支持Servlet 4.0规范。
读到这里我想你应该对Web容器有了基本的认识可以结合平时工作再去细细体会一下。如果你对HTTP协议和Servlet依然是一头雾水不用担心在预习模块中我还会和你聊聊你应该掌握的HTTP协议和Servlet的相关知识帮你打好学习的基础。
## Web容器该怎么学
Java Web技术发展日新月异各种框架也是百花齐放。在从事Java Web开发相关的工作时面对这些眼花缭乱的技术时你是否会感到一丝迷茫可能有些初学者不知道从哪里开始我身边还有些已经进入了这个行业并且有了一定Java基础的人对于系统设计的体会可能还不够深刻编程的时候还停留在完成功能的层次。这样不仅业务上难有突破对于个人成长也很不利。
为了打破这个瓶颈就需要我们在深度上多下功夫找准一个点深挖下去彻底理解它的原理和设计精髓。并且在深入学习Tomcat和Jetty这样的Web容器之前你还需要掌握一定的基础知识这样才能达到事半功倍的效果。
下面我列举一些在学习Web容器之前需要掌握的关键点我建议你在学习专栏的同时再去复习一下这些基础知识。你可以把这些基础知识当作成为架构师的必经之路在专栏以外也要花时间深入进去。当然为了让你更好地理解专栏每期所讲的内容重点的基础知识我也会在文章里帮你再梳理一遍。
**操作系统基础**
Java语言其实是对操作系统API的封装上层应用包括Web容器都是通过操作系统来工作的因此掌握相关的操作系统原理是我们深刻理解Web容器的基础。
对于Web容器来说操作系统方面你应该掌握它的工作原理比如什么是进程、什么是内核、什么是内核空间和用户空间、进程间通信的方式、进程和线程的区别、线程同步的方式、什么是虚拟内存、内存分配的过程、什么是I/O、什么是I/O模型、阻塞与非阻塞的区别、同步与异步的区别、网络通信的原理、OSI七层网络模型以及TCP/IP、UDP和HTTP协议。
总之一句话基础扎实了你学什么都快。关于操作系统的学习我推荐你读一读《UNIX环境高级编程》这本经典书籍。
**Java语言基础**
Java的基础知识包括Java基本语法、面向对象设计的概念封装、继承、多态、接口、抽象类等、Java集合的使用、Java I/O体系、异常处理、基本的多线程并发编程包括线程同步、原子类、线程池、并发容器的使用和原理、Java网络编程I/O模型BIO、NIO、AIO的原理和相应的Java API、Java注解以及Java反射的原理等。
此外你还需要了解一些JVM的基本知识比如JVM的类加载机制、JVM内存模型、JVM内存空间分布、JVM内存和本地内存的区别以及JVM GC的原理等。
这方面我推荐的经典书籍有[《Java核心技术》](time://mall?url=http%3A%2F%2Fh5.youzan.com%2Fv2%2Fgoods%2F2fnx3ed6fpk3c)、[《Java编程思想》](time://mall?url=http%3A%2F%2Fh5.youzan.com%2Fv2%2Fgoods%2F3f0ddticdedfc)、[《Java并发编程实战》](time://mall?url=http%3A%2F%2Fh5.youzan.com%2Fv2%2Fgoods%2F2758xqdzr6uuw)和[《深入理解Java虚拟机JVM高级特性与最佳实践》](time://mall?url=http%3A%2F%2Fh5.youzan.com%2Fv2%2Fgoods%2F36a92yq65q4x4)等。
**Java Web开发基础**
具备了一定的操作系统和Java基础接下来就可以开始学习Java Web开发你可以开始学习一些通用的设计原则和设计模式。这个阶段的核心任务就是了解Web的工作原理**同时提高你的设计能力**注重代码的质量。我的建议是可以从学习Servlet和Servlet容器开始。我见过不少同学跳过这个阶段直接学Web框架这样做的话结果会事倍功半。
为什么这么说呢Web框架的本质是开发者在使用某种语言编写Web应用时总结出的一些经验和设计思路。很多Web框架都是从实际的Web项目抽取出来的其目的是用于简化Web应用程序开发。
我以Spring框架为例给你讲讲Web框架是怎么产生的。Web应用程序的开发主要是完成两方面的工作。
* 设计并实现类,包括定义类与类之间的关系,以及实现类的方法,方法对数据的操作就是具体的业务逻辑。
* 类设计好之后,需要创建这些类的实例并根据类与类的关系把它们组装在一起,这样类的实例才能一起协作完成业务功能。
就好比制造一辆汽车汽车是由零件组装而成的。第一步是画出各种零件的图纸以及定义零件之间的接口。第二步把把图纸交给工厂去生产零件并组装在一起。因此对于Web应用开发来说第一步工作是具体业务逻辑的实现每个应用都不一样。而第二步工作相对来说比较通用和标准化工厂拿到零件的图纸就知道怎么生产零件并按照零件之间的接口把它们组装起来因此这个工作就被抽取出来交给Spring框架来做。
Spring又是用容器来完成这个工作的的容器负责创建、组装和销毁这些类的实例而应用只需要通过配置文件或者注解来告诉Spring类与类之间的关系。但是容器的概念不是Spring发明的最开始来源于Servlet容器并且Servlet容器也是通过配置文件来加载Servlet的。你会发现它们的“元神”是相似的在Web应用的开发中有一些本质的东西是不变的而很多“元神”就藏在“老祖宗”那里藏在Servlet容器的设计里。
Spring框架就是对Servlet的封装Spring应用本身就是一个Servlet而Servlet容器是管理和运行Servlet的因此我们需要先理解Servlet和Servlet容器是怎样工作的才能更好地理解Spring。
## 本期精华
今天我谈了什么是Web容器以及该如何学习Web容器。在深入学习之前你需要掌握一些操作系统、Java和Web的基础知识。我希望你在学习专栏的过程中多温习一下这些基础知识有扎实的基础再结合专栏深入学习Web容器就比较容易了。
等你深刻理解了Web容器的工作原理和设计精髓以后你就可以把学到的知识扩展到其他领域你会发现它们的本质都是相通的这个时候你可以站在更高的角度来学习和审视各种Web框架。虽然Web框架的更新比较快但是抓住了框架的本质在学习的过程中往往会更得心应手。
不知道你有没有遇到过这样的场景,当你在看一个框架的技术细节时,会突然恍然大悟:对啊,就是应该这么设计!如果你有这种感觉,说明你的知识储备起到了作用,你对框架的运用也会更加自如。
## 课后思考
请你分享一下你对Web容器的理解或者你在学习、使用Web容器时遇到了哪些问题
不知道今天的内容你消化得如何?如果还有疑问,请大胆的在留言区提问,也欢迎你把你的课后思考和心得记录下来,与我和其他同学一起讨论。如果你觉得今天有所收获,欢迎你把它分享给你的朋友。