深度解析Tomcat Host组件

发布于:2025-08-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

第1章:Tomcat容器体系概览

Tomcat作为Java EE规范下的轻量级Servlet容器,其架构设计高度模块化,核心思想是基于Container接口体系构建的分层组件模型。理解Tomcat的容器体系对于深入分析Host组件至关重要。

1.1 容器层级结构

Tomcat的核心容器体系包含四个主要接口:

层级 接口 描述
Engine Engine 服务器顶层容器,负责管理虚拟主机(Host),通常绑定一个端口
Host Host 虚拟主机容器,管理一个域名下的多个Web应用(Context)
Context Context 单个Web应用容器,负责Servlet、Filter、Listener的生命周期
Wrapper Wrapper 最底层Servlet容器,包装单个Servlet实例,处理请求调用

图示:Tomcat容器层级关系

Engine
├── Host (虚拟主机)
│   ├── Context (Web应用)
│   │   └── Wrapper (单个Servlet)
│   └── Context ...
└── Host ...

每个容器都实现了Container接口,提供生命周期管理、子容器管理及请求分发能力。PipelineValve机制则提供可插拔的请求处理链。

1.2 Pipeline & Valve

每个Container都可绑定一个Pipeline对象,Pipeline中串联多个Valve组件:

  • Valve:类似拦截器,可以在请求到达实际Servlet前执行逻辑,如安全认证、访问日志记录、流量统计等。

  • Pipeline:负责管理多个Valve的执行顺序,并最终调用底层子容器处理请求。

    // 请求处理流程示意
    public void invoke(Request request, Response response) {
        pipeline.getFirst().invoke(request, response); // 依次触发Valve链
        wrapper.invoke(request, response);            // 最终到达Servlet
    }
    

1.3 Engine与Host的角色

  • Engine:绑定端口(如8080),是Tomcat实例的入口,负责域名路由和虚拟主机选择。

  • Host:虚拟主机容器,每个Host可绑定一个或多个域名,实现多域名隔离、JSP编译配置及Host级安全控制。

1.4 Request路由概览

当HTTP请求进入Tomcat时,流程如下:

  1. Connector接收Socket请求,将其封装为Request对象。

  2. Engine根据请求的Host头匹配对应的Host容器。

  3. Host根据请求路径选择Context(Web应用)。

  4. Context根据请求路径匹配对应的Wrapper(Servlet)。

  5. 请求沿Pipeline链执行各级Valve逻辑,最终到达目标Servlet。

这一分层设计保证了Tomcat高可扩展性,也为Host组件提供了灵活的虚拟主机管理能力。

第2章:Host组件核心功能详解

在Tomcat容器体系中,Host虚拟主机管理容器,负责承载一个域名下的多个Web应用(Context)。理解Host的设计对多虚拟主机部署、请求分发和Host级安全策略配置至关重要。

2.1 Host的定位与职责

Host接口定义在org.apache.catalina.Host中,核心职责包括:

  1. 虚拟主机管理
    Host可以绑定一个或多个域名,实现多域名隔离。例如:

    • www.example.com → Host A

    • admin.example.com → Host B

  2. Web应用管理
    Host容器下可部署多个Context,每个Context对应一个Web应用。

  3. 请求路由
    当Engine匹配到Host后,Host负责进一步根据请求路径路由到具体Context,然后最终到Wrapper(Servlet)。

  4. Host级生命周期管理
    Host可以独立启动、停止和销毁,为每个Host提供独立的配置隔离。

  5. Host级资源绑定
    Host可绑定JNDI资源、Realm安全策略,提供Web应用共享或隔离的资源访问环境。

2.2 StandardHost类概览

Tomcat中StandardHost是Host接口的主要实现类,位于org.apache.catalina.core.StandardHost(Tomcat 9.0.x):

public class StandardHost extends ContainerBase implements Host {
    // #L120 属性定义
    protected String name;       // Host名
    protected boolean autoDeploy;
    protected boolean deployOnStartup;
    protected Mapper mapper;     // 请求映射器
    protected HostConfig config; // Host配置器
    ...
}

2.2.1 主要属性解析

