当前位置: 首页 > news >正文

tomcat源码分析大纲_Tomcat源码分析之Tomcat整体架构

3973472696f0a8ef17a187401efc905e.png

一、整体说明

tomcat需要完成两件事情:

  • 接受外部HTTP请求
  • 加载servlet,并且把请求传给Servlet进行处理。

整体可以抽象为如下:

b3090c9d919f36268779754c08437270.png

二、整体代码架构

在tomcat的代码中抽象了以下三个类:

  • Server类,代表tomcat实例
  • Connector类,代表HTTP监听器(上图中的HttpServer)
A "Connector" represents an endpoint by which requests are received          and responses are returned
    •   多个connector代表监听后处理模式不同,比如bio,nio等。
  • Container类,代表Servlet容器

另外还抽象了一个Service类,用来包装Connector和Container类。

A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level

其中

  • 一个Server可以有多个Service【实际应用场景中,一般来说只有一个】,
  • 一个Service可以对应多个Connector【实际应用场景中,一般来说只有一个】,
  • 一个Service对于一个Container。

整体代码架构如下:

其中

  • 一个Server可以有多个Service【实际应用场景中,一般来说只有一个】,
  • 一个Service可以对应多个Connector【实际应用场景中,一般来说只有一个】,
  • 一个Service对于一个Container。

整体代码架构如下:

97ea6df1fa735bf6be85b0ad8472a0cf.png

上图中Connector监听到请求后最终把HTTP(TCP)请求转换成了Servlet请求传给Container。

三、Service类分析

tomcat中Service类的实现类是StandardService类

Service接口核心代码

public interface Service  {

    public Engine getContainer();

    public void setContainer(Engine engine);

    public Server getServer();

    public void setServer(Server server);


    public void addConnector(Connector connector);

    public Connector[] findConnectors();

    public void removeConnector(Connector connector);
   
}

可以看到Service主要负责调度Connector和Container。

相关文章:

  • 清除sql server 2005日志
  • python 切割大文本的库_python切割大数据文件(文本)成多个小文件
  • 3 x 10的python表达式_part10-3 Python常见模块(正则表达式)
  • 可视化报表制作教程_聊聊大屏数据可视化
  • 塞尔达传说gba_《塞尔达传说》系列进化史 画面精美,探索内容更丰富
  • SQL SERVER DBCC命令解释
  • python 输出数据成行_python dataframe 输出结果整行显示的方法
  • python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...
  • SSIS:用foreach loop将一个目录下的内容导入到数据库中
  • 必须声明标量变量 @sum_level。_C++ Primer 笔记 - 变量
  • JAVA 中URL链接中文参数乱码的处理方法
  • 宝乐机器人集团作_「驰众机器人|情报」秦川集团起草的《机器人用精密摆线齿轮减速器》标准获发布...
  • java读取xml文件操作
  • 5ecsgo启动失败2错误代码2_Spring Boot 2.2 增加了一个新功能,启动飞起~
  • 现代科技概论_现代科技概论课程:力与运动3
  • [nginx文档翻译系列] 控制nginx
  • [译]CSS 居中(Center)方法大合集
  • co.js - 让异步代码同步化
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • HTML-表单
  • Java Agent 学习笔记
  • JAVA 学习IO流
  • Java深入 - 深入理解Java集合
  • js正则,这点儿就够用了
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • PHP的类修饰符与访问修饰符
  • REST架构的思考
  • Twitter赢在开放,三年创造奇迹
  • vue学习系列(二)vue-cli
  • 从零开始学习部署
  • 大型网站性能监测、分析与优化常见问题QA
  • 警报:线上事故之CountDownLatch的威力
  • 理清楚Vue的结构
  • 每天10道Java面试题,跟我走,offer有!
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 小程序开发之路(一)
  • 怎样选择前端框架
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (C语言)逆序输出字符串
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)c52学习之旅-流水LED灯
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .NET 8.0 中有哪些新的变化?
  • .Net Core 中间件验签
  • .NET Core跨平台微服务学习资源
  • .net 无限分类
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .py文件应该怎样打开?
  • @Autowired自动装配
  • [ C++ ] STL_vector -- 迭代器失效问题