tomcat架构分析之Valve机制

Tomcat架构及运行原理之基本架构 目录 一、Tomcat架构 1.基本架构图 2.核心组件架构图 3.Container内部流程架构图 二、主要类组成 1.基本架构类图 2.模块功能实现类图 三、源码分析 一、Tomcat架构 研究Tomcat的架构以及流程是基于Springboot内嵌的Tomcat进行的,Springboot版本为2.1.6.RELEASE,内嵌的Tomcat版本为9.0。 1.基本架构图 基本架构图如下: 可以把这个架构图大致分为六个部分: Tomcat服务器本身:开发者接触的部分,包括... 阅读详情
关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了。在每个容器对象里面都有一个pipeline及valve模块。它们是容器类必须具有的模块。在容器对象生成时自动产生。Pipeline就像是每个容器的逻辑总线。在pipeline上按照配置的顺序,加载各个valve。通过pipeline完成各个valve之间的调用,各个valve实现具体的应用逻辑。 
先看一下pipeline及valve的逻辑概念图。 

这些valve就是在tomcat的server.xml中配置,只要满足一定条件,继承ValveBase基类 
引用
org.apache.catalina.valves.ValveBase

就可以在不同的容器中配置,然后在消息流中被逐一调用。每个容器的valve的作用域不一样,在总体结构中已有说明。这里红色标记的是配置的自定义的valve,这样可以扩展成多个其他应用,例如cluster应用等。 
Tomcat实现  

Tomcat提供了Pipeline的标准实现: 
引用
org.apache.catalina.core.StandardPipeline


四大容器类StandardEngine,StandardHost,StandardContext及StandardWrapper都有各自缺省的标准valve实现。它们分别是 
  • Engine:org.apache.catalina.core.StandardEngineValve
  • Host: org.apache.catalina.core.StandardHostValve
  • Context:org.apache.catalina.core.StandardContextValve
  • Wrapper:org.apache.catalina.core.StandardWrapperValve

容器类生成对象时,都会生成一个pipeline对象,同时,生成一个缺省的valve实现,并将这个标准的valve对象绑定在其pipeline对象上。以StandardHost类为例: 
Java代码    收藏代码
  1. public class StandardHost extends ContainerBase implements Host {   
  2.   
  3.   protected Pipeline pipeline = new StandardPipeline(this);   
  4.   public StandardHost() {   
  5.     super();   
  6.     pipeline.setBasic(new StandardHostValve());   
  7.   }   
  8.   
  9. }  

Valve实现了具体业务逻辑单元。可以定制化valve(实现特定接口),然后配置在server.xml里。每层容器都可以配置相应的valve,当只在其作用域内有效。例如engine容器里的valve只对其包含的所有host里的应用有效。定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推。 
配置的例子有: 
Xml代码    收藏代码
  1. <Engine name=“Catalina” defaultHost=“localhost”>  
  2.   <Valve className=“MyValve0”/>  
  3.   <Valve className=“MyValve1”/>  
  4.   <Valve className=“MyValve2”/>  
  5.    ……  
  6.   <Host name=“localhost”  appBase=“webapps”>  
  7.   </Host>  
  8. </Engine>  

当在server.xml文件中配置了一个定制化valve时,会调用pipeline对象的addValve方法,将valve以链表方式组织起来,看一下代码; 
Java代码    收藏代码
  1. public class StandardPipeline implements Pipeline, Contained, Lifecycle{   
  2.   
  3.   protected Valve first = null;   
  4.   
  5.   public void addValve(Valve valve) {   
  6.   
  7.     // Validate that we can add this Valve   
  8.     if (valve instanceof Contained)   
  9.        ((Contained) valve).setContainer(this.container);   
  10.   
  11.     // Start the new component if necessary   
  12.     if (started) {   
  13.        if (valve instanceof Lifecycle) {   
  14.          try {   
  15.            ((Lifecycle) valve).start();   
  16.          } catch (LifecycleException e) {   
  17.            log.error(”StandardPipeline.addValve: start: ”, e);   
  18.          }   
  19.        }   
  20.        // Register the newly added valve   
  21.        registerValve(valve);   
  22.      }   
  23.   
  24.      // 将配置的valve添加到链表中,并且每个容器的标准valve在链表的尾端  
  25.      if (first == null) {   
  26.         first = valve;   
  27.         valve.setNext(basic);   
  28.      } else {   
  29.         Valve current = first;   
  30.         while (current != null) {   
  31.           if (current.getNext() == basic) {   
  32.              current.setNext(valve);   
  33.              valve.setNext(basic);   
  34.              break;   
  35.           }   
  36.           current = current.getNext();   
  37.         }   
  38.      }  
  39.   }   
  40. }  