属性 作用
name Host名称,对应server.xml中的<Host name="...">
autoDeploy 是否启用自动部署Context
deployOnStartup 是否在Host启动时部署所有应用
mapper Host级Mapper,用于请求URL到Context的匹配
config HostConfig对象,负责部署Context和监听Host变化

2.2.2 StandardHost核心方法

  • startInternal():启动Host,初始化Mapper、HostConfig并加载Context(源码分析见2.3)

  • addChild(Container child):添加Context子容器

  • map(String uri):通过Mapper匹配请求到具体Context/Wrapper

  • findMapper(String protocol):获取Host的请求映射器

2.3 Host启动流程:startInternal方法分析

StandardHost.startInternal()方法是Host启动的核心入口(源码:StandardHost.java#L876),执行流程如下:

@Override
protected synchronized void startInternal() throws LifecycleException {
    // L878 初始化基础
    super.startInternal();
    if (mapper == null) {
        mapper = createMapper(); // 初始化Host级Mapper
        mapper.setContainer(this);
    }

    // L888 启动HostConfig组件
    if (config == null) {
        config = createHostConfig();
        config.setHost(this);
        config.lifecycleStart();
    }

    // L897 部署应用
    if (deployOnStartup) {
        config.deployApps();
    }

    // L904 设置Host状态为STARTED
    setState(LifecycleState.STARTED);
}

2.3.1 流程解析

  1. 基础初始化
    调用父类ContainerBase.startInternal(),初始化子容器列表和Pipeline。

  2. Mapper初始化
    Mapper是Host级请求路由核心,负责将请求URI映射到Context/Wrapper。

  3. HostConfig启动
    HostConfig监听conf/Catalina/<host>目录的变化,支持应用的热部署和自动重载。

  4. 应用部署
    如果deployOnStartup=true,则调用HostConfig.deployApps()扫描appBase目录,部署所有Web应用。

  5. 状态更新
    最后将Host状态标记为STARTED,Tomcat才能正常处理请求。

2.4 Mapper组件与Host的请求路由

Mapper是Host处理请求的关键组件,它通过Host名和URI路径确定请求目标Context。核心方法:

@Override
public Container map(Request request, boolean update) {
    String hostName = request.getServerName();
    Host host = (Host) container;
    Context context = host.findChild(getContextName(hostName, request.getRequestURI()));
    return context;
}

2.4.1 匹配逻辑

  1. 域名匹配
    Mapper根据Host绑定的域名匹配请求头中的Host字段。

  2. Context路径匹配
    根据请求URI选择最合适的Context。

  3. Wrapper分派
    最终Context再将请求交给Wrapper(Servlet实例)处理。

通过这种分层匹配,Tomcat支持多虚拟主机与多Web应用的共存。

2.5 HostConfig部署机制概览

HostConfig是Host的部署管理器,主要职责:

  1. 扫描appBase目录
    自动发现WAR文件或Context目录。

  2. 部署Context
    调用Host.addChild()将Context注册到Host。

  3. 监听文件变更
    实现热部署和自动重载。

    // 部署应用示意
    public void deployApps() {
        File appBaseDir = new File(host.getAppBase());
        for (File app : appBaseDir.listFiles()) {
            if (app.isDirectory() || app.getName().endsWith(".war")) {
                deploy(app);
            }
        }
    }
    

2.6 Host级Pipeline与Valve

Host可以绑定Valve实现Host级请求拦截:

Host host = ...;
host.getPipeline().addValve(new AccessLogValve());
host.getPipeline().addValve(new SecurityValve());
  • 作用范围:拦截所有通过该Host的请求

  • 典型用途:访问日志、IP白名单、认证校验

  • 与Context Valve的关系:Host Valve先执行,Context Valve后执行,形成分层链路。

2.7 Host与JNDI资源绑定

Host可以绑定JNDI资源,供其下所有Context共享:

<Host name="example.com" appBase="webapps">
    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"
              driverClassName="com.mysql.cj.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/testdb"
              username="root" password="1234" maxTotal="20"/>
</Host>
  • 通过InitialContext获取资源:

    Context ctx = new InitialContext();
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
    

2.8 小结

  • Host是Tomcat虚拟主机核心容器,负责Context管理、请求分发、Host级资源绑定。

  • StandardHost类通过startInternal()方法实现启动初始化,并配合Mapper完成请求路由。

  • HostConfig负责应用部署和自动重载,是Host自动化运维能力的核心。

  • Host级Pipeline与Valve提供了请求拦截能力,为日志、认证、限流提供统一入口。

第3章:Host生命周期管理

Tomcat的Host不仅负责虚拟主机和Web应用管理,同时也是独立生命周期的容器单元。深入理解Host的生命周期对于部署监控、故障排查和性能优化至关重要。


3.1 生命周期概述

Host的生命周期由Lifecycle接口管理,核心阶段包括:

生命周期状态 描述
NEW 容器创建,尚未初始化
INITIALIZING 初始化配置,如Mapper、Pipeline、Valve等
STARTING 启动Host及其子容器(Context/Wrapper)
STARTED Host完全启动,可处理请求
STOPPING 停止请求处理,准备销毁资源
STOPPED 完全停止,资源释放完成
DESTROYING Host被销毁,不再可用

Host的生命周期严格遵循Tomcat Lifecycle接口定义,所有状态变化都会触发LifecycleEvent事件,供监听器(如HostConfig)处理。


3.2 Host启动流程(startInternal)

StandardHost.startInternal()是启动入口(源码:StandardHost.java#L876)。流程细化如下:

protected synchronized void startInternal() throws LifecycleException {
    super.startInternal(); // L878 初始化基础容器
    initMapper();          // L881 初始化Mapper
    initPipeline();        // L885 初始化Pipeline
    initHostConfig();      // L888 初始化HostConfig
    if (deployOnStartup) {
        config.deployApps(); // L897 部署应用
    }
    setState(LifecycleState.STARTED); // L904 设置状态
}

3.2.1 初始化Mapper

  • Mapper负责Host级请求路由

    • 匹配Host名 → Context路径 → Wrapper

    • 支持多协议(HTTP/HTTPS)

  • 典型源码:

    protected Mapper createMapper() {
        Mapper mapper = new Mapper();
        mapper.setContainer(this);
        mapper.setProtocol("http");
        return mapper;
    }
    

3.2.2 Pipeline初始化

  • Host可绑定多级Valve:

    • Host级Valve先执行 → Context级Valve → Wrapper级Valve

  • 管道顺序确保Host全局策略优先,例如安全认证、访问日志。

3.2.3 HostConfig初始化与应用部署

  • HostConfig监听appBase目录,管理Context自动部署:

    HostConfig config = new HostConfig();
    config.setHost(this);
    config.lifecycleStart();
    

  • deployApps()扫描WAR包或目录:

    1. 检查web.xml和Context配置

    2. 创建Context实例(StandardContext

    3. 调用Host.addChild()注册到Host


3.3 Context子容器生命周期交互

Host启动不仅仅是自身状态切换,还需要管理所有Context子容器的生命周期:

  1. 启动阶段

    • Host启动后,会逐个启动子Context

    • 调用Context.startInternal(),初始化Servlet、Filter和Listener

  2. 停止阶段

    • Host停止时,先停止子Context

    • 调用Context.stopInternal(),销毁Servlet实例并释放资源

  3. 异常处理

    • 如果子Context启动失败,不影响Host其他Context

    • 通过日志记录失败信息,便于排查部署问题

      for (Container child : findChildren()) {
          try {
              child.start();
          } catch (LifecycleException e) {
              log.error("Context启动失败: " + child.getName(), e);
          }
      }
      


3.4 Host停止与销毁流程

3.4.1 stopInternal方法

StandardHost.stopInternal()负责Host停止:

protected synchronized void stopInternal() throws LifecycleException {
    setState(LifecycleState.STOPPING); // L950
    for (Container child : findChildren()) {
        child.stop(); // 停止所有Context
    }
    if (config != null) {
        config.lifecycleStop(); // 停止HostConfig
    }
    setState(LifecycleState.STOPPED); // L962
}
  • 顺序重要

    1. 先停止子容器 → 确保Servlet不再接收请求

    2. 停止HostConfig → 释放监控和自动部署资源

    3. 更新Host状态 → 防止请求路由到已停止Host

3.4.2 destroyInternal方法

destroyInternal()用于彻底销毁Host:

protected synchronized void destroyInternal() throws LifecycleException {
    for (Container child : findChildren()) {
        child.destroy(); // 销毁Context
    }
    super.destroyInternal(); // 销毁Pipeline、Mapper等
}
  • 释放Host级JNDI资源、线程池和Pipeline

  • Host销毁后,所有Context、Wrapper也随之销毁,确保内存和资源完全回收


3.5 生命周期事件与监听

Tomcat使用事件驱动机制:

  • LifecycleListener:监听Host状态变化

  • 典型用途

    • 自动部署

    • JMX监控

    • 灰度发布(动态启停Context)

      host.addLifecycleListener(new LifecycleListener() {
          public void lifecycleEvent(LifecycleEvent event) {
              if (Lifecycle.START_EVENT.equals(event.getType())) {
                  log.info("Host启动完成: " + host.getName());
              }
          }
      });
      


3.6 Host启动失败排查

Host启动失败常见原因:

错误类型 排查方法
配置错误 检查server.xml中Host节点的name/appBase是否正确
Context启动失败 查看logs/catalina.out,定位Context报错(如web.xml配置错误)
Mapper异常 确认Host绑定的域名与请求Host头匹配
HostConfig未启动 检查HostConfig组件是否正常加载,日志中有LifecycleException

3.7 Host热部署与自动重载

  • HostConfig可监控appBase目录

  • WAR包或目录新增、修改时,Host可自动部署或重载Context

  • autoDeploy=true 配合 deployOnStartup 可实现自动化运维

    <Host name="example.com" appBase="webapps"
          autoDeploy="true" deployOnStartup="true">
    </Host>
    

  • 注意:热部署涉及ClassLoader隔离,Host级别的JVM共享机制保证多个Context不会相互干扰

第4章:虚拟主机实现原理

Tomcat通过Host组件实现**虚拟主机(Virtual Host)**功能,即在同一Tomcat实例上运行多个域名对应的Web应用。理解虚拟主机原理对于高可用架构、域名隔离部署及灰度发布至关重要。


4.1 虚拟主机概念

虚拟主机是指:

  • 多个域名指向同一Tomcat实例

  • 每个域名对应独立的Host

  • 每个Host可包含多个Context(Web应用)

在Tomcat中,层级关系如下:

Engine
 ├─ Host (虚拟主机)
 │   ├─ Context (Web应用)
 │   │   └─ Wrapper (Servlet)
 │   └─ Context
 └─ Host
     └─ Context

特点:

  • 隔离性:不同Host之间Context独立

  • JSP编译隔离:每个Host独立生成JSP类

  • 资源绑定独立:JNDI、Realm等资源可在Host级别独立配置


4.2 Host与域名匹配机制

Tomcat使用Mapper组件进行Host匹配(源码:StandardHost.java#L912):

public Container map(String uri, String hostName) {
    Container host = findChild(hostName); // 精确匹配
    if (host == null) {
        host = findDefaultHost(); // 默认Host fallback
    }
    return host.map(uri); // 继续Context/Wrapper匹配
}

4.2.1 精确匹配

  • Host节点的name属性必须与HTTP请求头Host一致

  • 匹配顺序:

    1. 精确匹配子域名

    2. 使用通配符(如*.example.com

    3. fallback到defaultHost

4.2.2 多协议支持

  • Mapper支持HTTP和HTTPS协议

  • 可在server.xml配置多个Connector,每个Connector对应不同协议,映射到同一个Host或不同Host

    <Connector port="8080" protocol="HTTP/1.1"/>
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"/>
    


4.3 多虚拟主机配置示例

server.xml 配置

<Engine name="Catalina" defaultHost="www.example.com">

    <Host name="www.example.com" appBase="webapps/example"
          autoDeploy="true" deployOnStartup="true">
        <Alias>example.com</Alias>
    </Host>

    <Host name="shop.example.com" appBase="webapps/shop"
          autoDeploy="true" deployOnStartup="true">
        <Alias>shop.com</Alias>
    </Host>

</Engine>

说明:

  • Alias 支持额外域名绑定

  • 每个Host独立appBase目录,实现Web应用物理隔离

  • Host可独立配置Valve、Realm等组件


4.4 Host级JSP编译隔离

每个Host有独立的work目录,Tomcat在StandardHost.java#L1023初始化Host时设置:

if (workDir == null) {
    workDir = new File(catalinaBase, "work/" + getName());
}
  • 确保不同Host之间JSP类不会冲突

  • 支持灰度发布和多域名版本隔离


4.5 Host级Pipeline与Valve

Host的Pipeline位于请求分发前端,处理全局策略:

  • HostValve → ContextValve → WrapperValve

  • 常见HostValve功能:

    • IP黑名单/白名单

    • 访问日志记录

    • 安全认证

自定义HostValve示例

@ManagedBean(description="Host级自定义访问日志Valve")
public class HostAccessValve extends ValveBase {

    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        log.info("Host访问: " + request.getRequestURI());
        getNext().invoke(request, response);
    }
}

在server.xml中绑定:

<Host name="www.example.com" appBase="webapps">
    <Valve className="com.example.HostAccessValve"/>
</Host>

4.6 Host请求路由流程

  1. 请求到达Connector

  2. Mapper选择Host

    • HTTP头Host → 精确匹配Host.name或Alias

    • 如果无匹配 → 默认Host

  3. Host管道处理

    • 执行Host级Valve

  4. Mapper选择Context

    • URI路径匹配Context.path

  5. Context管道处理

    • 执行Context级Valve

  6. Wrapper处理Servlet

    • 找到对应Servlet,执行service()方法

流程保证多域名请求隔离,每个Host独立处理日志、认证和资源加载。


4.7 多域名绑定注意事项

场景 配置建议
同一域名指向不同Host 使用Alias + DNS轮询或反向代理(Apache/Nginx)
HTTPS多域名 每个Host可配置独立SSL证书或使用通配符证书
灰度发布 新版本部署到单独Host,通过负载均衡/Proxy切换流量

Apache反向代理示例

<VirtualHost *:80>
    ServerName www.example.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

<VirtualHost *:80>
    ServerName shop.example.com
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>
  • Apache负责多域名路由

  • Tomcat内部依然通过Host精确匹配处理请求


4.8 Host安全与Realm交互

  • Host可配置Realm,实现域名级安全策略

  • 每个Host可以独立绑定:

    • JDBCRealm

    • MemoryRealm

    • JNDIRealm

      <Host name="www.example.com">
          <Realm className="org.apache.catalina.realm.MemoryRealm"/>
      </Host>
      

  • Host启动时Realm初始化,所有子Context继承或覆盖安全策略

  • 请求认证在HostValve阶段即可生效,提高安全隔离

第5章:HostConfig部署机制

在Tomcat中,HostConfigHost的部署管理组件,负责自动发现、部署和管理Web应用,包括WAR包、上下文配置、目录结构及生命周期管理。理解HostConfig机制对于自动化部署、热部署及灰度发布非常关键。


5.1 HostConfig概述

  • HostConfig位于org.apache.catalina.startup.HostConfig

  • 绑定到StandardHost实例,通过LifecycleListener方式监听Host生命周期

  • 核心职责:

    1. 部署应用:扫描appBase目录下WAR包和Context XML文件

    2. 更新应用:检测文件变化,自动重新部署

    3. 卸载应用:清理过期或删除的应用

HostConfig与Host的关系

StandardHost
 ├─ Pipeline (Valves)
 ├─ Children (Contexts)
 └─ HostConfig (LifecycleListener)
  • HostConfig通过监听Host的start/stop事件,控制Context的部署和销毁


5.2 HostConfig部署流程源码解析

5.2.1 部署入口

HostConfig在Host启动时自动触发:

public void lifecycleEvent(LifecycleEvent event) {
    if (Lifecycle.START_EVENT.equals(event.getType())) {
        deployApps();
    }
}

5.2.2 deployApps方法核心逻辑

源码位置:HostConfig.java#L350

protected void deployApps() {
    File appBase = new File(host.getAppBaseFile());
    if (!appBase.isDirectory()) return;

    // 扫描WAR包和目录
    File[] files = appBase.listFiles();
    for (File f : files) {
        if (f.isDirectory() || f.getName().endsWith(".war")) {
            deploy(f);
        }
    }
}
  • 扫描appBase目录

  • 区分WAR包与目录

  • 调用deploy(File f)方法进行部署


5.2.3 deploy(File f)方法实现

源码位置:HostConfig.java#L400

protected void deploy(File app) {
    String contextPath = "/" + app.getName();
    if (contextPath.endsWith(".war")) {
        contextPath = "/" + app.getName().substring(0, app.getName().length() - 4);
    }

    Context context = host.createContext(contextPath, app.getAbsolutePath());
    context.setReloadable(host.getAutoDeploy());

    host.addChild(context); // 将Context加入Host
    context.start();        // 启动Context
}

关键点:

  1. Context路径生成:WAR包名 → Context path

  2. Context创建:使用StandardContext实例

  3. Host管理:通过addChild加入Host容器

  4. 生命周期管理:调用start启动Context


5.3 自动部署机制

5.3.1 定时扫描

  • HostConfig使用定时任务(默认10秒)扫描appBase目录

  • 检测新增/删除/修改的Web应用

  • 自动执行deployundeploy

5.3.2 deployXML机制

  • HostConfig还会扫描$CATALINA_BASE/conf/[enginename]/[hostname]/目录下的*.xml文件

  • XML文件可自定义Context配置,例如:

    <Context docBase="webapps/demo" path="/demo" reloadable="true">
        <Resource name="jdbc/demoDB" auth="Container"
                  type="javax.sql.DataSource"
                  driverClassName="com.mysql.cj.jdbc.Driver"
                  url="jdbc:mysql://localhost:3306/demo"
                  username="root" password="123456"
                  maxActive="20" maxIdle="10"/>
    </Context>
    

  • 自动生成Context对象并加入Host


5.4 HostConfig与JNDI资源绑定

  • Context创建时,可通过HostConfig加载Host级别的JNDI资源

  • 源码位置:HostConfig.java#L512

    context.getNamingResources().addResource(resource);
    

  • HostConfig确保所有部署的Context能够访问Host定义的全局资源

  • 例如数据库连接池、邮件服务等


5.5 热部署与灰度发布

5.5.1 热部署流程

  1. HostConfig检测到appBase目录下新WAR包

  2. 创建新的Context实例

  3. 启动Context

  4. 如果Context启动成功,旧版本可选择卸载

  5. 实现无缝切换,支持零停机部署

5.5.2 灰度发布示例

  • 新版本部署到独立Host(如gray.example.com

  • Apache/Nginx按比例转发流量

  • 部署完成后,将流量逐步切换至新Host

  • HostConfig自动管理Context生命周期


5.6 HostConfig与Pipeline交互

  • 部署Context时,HostConfig确保Context继承Host的Pipeline(Valve链)

  • 示例:

    Context ctx = host.createContext("/app", appBasePath);
    ctx.getPipeline().addValve(new AccessLogValve());
    host.addChild(ctx);
    

  • 所有请求经过HostValve → ContextValve → WrapperValve,保证Host策略生效


5.7 HostConfig配置示例

server.xml片段

<Host name="www.example.com" appBase="webapps"
      autoDeploy="true" deployOnStartup="true">
    <Alias>example.com</Alias>
</Host>
  • autoDeploy="true":启用自动部署

  • deployOnStartup="true":Host启动时部署现有应用

  • HostConfig监听Host的Lifecycle事件,执行部署逻辑


自定义Host部署器示例

public class CustomHostConfig extends HostConfig {

    @Override
    protected void deploy(File app) {
        System.out.println("自定义部署: " + app.getName());
        super.deploy(app); // 保留原有部署逻辑
    }
}
  • 可以在server.xml中替换默认HostConfig

  • 用于灰度策略、日志增强或定制化WAR部署


5.8 部署故障排查技巧

问题 排查方法
Context未启动 查看catalina.out日志,检查deploy异常
WAR包冲突 确认Context path是否重复,检查appBase目录
自动部署失败 检查autoDeploydeployOnStartup属性
JNDI资源未绑定 确认Context XML中Resource配置正确,且HostConfig已加载

5.9 小结

  • HostConfig是Host容器的部署管理核心

  • deployApps方法扫描appBase目录并创建Context

  • 支持WAR包、目录和XML配置方式

  • 与HostPipeline、JNDI资源及Realm紧密结合

  • 提供自动部署、热部署和灰度发布能力

  • 支持自定义Host部署器,增强工程化部署能力


网站公告

今日签到

点亮在社区的每一天
去签到