您当前的位置:首页 >> 竞技
Tomcat源码分析之架构介绍及配置分析
发布时间:2019-05-13
 

在之前的项目中,需要对项目做集群,由于项目对系统的并发要求不大,所以就采取Session共享方式实现,虽然根据在网上找的资料完成了集群,但是对Tomcat的Session的共享的底层原理一直比较好奇,正好借此机会,调试一下Tomcat源码,略作分析。

  • bin

    存放启动和关闭Tomcat的脚本文件

  • conf

    存放Tomcat的各种配置文件

  • lib

    存放Tomcat的依赖jar包

  • logs

    存放Tomcat的日志文件

  • temp

    存放Tomcat运行中产生的临时文件

  • webapps

    web应用所在目录,即供外界访问的web资源的存放目录

  • work

    Tomcat的工作目录

1. conf/配置文件说明

1.1 catalina.properties

Tomcat的catalina.properties文件位于%CATALINA_HOME%/conf/目录下面,该文件主要配置tomcat的安全设置、类加载设置、不需要扫描的类设置、字符缓存设置四大块。

  • 安全设置

  • 类加载设置

    tomcat的类加载顺序为:

    Bootstrap ---> System ---> /WEB-INF/classes ---> /WEB-INF/lib/*.jar ---> Common

    注: Common的配置是通过catalina.properties的commons.loader设置的

    类加载顺序:

    ${catalina.base}/lib  未打包的类和资源文件

    ${catalina.base}/lib/*.jar  JAR文件

    ${catalina.home}/lib  未打包的类和文件

    ${catalina.home}/lib/*.jar  JAR文件

    默认情况下,会加载以下内容:

    注: CATALINA_HOME是Tomcat的安装目录,CATALINA_BASE是Tomcat的工作目录,一个Tomcat可以通过配置CATALINA_BASE来增加多个工作目录,也就是增加多个实例。多个实例各自可以有自己的conf,logs,temp,webapps。

    server.loader和shared.loader

    在common.loader加载完毕后,tomcat启动程序会检查catalina.properties文件中配置的server.loader和shared.loader是否设置。如果设置,读取tomcat下对应的server和shared这两个目录的类库。server和shared是对应tomcat目录下的两个目录,在Tomcat中默认是没有,catalina.properties中默认也是没有设置其值。设置方法如下:

    同时需要在tomcat目录下创建server和shared目录结构并将公用的、应用类放到里面。类加载顺序为:

    Bootstrap ---> System ---> /WEB-INF/classes ---> /WEB-INF/lib/*.jar ---> Common ---> Server ---> Shared

    • annotations-api.jar — JavaEE注释类

    • catalina.jar — 执行Tomcat的Catalina Servlet容器部分

    • catalina-ant.jar — Tomcat Catalina Ant 任务

    • catalina-ha.jar — 高可用包

    • catalina-tribes.jar — 组通信包

    • ecj-*.jar — Eclipse JDT Java 编译器

    • el-api.jar — EL 2.2 API.

    • jasper.jar — JSP 运行时编译器

    • jasper-el.jar — EL表达式的实现

    • jsp-api.jar — JSP 2.2 API.

    • servlet-api.jar — Servlet 3.0 API.

    • tomcat-api.jar — 由Tomcat定义的几个接口

    • tomcat-coyote.jar — Tomcat连接器和使用程序类

    • tomcat-dbcp.jar — 基于Apache Commons Pool和Apache Commons DBCP的数据库连接池

    • tomcat-i18n-*.jar* — 包含其他语言的资源约束的可选JAR,默认捆绑包含在每个单独的应用中,如果不需要国际化,可以删除

    • tomcat-jdbc.jar — Tomcat JDBC数据库连接池

    • tomcat-util.jar — Tomcat的各种组件使用的常见类

    • tomcat7-websocket.jar — WebSocket 1.1 实现

    • websocket-api.jar — WebSocket 1.1 API

  • 字符缓存设置

总结: Tomcat可以通过catalina.properties的server和shared,为webapp提供公用类库。使一些公用的、不需要与webapp放在一起的设置信息单独保存,在更新webapp的war的时候无需更改webapp的设置。

1.2 catalina.policy

包含由Java Security Manager实现的安全策略声明,它替换了安装java时带有的java.policy文件。这个文件用来防止欺骗代码或JSP执行带有像System.exit(0)这样可能影响容器的破坏性代码,只有当Tomcat用-security命令行参数启动时这个文件才会被使用。

1.3 context.xml

这个通用context.xml可被所有的web应用程序使用,这个文件默认地可以设置到何处访问各web应用程序中的web.xml文件。context.xml文件的作用和server.xml中<Context>标签作用相同。在tomcat5.5之后,对Context的配置不推荐在server.xml中进行配置,而是在/conf/context.xml中进行独立的配置。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。

默认的context.xml如下:

以下给出一个JNDI数据源的配置:

context.xml的作用范围

  • tomcat server级别

    在/conf/context.xml里配置

  • Host级别

    在/conf/Catalina/${hostName}里添加context.xml,继而进行配置。

  • web app级别

    在/conf/Catalina/${hostName}里添加${webappName}.xml,继而进行配置。

1.4 server.xml

tomcat的主要配置文件,解析器用这个文件在启动时根据规范创建容器。

默认的server.xml如下: