前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >tomcat学习|tomcat中组件结构设计

tomcat学习|tomcat中组件结构设计

作者头像
微笑的小小刀
发布2019-08-26 15:11:25
4440
发布2019-08-26 15:11:25
举报
文章被收录于专栏:java技术大本营java技术大本营

源码中的这些组件

通过下图我们可以看到,在我们直接使用的Context,Service,Server上面还有一层接口: Container 和 Lifecycle

我们说接口是有什么什么能力,现在我们就整理下这些组件的接口

以内层的Context为例,我们在idea中可以看到如下继承图:

同样,我们去对比其他的组件,也会发现他们都类似于继承这些接口,几大常用组件的继承关系如下所示:

我们可以通过idea的类图工具,查看类的继承以集接口相关的方法,对着类名点右键,然后可以看到相关的图

Lifecycle接口

我们可以对上图中的接口做一个划分,如下所示

上面三个方法是 Listener相关的 中间三个方法是自身生命周期相关的 下面两个方法是获取自身状态的

listener

监听器,每一组件,有一组监听器,在组件本身达到某一状态时,可以循环监听器list , 然后这些注册监听器的组件,再根据监听到的状态进行相关的动作行为. 我们以server为例:

代码语言:javascript
复制
 /**
     * 循环监听器List , 去执行不同的动作
     *
     * @param type  Event type
     * @param data  Data associated with event.
     */
    protected void fireLifecycleEvent(String type, Object data) {
        LifecycleEvent event = new LifecycleEvent(this, type, data);
        for (LifecycleListener listener : lifecycleListeners) {
            listener.lifecycleEvent(event);
        }
    }

当执行server的start时,就会去向所有的监听器传播 CONFIGURE_START_EVENT这个事件.但是监听器对这个事件做不做响应,就是对应的实际监听器所做的决定,如下图所示,HostConfig ,在接收到事件时,要判断类型,对不同类型的事件,做不同的处理. 基本上Config都继承了 LifecycleListener 这个接

组件本身的生命周期

中间四个方法,代表着组件的四种状态:init(),初始化, start() 启动,stop()停止,destory(销毁),这些通过字面意思就能猜出来.tomcat官方给了一张生命周期和状态对应的流程图:

重点不在于上面的图,而在于下面话,组件通过调用不同的方法,使自身达到不同的状态,然后调用监听器list , 去通知其他的组件/配置做相应的处理,以Server 这个组件为例:,在前几篇中,我们讲tomcat 启动流程的时候,分析到这里, 会调用server.init(),实际上就是调用了生命周期的第一个阶段方法

我们可以看到, init执行的LifecycleBase类中的init方法,最终,是执行的StandardServer中的initInternal方法,

代码语言:javascript
复制
  // 初始化我们的service 
        for (int i = 0; i < services.length; i++) {
            services[i].init();
        }

同样,我们可以去看到,start也是一个类似的过程,所以这四个方法, 是贯穿整个tomcat生命周期的,推动着tomcat的运行

本身状态

可以通过下图看使用方法:组件.getState().isAvailable(), 去判断组件是否在可用状态,通过LifecycleState源码可以看到,只在三种状态下available是可用的

代码语言:javascript
复制
STARTING(true, Lifecycle.START_EVENT),
    STARTED(true, Lifecycle.AFTER_START_EVENT),
    STOPPING_PREP(true, Lifecycle.BEFORE_STOP_EVENT),

Container 接口,pipeline,valve

通过其名字,我们可以大致猜测,是表示一个容器,那么做为一个容器,他有自己的名字,有子容器(Children), 但是这些容器本身并没有处理业务逻辑的功能,所以,一个容器还会绑定一个执行链. Tomcat中定义了Pipeline, valve来帮助Container来处理业务,每个Container组件通过执行一个pipeline里面的valve 来执行业务.对于每个容器,都会有一个默认的valve在最底层,最后来执行.如果用户/使用者没有自定义的话,就会使用默认的. 我们可以看到在valve的方法中, invoke方法,已经是和业务/具体处理是相关联的了

我们以StandardEngineValve为例,可以看到,对于同一个request和response,他在Invoke方法中,又调用了host的valve的inove

代码语言:javascript
复制
@Override
    public final void invoke(Request request, Response response)
        throws IOException, ServletException {

        // Select the Host to be used for this Request
        Host host = request.getHost();
        if (host == null) {
            response.sendError
                (HttpServletResponse.SC_BAD_REQUEST,
                 sm.getString("standardEngine.noHost",
                              request.getServerName()));
            return;
        }
        if (request.isAsyncSupported()) {
            request.setAsyncSupported(host.getPipeline().isAsyncSupported());
        }

        // 调用host的valve去继续处理request,response
        host.getPipeline().getFirst().invoke(request, response);

    }

后面我们学习也就是以对request, response的处理为主

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java技术大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码中的这些组件
  • Lifecycle接口
    • listener
      • 组件本身的生命周期
        • 本身状态
          • Container 接口,pipeline,valve
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档