Tomcat9.0--入门篇1
Posted Java老僧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat9.0--入门篇1相关的知识,希望对你有一定的参考价值。
福利干货第一时间送达!
1、开篇介绍
很多童鞋都说源码晦涩难懂,绕来绕去的,其实优秀的源码是有规律可循的。比如命名规则,xxxHandler
就是处理器,作用就是分发请求交由不同的类来处理。一般重要的,频繁创建的类都会叫 xxxFactory
用工厂模式来创建,还会有 lifecycle
后者 lifestyle
这种专门管理生命周期。一般定义为接口,会有默认的实现类,一般叫做 standardxxx
或者 defaultxxx
。再比如集成 boot 的时候,需要查看某个框架的默认配置,或者修改配置的时候,可以尝试搜索 xxxProperties
这些。debug 模式无疑是阅读源码的神兵利器。一定要熟练掌握调试技巧。阅读源码最好对设计模式有一定的理解,这样理解起来效率会高很多。不过不熟悉也没关系,作者会在每个系列的源码里面加入设计模式分析和总结,跟着作者完整的走一遍源码过后,相信你会对设计模式有全新的认知。
2、本次源码分析预计分为五大专题
第一部分是 Tomcat 入门篇 (组件介绍,启动流程分析);
第二部分是手写 Tomcat 实现;
第三部分是 Tomcat 的设计模式总结;
第四部分是源码深入探究;
第五部分是 Tomcat 的优化专题。
很多人说看不懂源码,不懂方式方法。博主也是小白,但是源码看的比较多,这次分析以博主的第一人称视角来分析,语言朴实易懂,不管观众老爷是否阅读过 Tomcat 源码,以一个小白的角度来一步步分析源码的过程,想必会很有趣的!一定不要错过这顿丰盛的大餐哦。下面我就准备上菜啦,翠花,上酸菜!
题头:Tomcat 9.0 概述: Tomcat 9.0 版本已经取消了 bio 的实现,默认采用 nio 的实现方式。
tomcat9.0 的 IO 模型
很多童鞋都喜欢拿 netty 和 tomcat 做比较,其实两者不算是一回事,netty 是基于 java nio 的网络应用框架,说白了就是一个网络组件,一般广泛应用在网络通讯。如果非要和 tomcat 比较的话可以基于 netty 做一个 http server
,但是需要非常扎实的理论功底,而 tomcat 是基于 http 的服务器。由上图来看,tomcat 也支持 nio,甚至 nio2(关于 nio 和 nio2 会在后续章节详解) 所以完全没有必要进行比较。。
3、Tomcat 基本组件介绍
本系列所有源码解析基于 Tomcat 9.0.12 版本。
Tomcat 的组件大体结构如下图所示:
图片来源于百度图片
整个 Tomcat 包装在 Server 内,具体来说几大重要的组件分别是:
Service: 一个 Server 可以有多个 Service,Service 包裹了整个逻辑组件。
Connector: 简单来说 Connector 就是负责接收客户端的 request,然后在 tomcat 处理过后再将请求发送出去的桥梁。
Engine: 一个 Service 里面只有一个 engine。字面理解是引擎,源码注释中给出的解释是负责处理来自 Service 中的 Connector 的所有请求。其实还有一个作用就是将请求发送出去。
Host:每一个 host 就是一个主机。可以绑定不同的端口。每一个 host 里面有多个 context 上下文。
Context: 每一个 context 对应一个上下文,里面有多个 web 服务,每一个 web 服务里面有多个 servlet。其中 Resource 和 Global Naming Resources 一样,只不过
global
是全局的,所有 web 项目都可以共用。而 Resource 对应的是一个 web 项目。Resources 定义了资源之后需要一个 Resources link 来指向对应的 Resource
其实简单来说,上面可以分为两部分,connector 和 container,container 包含了 engine,host,context。每个组件都有一个 Standart 开头的标准实现类。上面这些组件的初始化过程完美诠释了什么叫模版设计模式。
其他部分的组件解释
Listener: 负责监听前面说的四大组件。上面说的四个组件对应的 Config 类分别实现了 LifecycleListener 接口。来实现监听功能。这种设计模式体现了设计模式中的观察者设计模式。(后续文章会单独介绍 tomcat 的设计模式)
Global Naming Resources: 这个是和
JNDI
配和使用。
那么首先需要了解 JNDI,JNDI(Java Naming and Directory Interface,Java 命名和目录接口) 是一组在 Java 应>用中访问命名和目录服务的 API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是>一种命名服务,在这种服务里,对象不但有名称,还有属性。---- 转自百度百科
说白了啊,其实就是提供了一个 map,key 是名称,value 就是对象。我们可以在应用中直接通过 name 来拿对象,而 Global Naming Resources 的作用,就是可以在 xml 文件中配置一个全局的资源,比如我们经常配置的数据源。可以配置在 xml 中。我们默认的 server.xml 文件里面就有一个配置。
我们可以直接从 java 代码里的 MemoryUserDatabaseFactory
这个接口拿对应的实例。这个例子最终指向 tomcat-users.xml
文件,负责管理用户授权。举个例子,如果碰到需要将数据库的数据源这些配置在 tomcat 里面的时候,就可以用这种配置方式。
那些个小箭头,里面写着 value 的那个大家也注意看一下,这个也很重要,在 Tomcat 进行逻辑处理的时候,在每一个组件里面是通过 Pipeline(管道) 来进行处理的。这里大家可能不理解,大家应该都写过 filter 吧,每一个 filter 写完之后有一个 doFilter(request,response) 的方法,意思就是交给下一个过滤器。这里意思是一样的,就是这个小组件处理完了交给下一个小组件,全部处理完了才交给下一级。这里体现出的是设计模式中的责任链模式。
图片转自 https://www.cnblogs.com/coldridgeValley/p/6606271.html
Realm:realm 组件顾名思义,其实就是授权,每个 Standard 标准实现类里面都有一个 getRealm 方法。
Servlet: 我觉得这个位置写成 wrapper 更合适,这个地方就是每个 servlet 最后都包装成 wrapper,然后在 StandardContext 的 loadOnStartUp 方法初始化的。参数是 Wrapper 类
Cluster: 将消息通知给集群中的其他项目。
manager 这个组件的设计是为了方便远程管理 tomcat,比如重启,升级等。不用进入到服务器就可以直接操作,前提是必须先给用户授权。下面是 tomcat 的 manager 的页面。
Loader 是 tomcat 的自定义类加载器,这个是一个重点,在部署到 tomcat 的每个项目里面。每个项目之间 jar 包必须要隔离,但是 tomcat 自己的 jar 包又要被所有的项目共享,这时候 tomcat 必须要自定义类加载器也就是 classLoader 来实现自己的功能。所以要看懂 Tomcat 源码, 首先要理解他的类加载器。
下一篇会介绍类加载器的基本使用以及 Tomcat 的类加载器介绍。
觉得文章还不错的话,麻烦您点个关注哦~
以上是关于Tomcat9.0--入门篇1的主要内容,如果未能解决你的问题,请参考以下文章
Centos7——16.搭建JAVAEE 环境(安装Tomcat9.0.24)