Java架构直通车——理解Tomcat架构设计

2023-10-29

引入

Socket与SeverSocket

  • Socket

Socket是网络连接的一个端点。套接字使得一个应用可以从网络中读取和写入数据。放在两 个不同计算机上的两个应用可以通过连接发送和接受字节流。

在 Java 里边,套接字指的是java.net.Socket类。

public Socket (java.lang.String host, int port)

在这里插入图片描述


  • ServerSocket

ServerSocket 和 Socket 不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得一个连接请求,它创建一个 Socket 实例来与客户端进行通信
其中一个 ServerSocket 类的构造方法如下所示:

public ServerSocket(int port, int backLog, InetAddress bindingAddress);

服务器套接字的另一个重要的属性是 backlog,这是服务器套接字开始拒绝传入的请求之前,传入的连接请求的最大队列长度。

一个简单Web容器设计与实现

根据上述的基础,我们可以看到,我们只需要提供三个最基本的类,分别是:

  • Request - 表示请求,这里表示浏览器发起的HTTP请求
  • HttpServer - 表示处理请求的服务器,同时这里使用我们上面铺垫的ServerSocket
  • Reponse - 表示处理请求后的响应, 这里表示服务器对HTTP请求的响应结果

在这里插入图片描述
更复杂的实现,如果我们需要对于一个请求,有对应的Servlet来做处理,我们可以将组件设计成为这样:
在这里插入图片描述

理解Tomcat架构设计

什么是Servlet

一个Servlet主要做下面三件事情:

  • 创建并填充Request对象,包括:URI、参数、method、请求头信息、请求体信息等
  • 创建Response对象
  • 执行业务逻辑,将结果通过Response的输出流输出到客户端

Servlet没有main方法,所以,如果要执行,则需要在一个容器里面才能执行,这个容器就是为了支持Servlet的功能而存在,Tomcat其实就是一个Servlet容器的实现

Tomcat——Servlet容器

在这里插入图片描述

  • Server: 表示服务器,它提供了一种优雅的方式来启动和停止整个系统,不必单独启停连接器和容器;它是Tomcat构成的顶级构成元素,所有一切均包含在Server中;
  • Service: 表示服务,Server可以运行多个服务。比如一个Tomcat里面可运行订单服务、支付服务、用户服务等等;Server的实现类StandardServer可以包含一个到多个Services, Service的实现类为StandardService调用了容器(Container)接口,其实是调用了Servlet Engine(引擎),而且StandardService类中也指明了该Service归属的Server;
  • Container: 表示容器,可以看做Servlet容器;引擎(Engine)、主机(Host)、上下文(Context)和Wraper均继承自Container接口,所以它们都是容器。
  • Connector: 表示连接器, 它将Service和Container连接起来,首先它需要注册到一个Service,它的作用就是把来自客户端的请求转发到Container(容器),这就是它为什么称作连接器。它支持的协议有AJP协议、Http协议、Https协议。

所以,假设来自客户的请求为:http://localhost:8080/test/index.jsp 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector,它被处理的过程是这样的:

  1. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
  2. Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
  3. 对应的Host获得请求,匹配它所拥有的所有Context
  4. path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet
  5. Context 匹配到URL PATTERN为.jsp的servlet* ,对应于JspServlet类,构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
  6. 层层返回:Context把执行完了之后的HttpServletResponse对象返回给Host,Host把HttpServletResponse对象返回给Engine,Engine把HttpServletResponse对象返回给Connector,Connector把HttpServletResponse对象返回给客户browser

小知识:

Container容器按照责任链的设计模式,使用管道Pipeline和Value的方式来传递请求。

  • 当一个request过来的时候,需要对这个request做一系列的加工,使用责任链模式可以使每个加工组件化,减少耦合。也可以使用在当一个request过来的时候,需要找到合适的加工方式。当一个加工方式不适合这个request的时候,传递到下一个加工方法,该加工方式再尝试对request加工。
    在这里插入图片描述
  • 这很好记的解释了Java架构直通车——过滤器和拦截器使用一文中,过滤器的位置和运作方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java架构直通车——理解Tomcat架构设计 的相关文章

  • 新手如何在IEEE上发表论文?

    IEEE 也就是美国电子与电器工程师学 Institute of Electrical and Electronics Engineers 是一个国际性的电子技术与信息科学工程师的学术组织 其会员人数超过40万人 遍布160多个国家 是世界
  • Spring Boot配置MySQL多数据源

    1 导读 在日常开发中我们都是以单个数据库进行开发 在小型项目中是完全能够满足需求的 但是 当我们牵扯到像淘宝 京东这样的大型项目的时候 单个数据库就难以承受用户的CRUD操作 那么此时 我们就需要使用多个数据源进行读写分离的操作 这种方式

