面试被问Tomcat整体架构设计,我哭的像个孩子

作者丨JavaGuide

最近在研究 Tomcat ,感觉整体设计确实值得学习。今天先分享一篇文章带大家简单看看。后面,参考 Tomcat 整体设计自己争取能够手写一个轻量的 web 服务器。

使用 golang 语言 实现一个 http server,只需几行代码即可,为何用 java 实现如何“沉重”呢?这背后 Tomcat 是一个什么角色呢?

package main
import (
    "io"
    "net/http"
)
func helloHandler(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "hello, world!\n")
}
func main() {
    http.HandleFunc("/", helloHandler)
    http.ListenAndServe(":12345", nil)
}

Tomcat 是一个 Servlet 容器?

单纯的思考一下这句话,我们可以抽象出来这么一段代码:

class Tomcat {
    List sers;
}

如果 Tomcat 就长这样,那么它肯定是不能工作的,所以,Tomcat 其实是这样:

class Tomcat {
    Connector connector; // 连接处理器
    List sers;
}

Servlet 规范与 Tomcat 实现

面试被问Tomcat整体架构设计,我哭的像个孩子_第1张图片

绿色的类定义 在 servlet-api 包中,其它类除自定义外在 Tomcat 包中

整体架构

Tomcat 要实现 2 个核心功能:

  1. 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。
  2. 加载和管理 Servlet,以及具体处理 Request 请求。
面试被问Tomcat整体架构设计,我哭的像个孩子_第2张图片

从图上可以看到,最顶层是 Server,这里的 Server 指的就是一个 Tomcat 实例。一个 Server 中有一个或者多个 Service,一个 Service 中有多个连接器和一个容器。

Tomcat 的功能简单说就是让 一堆 class 文件+web.xml 可以对外支持 http

面试被问Tomcat整体架构设计,我哭的像个孩子_第3张图片
面试被问Tomcat整体架构设计,我哭的像个孩子_第4张图片

启动过程

Tomcat 独立部署的模式下,我们通过 startup 脚本来启动 Tomcat,Tomcat 中的 BootstrapCatalina 会负责初始化类加载器,并解析 server.xml 和启动这些组件。

/usr/java/jdk1.8.0_191/bin/java -Dxx -Xxx org.apache.catalina.startup.Bootstrap start
面试被问Tomcat整体架构设计,我哭的像个孩子_第5张图片

分别启动连接管理部分和业务处理部分

面试被问Tomcat整体架构设计,我哭的像个孩子_第6张图片

业务处理部分中,各个类的关系 在 Tomcat server.xml 中体现的也非常直观


    
    
        
        
    
    
        
        
        
            
                    

你可能感兴趣的:(面试被问Tomcat整体架构设计,我哭的像个孩子)