tomcat原理、结构、设计模式

1 what

一种web服务器,运行java servlet、jsp技术,能为java web提供运行环境并通过http协议处理客户端请求。即tomcat = http服务器+ servlet容器。同类产品有jetty

  • Web应用:Web应用是指通过Web浏览器访问的应用程序,它使用Web技术和标准(如HTTP、HTML、CSS、JavaScript等)来提供用户界面和与用户的交互。Web应用可以包括前端和后端组件,前端负责用户界面和展示,后端负责业务逻辑和数据处理。
  • Servlet:Servlet是Java EE规范的一部分,它是一种运行在服务器端的Java程序,用于接收客户端(如Web浏览器)的请求、处理这些请求(包括访问数据库、调用业务逻辑等),并返回响应给客户端。Servlet是构建动态Web内容的核心技术之一

2 结构

连接器connector+容器container

容器就是engine、host、context、servlet/wrapper

所以架构就是service(8080端口)、connector、engine、host(http:localhost.com)、context(/mvc,一个web应用程序)、servlet/wrapper(/add,一个servlet)

f090bd57045f4088948e1e7da63585ca.png

 

3 关键组件

3.1 connector

3.1.1 Endpoint

用于:网络层通信tcp/ip,如NIO\NIO2

3.1.2 Processor

用于:应用层协议解析,如http

3.1.3 Adapter

用于:统一转换。tomcat request/response 转为servlet request/response,从而传给容器container。

  • servlet request是Java Servlet API 中的一个关键接口。
  • Java Servlet API是Java EE(现称为Jakarta EE)中用于开发服务器端Java应用程序的一套接口和类。Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它主要用于处理客户端的请求并生成响应。

3.2 设计模式

3.2.1 变动点和不变点的设计思路

不变点用抽象类、接口(如ProtocoHanlder、AbstrctProtocol),变点用具体类实现(如Http11NioProtocol、Http11Nio2Protocol)

47fd583736914b5e9911f0e38c739565.png

27e141a1618a4d7b8977cd9fc5a4f24a.png

f646124c6f57416c8648621ea75dbfa3.png

2357e1b0231e4de2b32e8c70f79b00b6.png

6fc9747fa2b14a649d16a3e70e00650d.png

d81414cef6f5481a87660f58599c0e96.png

3.2.2 适配器模式

Adapter,tomcat用CoyoteAdapter。


3.2 container

3.2.1 如何管理engine、host、context、servlet,用组合模式,让他们都实现Container

  • 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。在这种模式中,客户端对单个对象和复合对象的使用具有一致性,即客户端能够以相同的方式处理单个对象和它们的组合。

说白了就是,用一个类/接口组装成树结构(有父子关系),这就是组合了,然后因为都是实现同一个接口,所以对每个部分的调用都是一样的。如下图

d785e0ea64ad4fb6952f9460fcbef154.png

3.2.2 engine、host、context、servlet是顺序调用,用的是责任链模式Pipeline-Valve

pipeline是责任链,是队列,队列中的元素是valve。valve能执行处理逻辑,并转给下一个value。

valve和filter的区别:valve是tomcat的,filter是java servlet api的。valve工作再web容器级别,拦截所有应用请求,filter工作在应用级别,拦截某个web应用请求

08b1200a4585496e98a08c964952573a.png

3635bb9b0a7c46a1997621631c00212c.png

acb7a18568bd41c1b4ded295aeee2060.png

d28296d8ebba41d5acc6c209df8c0538.png

3.2.3 engine管生命周期和分配请求

分配请求:映射mapper组件。根据url一层层找到对应的wrapper。

生命周期:负责容器创建、初始化、启动、销毁等。每个Container都继承了LifeCycle。所以也是个组合模式。

还用到了观察者模式(监听变更生命周期状态)、

组合模式(树结构即有父子关系)、

模板设计模式(写通用模板(通用逻辑),模板里面调用新方法,新方法走具体实现)

 

4 架构设计

  1. 罗列需求
  2. 面向对象设计类
  3. 找出需求中的变动点和不变点
  4. 变动点用抽象类,不变点用具体类实现

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 22:02:02       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 22:02:02       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 22:02:02       62 阅读
  4. Python语言-面向对象

    2024-07-11 22:02:02       72 阅读

热门阅读

  1. conda 重命名虚拟环境

    2024-07-11 22:02:02       22 阅读
  2. conda

    2024-07-11 22:02:02       20 阅读
  3. Facebook应用开发:认证与授权登录流程详解

    2024-07-11 22:02:02       23 阅读
  4. css中伪元素 :: before的用法

    2024-07-11 22:02:02       25 阅读