随机推荐

  • 最快速度求两个数组之交集算法与hash

    一个题目 该题目来自58同城的二面 用最快速度求两个数组之交集算法 比如A 6 2 4 1 B 2 9 4 3 那么A B 2 4 算法一 在大多数情况 也就是一般的情况下 大家都能想出最暴力的解法 通常也就是采用遍历或者枚举的办法来解决问
  • SpringBoot使用log

    目录 简介 实现步骤 1 在 pom xml 文件中添加 lombak 依赖 2 配置 application properties 日志设置 3 在要使用日志的类上直接添加 Slf4j 注解 然后就可以直接使用 log xxx 方法记录日
  • ABAP对excel的操作(为单元格设置公式)

    文章目录 前言 一 效果 二 代码 前言 给单元格设置公式 一 效果 运行程序 执行 excel效果 二 代码 代码如下 示例 Report ZDEMO EXCEL6
  • 编程职业的乐趣

    编程职业的乐趣 美酒的酿造需要年头 美食的烹饪需要时间 片刻等待 更多美味 更多享受 Good cooking takes time If you are made to wait it s to serve you better and
  • C语言 创建简单结构体输入学生基本信息

    结构体 include
  • VM虚拟机怎么安装mac os?(全教程)

    网络上教程很多 大多数是缺这缺那的 基本上不完整的 我试了很多次看了好多文档才安装成功 现在把我安装成功的过程写下来让更多的人知道如何在windows虚拟机上安装苹果的Mac os 让大家避免走不需要走的路 保姆级教程 此方法我在三台不同配
  • 使用支持向量机进行航线预测————附Matlab代码

    使用支持向量机进行航线预测 附Matlab代码 随着交通运输的发展 航空公司需要提高飞行的效率和安全性 而飞行航线的规划是保证飞行效率和安全性的关键因素之一 因此 利用机器学习算法来预测航线 成为了一个热门的话题 其中 支持向量机 Supp
  • 绕过圆括号过滤实现XSS弹框

    用data协议
  • 思科实验9.网络层:PPP协议配置

    PPP协议配置 基础知识 常用命令 实验流程 目的 1 设计拓扑 2 配置主机IP地址 3 配置路由器 4 设置PPP协议 5 验证主机连通 基础知识 PPP协议即点对点协议 是在点对点连接上传输多协议数据包提供了一个标准方法 是一种点到点
  • 算法进阶指南:0x18:双栈排序

    Tom 最近在研究一个有趣的排序问题 通过 2 个栈 S1 和 S2 Tom 希望借助以下 4 种操作实现将输入序列升序排序 操作 a 如果输入序列不为空 将第一个元素压入栈 S1 操作 b 如果栈 S1 不为空 将 S1 栈顶元素弹出至输
  • uboot下内存操作mw和md命令详解

    mw简介 u boot 中的 mw 命令是用于向内存写入数据的命令 它有4种形式 mw b 写入 1 个字节 8 比特 的数据 mw w 写入 1 个字 2 字节 16 比特 的数据 mw l 写入 1 个长字 4 字节 32 比特 的数据
  • Redis 学习笔记2:redis.conf配置文件详解

    Redis 的配置文件位于 Redis 安装目录下 文件名为 redis conf 参数说明 参数说明 redis conf 配置项说明如下 1 Redis默认不是以守护进程的方式运行 可以通过该配置项修改 使用yes启用守护进程 daem
  • 阻抗匹配之反射波形测量

    稍微接触过高速信号的朋友 一定对阻抗匹配和信号反射都有所了解 甚至可以按照公式 把反射波形一路推导出来 但是 纸上得来终绝浅 绝知此事要躬行 今天 我们就来实测一下信号反射波形 测试环境如下 信号发生器产生一个1 25MHz VPP 2V的
  • 数据库连接池(C++11实现)

    目的 因为对数据库的操作实质上是对磁盘的IO操作 所以如果对数据库访问次数过多 就会到导致大量的磁盘IO 为了提高MySQL数据库 基于C S设计 的访问瓶颈 除了在服务器端增加缓存服务器缓存常用的数据 之外 例如Redis 还可以增加连接
  • [POJ1088] 滑雪(递归dp)

    Description Michael喜欢滑雪百这并不奇怪 因为滑雪的确很刺激 可是为了获得速度 滑的区域必须向下倾斜 而且当你滑到坡底 你不得不再次走上坡或者等待升降机来载你 Michael想知道载一个区域中最长底滑坡 区域由一个二维数组
  • yolov5 6.0运行

    1 github下载yolov5 6 0代码 下载链接 2 利用Anaconda安装所需环境参考 如何配置pytorch 3 在pycharm打开文件并选择配置好的环境编译器 4 安装所需模块 利用作者提供的requirements txt
  • linux系统编程(七)进程

    文章目录 1 进程 1 1 进程相关概念 1 1 1 程序和进程 1 1 2 并发 1 1 3 单道程序设计 1 1 4 多道程序设计 1 1 5 CPU和MMU 1 1 6 进程控制块PCB 1 1 7 进程状态 1 2 环境变量 1 2
  • opencv条码(4)图像的flip之图形化界面

    flip函数可以实现图像反转 这里贴出mainwindow cpp的内容吧 书上的代码对应opencv2 2现在有些不能用了请注意 include mainwindow h include ui mainwindow h using nam
  • 华为OD机试 - 最小循环子数组(Java)

    题目描述 给定一个由若干整数组成的数组nums 请检查数组是否是由某个子数组重复循环拼接而成 请输出这个最小的子数组 输入描述 第一行输入数组中元素个数n 1 n 100000 第二行输入数组的数字序列nums 以空格分割 0 nums i
  • Java架构直通车——理解Tomcat架构设计

    文章目录 引入 Socket与SeverSocket 一个简单Web容器设计与实现 理解Tomcat架构设计 什么是Servlet Tomcat Servlet容器 引入 Socket与SeverSocket Socket Socket是网