从上面可以清楚的看出,valve按照容器作用域的配置顺序来组织valve,每个valve都设置了指向下一个valve的next引用。同时,每个容器缺省的标准valve都存在于valve链表尾端,这就意味着,在每个pipeline中,缺省的标准valve都是按顺序,最后被调用。 
消息流  
先看一下四大容器的标准valve的调用逻辑图。从中可以梳理出标准valve的逻辑。注意此图只是在缺省配置下的状态,也就是说每个pipeline只包含一个标准valve的情况。 
 
图中显示的是各个容器默认的valve之间的实际调用情况。从StandardEngineValve开始,一直到StandardWrapperValve,完成整个消息处理过程。注意每一个上层的valve都是在调用下一层的valve返回后再返回的,这样每个上层valve不仅具有request对象,同时还能拿到response对象,想象一下,这样是不是可以批量的做很多东西?
Tomcat中定制阀门 我们说管道机制给我们带来了更好的扩展性,Tomcat中在扩展性方面具体如何体现,这便是本节讨论的内容。从上节了解到基础阀门是必须执行的,假如你需要一个额外的逻辑处理阀门,可以添加一个非基础阀门。 我的需求是对每个请求访问进行IP记录,打印到日志里面,详细操作如下: ① 自定义一个阀门PrintIPValve,只要继承ValveBase并重写invoke方法即可,ValveBase是Tomcat 阅读详情

相关推荐

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜索“什么是 AI?”会得到数百万条结果,包括不同程度的技术和相关信息。那么,对工程师而言,AI 意味着什么?人们对 AI 的关注主要集中在 AI 模型上,受此影响,工程师会迅速投入 AI 建模的研究。

r1832644594的博客 2817

tomcat 服务限制IP的设置

在context.xml文件中加上如下代码    allow="127.0.0.1(允许访问的ip)" deny="192.168.1.1(拒绝访问的ip)"/>org.apache.catalina.valves.RemoteAddrValve 过滤的是ip地址org.apache.catalina.valves.RemoteHostValve 过滤的是主机名如果

yaa2004的专栏 648

Java判断地图坐标(经度,纬度)是否在多边形区域或圆形区域内

​欢迎光临我的博客查看最新文章:在地图上,可以使用经纬度确定一个位置,如上海体育场(121.449391,31.188228),如果知道了2个地点的经纬度,我们就能在地图上找到其位置及2点的距离,百度地图或高德地图提供了相应的服务;如果将多个坐标点连成多边形区域,如何判断某个坐标点是否在多边形区域内,如下工具类。

river106的博客 3943

Tomcat 阀简介

Tomcat阀可以加入到3种Catalina容器中,它们是Engine、Host和Context。容器描述Engine可以预处理该Engine接收到的所有HTTP请求Host可以预处理该Host接收到的所有HTTP请求Context可以预处理该Context接收到的所有HTTP请求所有的Tomcat阀都实现了org.apache.Catalina.Valve接口或扩展了org.apache.Catalina.valves.ValveBase类。

weixin_43882265的博客 1022

当预编译包失效时:手把手教你在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu

