Tomcat请求处理在源码中的轮转解析

 更新时间:2023年08月30日 11:42:11   作者:汤卜  
这篇文章主要为大家介绍了Tomcat请求处理在源码中的轮转解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Tomcat基础架构

Tomcat作为Java开发者接触过最重要的web容器,在启动和处理请求过程中做了海量的事情,初级开发者很少关心,使用SpringMvc之类上层框架一带而过,然而这些部分是Java和网络集大成之作,笔者要带着大家走一遍一次请求,加深tomcat的认知。最好先调试好Tomcat源码

BootStrap和Catalina

BootStrap

BootStrap就是Tomcat的main函数所在位置,在使用过程中执行脚本catlina.sh或者bat文件即可执行java命令并调用BootStrap的main函数实现tomcat的启动

public static void main(String args[]) {
 if (daemon == null) {
                // Don't set daemon until init() has completed
                Bootstrap bootstrap = new Bootstrap();
                try {
                    bootstrap.init();
                } catch (Throwable t) {
                    handleThrowable(t);
                    t.printStackTrace();
                    return;
                }
                daemon = bootstrap;
            } else {
                // When running as a service the call to stop will be on a new
                // thread so make sure the correct class loader is used to
                // prevent a range of class not found exceptions.
                Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
            }
......
}

Catalina

BootStrap是服务器的入口, 会通过start、stop、stopServer、stopServer等反射调用Catalina的对应方法

public void stopServer() throws Exception {
        Method method =
            catalinaDaemon.getClass().getMethod("stopServer", (Class []) null);
        method.invoke(catalinaDaemon, (Object []) null);
    }

Tomcat的核心配置文件server.xml

先来看一下tomcat的容器结构

tomcat容器有多层,Server、service、Engine、Host、Context等,图中有省略
比如一个名称为mytomcat的web项目,对应到Container部分,Context名称就是mytomcat
再看一下Tomcat的配置文件server.xml

<Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <Listener SSLEngine="on"
        className="org.apache.catalina.core.AprLifecycleListener" />
    <Listener className="org.apache.catalina.core.JasperListener" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
    <GlobalNamingResources>
        <Resource auth="Container" description="User database that can be updated and saved"
            factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase"
            pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />
    </GlobalNamingResources>
    <Service name="Catalina">
        <Connector URIEncoding="UTF-8" connectionTimeout="20000"
            port="80" protocol="HTTP/1.1" redirectPort="8443" />
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
        <Engine defaultHost="localhost" name="Catalina">
            <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                    resourceName="UserDatabase" />
            </Realm>
            <Host appBase="webapps" autoDeploy="true" name="localhost"
                unpackWARs="true">
                <Valve className="org.apache.catalina.valves.AccessLogValve"
                    directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log."
                    suffix=".txt" />
            </Host>
        </Engine>
    </Service>

在启动tomcat的时候,catalina的load方法,会读取server.xml文件的内容,通过Digester组件把server.xml解析成Server对象,并且把Server变成Catalina的成员变量。

我们看一下catalina的load方法中digester.parse()方法执行后的容器代码结构

这样的话,Tomcat的容器的层级结构就建立起来了。

网络处理部分

Connector

tomcat可以处理多种协议,统一使用Connector组件来实现,在tomcat中一个Service可以对应多个Connector

ProtocolHandler

connector中有个很重要的成员变量protocolHandler, 用来实现多种协议的解析,

比如http协议。基于tcp做集群的AJP协议

Endpoint

AbstractEndpoint是Tcp的处理入口,并且持有Executor;Connector的executor和ProtocolHandler的线程池都是使用这个executor
当有网络任务到来的时候,tomcat会使用这个线程池来处理socket事件

Acceptor 和 Poller

Acceptor是封装新连接的任务,Endpoint使用单独的线程维护 Poller 是java NIO中Selector的封装,当新连接到来时唤醒Acceptor线程注册pollerEvent事件来监听连接

Poller的实现是java的Selector

以上就是Tomcat请求处理在源码中的轮转解析的详细内容,更多关于Tomcat请求处理的资料请关注脚本之家其它相关文章!

相关文章

  • nginx修改默认运行80端口的方法

    nginx修改默认运行80端口的方法

    这篇文章主要给大家介绍了关于nginx是如何修改默认运行80端口的方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • ngin配置301重定向设置方法和nginx子目录301重定向

    ngin配置301重定向设置方法和nginx子目录301重定向

    这篇文章主要介绍了ngin配置301重定向设置方法和nginx子目录301重定向,需要的朋友可以参考下
    2014-04-04
  • nginx+apache+mysql+php+memcached+squid搭建集群web环境

    nginx+apache+mysql+php+memcached+squid搭建集群web环境

    当前,LAMP开发模式是WEB开发的首选,如何搭建一个高效、可靠、稳定的WEB服务器一直是个热门主题,本文就是这个主题的一次尝试。
    2011-03-03
  • NGINX报错413 Request Entity Too Large的问题解决

    NGINX报错413 Request Entity Too Large的问题解决

    Nginx 413错误表示请求实体太大,本文主要介绍了NGINX报错413 Request Entity Too Large的问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • nginx禁止某个IP访问站点的设置方法

    nginx禁止某个IP访问站点的设置方法

    近期发现博客遭到某些人的恶意灌水,频繁地利用发帖机器人发表评论,给博客的管理带来诸多不便,搜索了一下资料,可以利用nginx的ngx_http_access_module 模块设置允许/禁止哪些ip或ip段访问站点。
    2010-12-12
  • 图文详解Nginx版本平滑升级方案

    图文详解Nginx版本平滑升级方案

    Nginx平滑升级就是指在不停止业务的前提下,实现对Nginx软件版本的升级,下面这篇文章主要给大家介绍了关于Nginx版本平滑升级方案的相关资料,需要的朋友可以参考下
    2021-09-09
  • Nginx的流式响应配置小结

    Nginx的流式响应配置小结

    Nginx的流式响应功能是一项非常实用的特性,它允许Nginx在接收后端服务器响应的同时,逐步将内容发送给客户端,本文主要介绍了Nginx的流式响应配置,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • nginx http响应限速的具体实现

    nginx http响应限速的具体实现

    本文主要介绍了nginx http响应限速的具体实现,可以使用limite_rate和limit_rate_after来限制HTTP响应的速度,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Nginx反向代理后端接口解决跨域冲突、预检报错问题全流程

    Nginx反向代理后端接口解决跨域冲突、预检报错问题全流程

    本文详细记录了作者如何通过Nginx配置优化,解决多域名访问后端接口、Nginx反向代理及后端自带跨域配置导致的跨域问题,主要内容包括分析问题根源、屏蔽后端跨域头、配置多域名白名单、拦截OPTIONS预检请求、常规接口统一附加跨域头,并提供了完整的Nginx配置示例
    2026-04-04
  • Nginx Rewrite及Location的使用与区别

    Nginx Rewrite及Location的使用与区别

    rewrite和location的功能有点相像,都能实现跳转,本文主要介绍了Nginx Rewrite及Location的使用与区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08

最新评论