Day668.Web容器学习路径 -深入拆解 Tomcat & Jetty

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day668.Web容器学习路径 -深入拆解 Tomcat & Jetty相关的知识,希望对你有一定的参考价值。

Web容器学习路径

Hi,阿昌来也,今天开始学习新的文章深入拆解 Tomcat & Jetty,更多去学习关于Web容器相关的知识。

一、Web 容器是什么?

回顾一下 Web 技术的发展历史,可以帮助你理解 Web 容器的由来。

早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、nginx)向浏览器返回静态 html,浏览器负责解析 HTML,将结果呈现给用户。

随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序。

于是 Sun 公司推出了 Servlet 技术。你可以把 Servlet 简单理解为运行在服务端的 Java 小程序,但是 Servlet 没有 main 方法,不能独立运行,因此必须把它部署到 Servlet 容器中,由容器来实例化并调用 Servlet。

TomcatJetty 就是一个 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 容器该怎么学?

1、操作系统基础

Java 语言其实是对操作系统 API 的封装,上层应用包括 Web 容器都是通过操作系统来工作的,因此掌握相关的操作系统原理是我们深刻理解 Web 容器的基础。

对于 Web 容器来说,操作系统方面你应该掌握它的工作原理,比如什么是进程、什么是内核、什么是内核空间和用户空间、进程间通信的方式、进程和线程的区别、线程同步的方式、什么是虚拟内存、内存分配的过程、什么是 I/O、什么是 I/O 模型、阻塞与非阻塞的区别、同步与异步的区别、网络通信的原理、OSI 七层网络模型以及 TCP/IP、UDP 和 HTTP 协议。

基础扎实了,你学什么都快。关于操作系统的学习,我推荐你读一读《UNIX 环境高级编程》这本经典书籍。

2、Java 语言基础

Java 的基础知识包括 Java 基本语法、面向对象设计的概念(封装、继承、多态、接口、抽象类等)、Java 集合的使用、Java I/O 体系、异常处理、基本的多线程并发编程(包括线程同步、原子类、线程池、并发容器的使用和原理)、Java 网络编程(I/O 模型 BIO、NIO、AIO 的原理和相应的 Java API)、Java 注解以及 Java 反射的原理等。此外你还需要了解一些 JVM 的基本知识,比如 JVM 的类加载机制、JVM 内存模型、JVM 内存空间分布、JVM 内存和本地内存的区别以及 JVM GC 的原理等。

3、Java Web 开发基础

具备了一定的操作系统和 Java 基础,接下来就可以开始学习 Java Web 开发,你可以开始学习一些通用的设计原则设计模式

这个阶段的核心任务就是了解 Web 的工作原理,同时提高你的设计能力,注重代码的质量。

从学习 Servlet 和 Servlet 容器开始。我见过不少同学跳过这个阶段直接学 Web 框架,这样做的话结果会事倍功半。

为什么这么说呢?Web 框架的本质是,开发者在使用某种语言编写 Web 应用时,总结出的一些经验和设计思路。

很多 Web 框架都是从实际的 Web 项目抽取出来的,其目的是用于简化 Web 应用程序开发。

Web 应用程序的开发主要是完成两方面的工作。

  • 设计并实现类,包括定义类与类之间的关系,以及实现类的方法,方法对数据的操作就是具体的业务逻辑。
  • 类设计好之后,需要创建这些类的实例并根据类与类的关系把它们组装在一起,这样类的实例才能一起协作完成业务功能。

就好比制造一辆汽车,汽车是由零件组装而成的。第一步是画出各种零件的图纸,以及定义零件之间的接口。

第二步把把图纸交给工厂去生产零件并组装在一起。因此对于 Web 应用开发来说,第一步工作是具体业务逻辑的实现,每个应用都不一样。

而第二步工作,相对来说比较通用和标准化,工厂拿到零件的图纸,就知道怎么生产零件并按照零件之间的接口把它们组装起来,因此这个工作就被抽取出来交给 Spring 框架来做。

Spring 又是用容器来完成这个工作的的,容器负责创建、组装和销毁这些类的实例,而应用只需要通过配置文件或者注解来告诉 Spring 类与类之间的关系。

但是容器的概念不是 Spring 发明的,最开始来源于 Servlet 容器,并且 Servlet 容器也是通过配置文件来加载 Servlet 的。你会发现它们的“元神”是相似的,在 Web 应用的开发中,有一些本质的东西是不变的,而很多“元神”就藏在“老祖宗”那里,藏在 Servlet 容器的设计里。

Spring 框架就是对 Servlet 的封装,Spring 应用本身就是一个 Servlet,而 Servlet 容器是管理和运行 Servlet 的,因此我们需要先理解 Servlet 和 Servlet 容器是怎样工作的,才能更好地理解 Spring。


以上是关于Day668.Web容器学习路径 -深入拆解 Tomcat & Jetty的主要内容,如果未能解决你的问题,请参考以下文章

python学习_day62_前端基础之Bootstrap全局CSS样式

学习笔记-剖析k8s之控制器模型-3月day16

Spring学习-day01

Python学习日记:day8-------文件操作

云原生学习笔记-DAY4

Python学习 day7 数据类型整理