本文详细指导在Nvidia Orin (JetPack 5.1.1) 上源码编译onnxruntime-gpu的全流程,解决预编译包兼容性问题。涵盖环境准备、工具链配置、源码编译、常见问题解决及性能优化技巧,帮助开发者在边缘计算设备上实现高效AI模型推理。

weixin_29062823的博客 135

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

tomcat架构分析(valve机制)

[b][size=medium]出处:[url=http://gearever.iteye.com]http://gearever.iteye.com[/url][/size][/b] 关于tomcat的内部逻辑单元的存储空间已经在相关容器类的blog里阐述了。在每个容器对象里面都有一个pipeline及valve模块。它们是容器类必须具有的模块。在容器对象生成时自动产生。Pipeline就...

Gearever 589

飞控芯片的隐形战场:传感器冗余与实时OS的可靠性革命

本文深入探讨飞控芯片在工业级无人机中的可靠性设计,聚焦传感器冗余架构与实时操作系统(RTOS)的容错机制。通过多IMU备份、自适应加权融合算法及NuttX、ChibiOS等RTOS的故障隔离技术,确保系统在极端环境下毫秒级自愈。文章还涵盖开源生态如PX4的跨平台移植及RISC-V架构的应用,为高可靠性飞控系统提供关键技术参考。

z5a6b的博客 877

tomcat的valve_Tomcat的Valve,过滤器的替代品

tomcat的valve 在本文中,我将向您展示如何用Tomcat中的非干扰性机制替换web.xml中声明的过滤器。 我是Apache Tomcat的好朋友。 在许多情况下,甚至企业应用程序也可以使用简单的JSP运行-servlet容器,并且Tomcat经历了所有标准的飞跃发展。 这并不是说其他​​容器是不好的(例如,Jetty,非常擅长嵌入),只是我对Tomcat足够了解,知道它是稳定的,...

dlz00001的博客 435

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1499

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程

📢本篇将介绍SARADC的源码分析和工作流程。

内核笔记 3231

tomcat架构分析(valve源码导读)

出处:http://gearever.iteye.com  源码面前,了无秘密                               ----侯捷  在tomcat架构分析(valve机制)(http://gearever.iteye.com/blog/1536022)里已经对valve的机制做了分析。现在通过源码来加深下理解。侯捷说过,源码面前,了无秘密。通过这些代码,可以看到在

wjacketcn的专栏 603

MIKE水动力笔记8_冷启动与热启动

在【MIKE水动力笔记5_建立水动力模型】中,讲到【Step 2 设置模型参数】中的【Initial Conditions】时,提到了冷启动与热启动。本博文就详细讲解何为冷启动、热启动,并通过一个案例具体分析两者不同。...

晏长街的博客 6568

深入理解 Tomcat Pipeline 与 Valve 原理

Pipeline/Valve 是 Tomcat 实现责任链模式的基础设施,实现了请求处理的链式分发与横向增强。主流程:链式传递 → 逐个调用 → 终点分发 → 灵活插拔。设计精髓:责任链模式、分层独立、横向扩展、可插拔管理。调优方向:精简链路、合理排序、分层插拔、日志监控配合。集成与演进:云原生、Spring Boot、自动化运维天然适配。高阶能力:自定义扩展、动态管理、热插拔、自动化治理。全流程速查口诀链式传递,插拔灵活,分层增强,横向扩展。责任链传递,终点分发,灵活插拔,易于增强。

IT技术学习与工作笔记分享 1054

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【Tomcat】 Connector架构分析

文章目录1. Tomcat顶层架构2. Tomcat顶层架构小结3. Connector和Container的微妙关系3.1 Connector架构分析3.2 Container架构分析3.2.1 Container如何处理请求的4. 总结 1. Tomcat顶层架构 俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat 最核心的模块,问题才可以游刃而解,了解了 T

m0_45406092的博客 631

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Tomcat系统架构

一、Tomcat顶层架构 先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。 Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下: 1...

Baron_ND的博客 183

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Tomcat架构分析之Container容器
下一篇: Tomcat源码分析之Connector
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值