本文主要介绍tomcat源代码解读(tomcat编译的项目在哪里),下面一起看看tomcat源代码解读(tomcat编译的项目在哪里)相关资讯。
概述tomcat、jetty、undertow都是非常著名的实现servlet规范的应用服务器。tomcat本身也是业界优秀的中间件。简单来说,tomcat可以看作是一个http服务器servlet容器,它管理和运行servlet。相信大家对这个三条腿的猫logo都很熟悉,在学校和工作中也经常用到。特别是java程序员,一开始都有在idea或者eclipse的集成环境中配置tomcat启动web项目的经验,当然也可以在springboot中基于tomcat maven插件或者嵌入式web容器调试运行。
源代码编译官方下载tomcat源代码,最新稳定版本是10.0.12。
#因为tomcat源代码依赖于jakartaee-migration模块,而jakartaee-migration还没有发布到maven repository,所以我们需要git克隆到本地,然后mvn安装部署,解决tomcat源代码的编译问题。-jakartaee-migration#解压文件并进入tomcat-jakarta ee-migration-main目录。在地址栏输入cmd进入命令行窗口自动进入当前目录#执行maven安装到本地仓库mvn干净安装#解压文件apache-tomcat-10 . 0 . 12-src . zip . tomcat源代码不是maven项目结构,但是可以通过pom指定java代码目录(不遵循src/main结构),在项目目录下创建一个pom.xml文件,内容如下:?xml版本= 1.0 编码= utf-8 ?xmlns项目= http://maven.apache.org/pom/4.0.0xmlns : xsi = http://www.w3.org/2001/ xml schema-实例和xsie cho 15-@ . com schema location = http://maven.apache.org/pom/4.0.0 -4.0.0.xsd;模型版本4 . 0 . 0/模型版本groupidcom.github.sources/groupid artifact id source-tomcat/artifact id版本10.0-snapshot/版本名称source-tomcat/名称依赖项依赖项group id junit/groupid artifact id junit/artifact id版本4.12/版本scope test/scope/依赖项依赖项groupidorg.easymock/groupid artifact ideas mock/artifact id版本3 . 5 . 1/版本/依赖项依赖项groupidorg.apache.ant/groupid artifact id/artifact id版本1 . 10 . 1/版本/依赖项依赖项group id wsdl 4j/groupion/artifactid版本0 . 2 . 1-快照/版本/依赖项依赖项groupidbiz.aqute.bnd/groupid artifactidbiz.aqute.bndlib/artifactid版本5.2.0/版本范围provided/scope/依赖项/依赖项生成final name tomcat 10.0/final name source directory java/source directory test source directory resources资源目录java/directory/resources test resources test resource directory test/directory/test resource/test resources插件groupidorg.apache.maven.plugins/groupid artifact id maven-compiler-plugin/artifact id版本3.6.1/版本配置编码utf-8;t报告没有编译器选项。version _ 16//设置。put(编译器选项。选项_源,编译器选项。version _ 16);// settings.put(compileroptions。选择权_targetplatform,编译器选项。version _ 16);// settings.put(compileroptions。option_compliance,编译器选项。version _ 16);上一章我们已经提到了tomcat主函数的入口在org . apache . catalina . startup . bootstrap中,我们知道主函数会遇到如下测试类的错误。你可以试着运行并忽略测试类,或者直接删除maven编译时生成的测试文件夹。我们将在这里直接删除测试文件夹。
目前,tomcat初创公司can 找不到配置文件,所以我们在源代码的根目录下创建源文件夹,并将conf和webapps这两个目录转移到源文件夹。
然后在运行设置中添加以下vm参数。
-dca talina . home = f: \ develop \ apache-tomcat-10 . 0 . 12-src \ source-dca talina . base = f: \ develop \ apache-tomcat-10 . 0 . 12-src \ source-dj ava . util . logging . manager = org . apache . juli . classloaderlogmanager-dj ava . util . logging . config . file = f: \ develop \ develop此时,我们可以启动tomcat程序了。但是当你访问: 8080/,会得到一个500错误。当您启动tomcat bootstrap时,jsp编译器jasperinitializer不会被加载。
org . apache . catalina . startup . context config中的# configurestart//添加以下初始化语句上下文。在这句话下面添加addservletcontainerizinitia。lizer(new jasperinitializer,null);重启tomcat,勾选: 8080,会出现tomcat的欢迎页面。
架构源代码分析整体架构tomcat源代码使用了大量的模板方法和适配器设计模式,封装了很多组件,组件之间有明显的层次关系,是经典的玩偶式架构设计;个人建议从配置文件了解tomca的架构,这也是基于玩偶式架构设计的优势。tomcat模块的层次结构和相关模块的功能描述如下:
器组件是tomcat的核心组件,可以完成tomcat生命周期中一些容器相关的器。jndijndi是一个java命名和目录接口,属于j2ee规范。tomcat实现了它。jndi在《j2ee》中的角色是a 开关 ,即j2ee组件在运行时查找其他组件、资源或服务的一种通用机制(你可以简单理解为给一个资源起一个名字,然后根据名字查找一个资源)。集群组件提供了集群功能,可以将相应容器需要共享的数据同步到集群中的其他tomcat实例。realm组件提供了一个容器级的用户密码权限数据对象,它与资源认证模块一起使用。加载器组件web应用程序加载器用于加载web应用程序的资源,它应该保证不同web应用程序之间的资源隔离。管理器组件servlet mapper属于上下文中的路由映射器,它只负责上下文容器的路由导航。catalina是tomcat中的一个重要组件。它负责解析tomcat的配置文件(server.xml),从而创建服务器组件并对其进行管理。以下是tomcat amp中知名的server.xml核心配置的内容结构 conf目录,服务器-服务-(连接器引擎)。全局资源tomcat-user.xml可以在globalnamingresouce域中定义,在web.xml文件中也很常见,比如session-config配置的默认超时是30分钟。
?xml版本= 1.0 编码= utf-8 ?服务器端口= 8005 关机= 关机 器classname = org . apache . catalina . startup . version logger listener /globalnamingresources resource name = 用户数据库和auth = 集装箱与运输type = org . apache . catalina . user database 描述= 可以更新和保存的用户数据库工厂= users . memoryuserdatabase factory 路径名= conf/tomcat-users.xml/ / globalnamingresources服务名称= 卡特琳娜 遗嘱执行人姓名= tomcatthreadpool 名称前缀= 卡特琳娜-执行- maxthreads = 150英镑minsparethreads = 4 /连接器执行器= tomcatthreadpool port = 8080 协议= http/1.1 connectiontimeout = 两万英镑重定向端口= 8443 / /连接器引擎名称= 卡特琳娜 defaulthost = 本地主机 realm classname = org . apache . catalina . realm . lock out realm realm classname = org.apache.catalina. realm。用户数据库领域 资源名= 用户数据库和/ /领域主机名= 本地主机 appbase = webapps unpackwars = 真实 自动部署= 真实 阀门classname = apache . catalina . valves . accesslog valve 目录= 日志 前缀= 本地主机访问日志后缀= 。txt 爸爸ttern = % h % l % u % t % r% s % b //host/engine/service/server:表示一个tomcat实例,包含servlet容器和其他组件,负责组装和启动servlet引擎和tomcat连接器。每个tomcat只有一个服务器,它代表整个服务环境。一个服务器中可以有多个服务。服务器管理多种服务。tomcat源代码中的服务继承自生命周期,tomcat服务组件的顶层接口有standardserver的唯一实现。服务:服务是服务器中的一个组件。一个服务器可以有多个服务,这些服务将几个连接器组件绑定到一个容器,每个服务可以有多个连接器和一个容器(引擎)。连接器主要用于接收请求,解析请求内容,封装请求和响应,然后将准备好的数据交给容器进行处理。集装箱就是我们常说的集装箱。其中可以有多个主机。一个主机代表一个虚拟主机,即一个对应一个webapps。最后,在容器处理完请求后,它会将响应内容返回给连接器,然后连接器会将其返回给客户端。executor executor:tomcat线程池的配置,提供给连接器。连接器:负责处理用户的servlet请求并将对象返回给web用户的模块。我们知道tomcat处理http请求,也就是说tomcat使用http协议进行数据传输,而http协议是应用层协议,其本质是浏览器和服务器之间约定的一种通信格式。因此,作为http服务器,tomcat需要包含几个功能,比如接受连接、解析请求数据、处理请求和发送响应。这里我们分析tomcat的两个核心功能:
处理套接字连接,负责网络字节流与请求和响应对象之间的转换。加载和管理servlet,它负责处理请求请求。tomcat的底层使用socket进行连接,所以还涉及到网络io模型,通过socket本地端口,接收并处理端口的网络请求reque。st和response是按照http协议封装的,所以连接器需要同时实现tcp/ip协议和http协议。基于tomcat的核心功能,分别设计实现了两个核心组件:连接器和容器。连接器很复杂,要接收和分析请求,封装请求和响应,最后把数据交给容器,容器负责内部处理。
网络传播。应用层协议分析。tomcat请求/响应和servletrequest/servletresponse之间的转换。连接器连接器主要需要完成以下三个核心功能:
套接字通信,也就是网络通信。应用层协议解析,解析处理应用层协议,封装成请求对象。将请求转换为servletrequest,将响应转换为servletresponse。tomcat通过三个组件实现连接器:端点、处理器和适配器,它们通过抽象接口相互交互。从请求的转发流来看,端点负责向处理器提供请求字节流,处理器负责向适配器提供tomcat定义的请求对象,适配器负责向servlet容器提供标准的servletrequest对象:
端点和处理器可以自由组合并抽象成一个protocolhandler组件。连接器使用protocolhandler来处理网络连接和应用层协议。在连接器中,事件处理程序专门用于处理请求[proto handler];不同协议处理程序代表不同的连接类型[因此一个服务中可以有多个连接器]。比如http11protocol用普通socket连接,http11nioprotocol用niosocket连接。端点:对接i/o模型,向处理器提供字节流,通信端口,是传输层的抽象,处理底层socket的网络连接,实现tcp/ip协议。是一个接口,对应的抽象类是abstractendpoint,还有很多实现类,比如nioendpoint,jioendpoint等等。它有两个组成部分,一一个是acceptor,另一个是socketprocessor。acceptor用于监控套接字连接请求,socketprocessor用于处理接收到的套接字请求。端点接收到套接字连接后,生成套接字处理器任务并提交给线程池进行处理。socketprocessor的run方调用处理器组件解析应用层协议。处理器通过解析生成请求对象后,会调用适配器的服务方法。处理器:对接应用层协议,向适配器提供tomcat请求对象。处理器用于实现http协议,这意味着处理器是应用层协议的抽象。处理器接受来自端点的socket,然后解析成tomcat请求和tomcat响应对象,最后通过适配器提交给容器。对应的抽象类是abstractprocessor,还有很多实现类,比如ajpprocessor,http11processor。适配器:遵循servlet规范,servletrequest被提供给容器,protocolhandler接口负责解析请求并生成tomcat请求类。您需要将此请求对象转换为servletrequest。tomcat引入了coyoteadapter,这是适配器模式的经典应用。连接器调用coyoteadapter的sevice方法,tomcat请求对象被传入。coyoteadapter负责将tomcat请求转换成servletrequest,然后调用容器的服务方法使请求适应servlet容器架构。容器容器主要用于封装和管理servlet,并专门处理请求请求。tomcat中设计了四个servlet容器组件,即引擎、主机、上下文和包装器- servlet。这四个容器不是平行的,而是父子关系。tomcat源代码org、apache、catalina、core和standard engine都有它们的标准实现,每个容器都有一个pipel。ine对象。
引擎:catalina的servlet容器引擎,用于管理多个虚拟站点。一个服务最多只能有一个引擎,但是一个引擎可以包含多个主机。主机:代表虚拟主机或站点。tomcat可以配置多个虚拟主机地址,一个虚拟主机可以包含多个上下文。context:代表一个web应用,相当于我们在webapp下的应用。一个web应用程序通常有多个servlet,一个web应用程序可以包含多个包装器子容器。wrapper:servlet包装类,负责管理整个servlet生命周期,包括加载、初始化、资源恢复等。每个包装器包装一个servlet。管道和阀门(pipeline and valve)引擎、主机、上下文和包装容器都继承了containerbase,containerbase有一个standardpipeline对象。每个容器构造方法setbasic设置默认阀门(标准引擎阀门),初始化和开始管道和阀门组件。
当连接器使用容器处理请求时,连接器。getservice。getcontainer。getpipeline。getfirst。调用(请求、响应);
启动过程整个tomcat实际上是一个catalina实例,tomcat启动时会初始化这个实例。catalina实例通过加载server.xml,创建和管理一个服务器来完成其他实例的创建,服务器创建和管理多个服务,每个服务可以有多个连接器和一个容器。
我们知道启动tomcat就是执行startup.sh脚本文件,其中执行catalina.sh,最后是org。执行apache . catalina . startup . bootstrap类。
所以知道tomcat是从bootstrap类main方法开始,一步步链式调用各个模块的init方法进行初始化。每个模块初始化后,会一步步调用每个模块的start方法来启动每个模块。commonloader、catalinaloader和sharedloader中断了家长委托。
嵌入式示例接下来,我们将演示嵌入式tomcat运行示例,创建mavxmlns : xsi = http://www.w3.org/2001/ xml schema-实例和xsie cho 15-@ . com schema location = http://maven.apac·梅文父artifactid spring-extend/artifactid groupidcom.itxs/groupid版本1.0-snapshot/version/父model version 4 . 0 . 0/model version artifactid tomcat-test/artifactid属性maven . compiler . source 8/maven . compiler . target 8/maven . compiler . target 8/properties依赖关系groupidorg.apache.tomcat.embed/groupid artifactid tomcat-embed-core/artifactid版本8.5.28/version依赖关系groupidorg.apache.tomcat/groupid artifactid tomcat-jasper/artifactid版本8 . 5 . 28/copy/dependency/dependencies/project创建一个可以回显0-@ myfirstservlet.java .com的servlet。
包com.itxs导入javax . servlet . http . http servlet;导入javax . servlet . http . http servlet request;导入javax . servlet . http . http servlet response;导入java . io . io exception;公共类myfirstservlet扩展http servlet { private static final long serial version uid = 1l;@ override protected void doget(http servlet request req,httpservletresponse resp)抛出ioexception { dopost(req,resp);} @ override protected void dopost(http servlet request req,httpservletresponse resp)抛出ioexception { resp.getwriter。打印( 您好tomcat servlet,访问成功!!! );}}tomcatapplication.java文件
包com.itxsimport org . apache . catalina . life cycle exception;import org . apache . catalina . core . aprlifecyclelistener;导入org . apache . catalina . core . standard context;导入org . apache . catalina . startup . tomcat;导入javax . servlet . servlet exception;导入java . io . file;public class tomcat application { public static int tomcat _ port = 8080公共静态字符串tomcat _ hostname = 127.0.0.1公共静态字符串webapp _ path = src/main 公共静态void main(string[] args)抛出life cycle exception { tomcatapplication . run;}公共静态void run抛出life cycle exception { tomcat tomcat = new tomcat;tomcat . setport(tomcat application。tomcat _ port);tomcat . set hostname(tomcat application。tomcat _ hostname);setbasedir( 。 );// tomcat信息保存在项目下;standardcontext mycontext = null请尝试{ my context =(standard context)tomcat . add web app( /itxsamp,system . getproperty( 目录 )file . separator to cata application。web app _ path);my context . setreloadable(false);//上下文侦听器my context . addlifecyclelistener(new april cyclelistener);//register servlet tomcat . add servlet( /itxsamp, 我的第一个servlet ,new my first servlet);// servlet映射my context . addservletmapping decoded( /first . do , myfirstservlet );tomcat . start;tomcat.getserver。await;} catch(servlet exception e){ e . printstacktrace;}}}运行main方法。
并访问echo3-@。com 127 . 0 . 0 . 1 : 8080/itxs/first . do,接收结果页面。
性能调优关于性能调优,您可以考虑几个因素:
内存:jvm参数,实际生产中经常用到。并发优化:连接器开放线程池,优化线程池;缓存优化:连接器压缩和客户端连接超时;io优化:协议选择bio nio nio 2(aio);组件优化:apr sendfile epoll openssl tomcat native;我们只是简单了解一下tomcat的架构,搭建一下tomcat源码调试环境,然后有时间再进一步分析分享tomcat源码和设计模式。
标签:
集装箱装配
了解更多tomcat源代码解读(tomcat编译的项目在哪里)相关内容请关注本站点。