tomcat知识点总结

tomcat的核心?

Connector和Container:
	1、Connector用于处理连接相关的事情,底层是socket通信,将http请求和服务端的响应封装成request和respones; 
	2、Container用于封装和管理Servlet,以及具体处理Request请求;
一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connector,这是因为一个服务可以有多个连接,如同时提供Http和Https连接,也可以提供向相同协议不同端口的连接。

一个请求发送到Tomcat之后,首先经过Service然后会交给Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!
Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

tomcat顶层架构:

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2)Server掌管着整个Tomcat的生死大权;
(4)Service是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;

Connector?

Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。
其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。
(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。
(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP、IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。
(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

启动流程?

1,创建Bootstrap启动类实例,并做一些初始化工作,初始化类加载器和创建Catalina实例,然后再启动Catalina线程。Catalina实例执行start方法。load方法解析server.xml配置文件,并加载Server、Service、Connector、Container、Engine、Host、Context、Wrapper一系列的容器。加载完成后,调用getServer().start()来开启一个新的Server。首先利用Digester类解析server.xml文件,得到容器的配置,并创建相应的对象,并关联父子容器。依次创建的是StandardServer、StandardService、StandardEngine、StandardHost。
然后拿到StandardServer实例调用init()方法初始化Tomcat容器的一系列组件。一些容器初始化的的时候,都会调用其子容器的init()方法,初始化它的子容器。顺序是StandardServer、StandardService、StandardEngine、Connector。每个容器都在初始化自身相关设置的同时,将子容器初始化。

在初始化、开启一系列组件、容器的过程中,由tomcat管理的组件和容器,都有一个共同的特点,都实现了Lifecycle接口,由Tomcat管理其生命周期。Lifecycle提供一种统一的管理对象生命周期的接口。通过Lifecycle、LifecycleListener、LifecycleEvent,Catalina实现了对tomcat各种组件、容器统一的启动和停止的方式。
在Tomcat服务开启过程中启动的一些列组件、容器,都继承了LifecycleBase这个抽象类,其中的init()、start() 方法、stop() 方法,为其子类实现了统一的start和stop管理。方法中具体的方法由子类去实现,这里采用的是模板方法模式。

总结Tomcat启动的过程:
	在Catalina的load方法里,就已经调用了StandardServer里的init方法,一层一层初始化了globalNamingResources,StandardService--》StandardEngine,executors,MapperListener,Connector--》CoyoteAdapter,protocolHandler。至此就将tomcat的catalina中的组件、容器初始化完成。 接下来就是调用start方法一层一层开启,StandardServer的startInternal方法,按层次start:globalNamingResources,StandardService--》StandardEngine,executors,MapperListener,Connector--》StandardHost,StandardContext,protocolHandler。顺序基本同init过程。StandardEngine在start时,会init子容器,并调用子容器的start方法。子容器依次这样init、start,就开启了StandardHost和StandardContext。


2,Bootstrap的初始化init方法:
	1,先初始化类加载器(commonLoader,catalinaLoader,sharedLoader)。
	2,给当前线程设置特定的类加载器catalinaLoader。
	3,向SecurityClassLoad安全机制的类加载器中添加catalinaLoader类加载器。
	4,初始化Catalina启动类,并根据构造函数startupClass.getConstructor().newInstance()创建Catalina启动类。
	5,设置启动参数。

	Bootstrap的初始化load方法(加载参数)。

3,Bootstrap的demon.start()方法就会调用Catalina的start方法。

责任链模式?

职责链模式,就是很多对象有每个对象对其后面的引用而连接起来形成一条链,请求在这条链上传递,直到链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给下一家,直到最终链上每个对象都处理完。这样可以不影响客户端而能够在链上增加任意的处理节点。
在tomcat中这种设计模式几乎被完整的使用,tomcat的容器设置就是职责链模式,从Engine到Host再到Context一直到Wrapper都是通过一个链传递请求。

模板方法模式?

Tomcat在启动的过程中主要的两个方法init()和start(),这里我们以start()为例,LifecycleBase类中的start()方法,会调用startInternal(),这个方法是一个抽象方法需要子类去实现,所以子类需要实现这个特定的开启方法,最终调用的start方法,其他固定的步骤一致,同时也会执行子类实现的特定的开启。

tomcat调错?

当tomcat启动异常的时候,一般情况是去logs目录下,查看cetalina.log日志信息,找异常。如果是在运行过程中发生的异常,是放在localhost.log中。

嵌入式Tomcat?

非传统的部署方式,将Tomcat嵌入到主程序中进行运行。
优点:
	灵活部署、任意指定位置、通过复杂的条件判断。比如,springboot中内嵌的tomcat。
Tomcat类:Tomcat类是外部调用的入口
1.位置:org.apache.catalina.startup.Tomcat
2.该类是public的。
3.该类有Server、Service、Engine、Connector、Host等属性。
4.该类有init()、start()、stop()、destroy()等方法。

springboot中内嵌tomcat源码?

在@SpringBootApplication中@EnableAutoConfiguration,默认开启了tomcat配置,在EmbeddedServletContainerAutoConfiguration中有一个内部类EmbeddedTomcat就是嵌入式tomcat的启动入口,根据调用Tomcat类实现的嵌入式启动。

Maven集成Tomcat插件启动分析?

Tomcat7RunnerCli是引导类,Tomcat7RunnerCli主要依靠Tomcat7Runner,Tomcat7Runner调用Tomcat类。

Tomcat有三种运营模式?

bio、nio、apr,不同模式下Tomcat的运行效率差别比较大。
apr(Apache Portable Runtime):
从操作系统级别来解决异步的IO问题,大幅度的提高性能,必须要安装apr和native,直接启动就支持apr。

tomcat配置线程数?

在中配置最大线程数,这是一个线程池,还有连接超时时间。

tomcat优化?

1,增大线程池的线程数
2,增大堆内存,一般可以指定物理内存的80%,在配置文件中加入配置信息
3,在connector中设置enableLookups="false"取消DNS检查
4,设置compression=”on”进行压缩
5,把useURIValidationHack设成”false”,减少对一些url的不必要的检查从而减省开销。

tomcat有几种部署方式?

1,直接把Web项目放在webapps下,Tomcat会自动将其部署
2,在server.xml文件上配置节点,设置相关的属性(doBase)即可
3,通过Catalina来进行配置:进入到conf\Catalina\localhost文件下,创建一个xml文件,该文件的名字就是站点的名字。

tomcat容器是如何创建servlet类实例?用到了什么原理??

当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。
(有时候也是在第一次请求时实例化)在servlet注册时加上如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

tomcat的类加载机制?

tomcat的类加载机制是违反了jdk的双亲委派机制,tomcat为了实现隔离性,每个webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器。CommonClassLoader能加载的类都可以被CatalinaClassLoader和SharedClassLoader使用,从而实现了公有类库的共用,而CatalinaClassLoader和Shared ClassLoader自己能加载的类则与对方相互隔离。WebAppClassLoader可以使用SharedClassLoader加载到的类,但各个WebAppClassLoader实例之间相互隔离。如果tomcat的CommonClassLoader想加载WebAppClassLoader中的类,可以使用线程上下文类加载器实现,使用线程上下文加载器,可以让父类加载器请求子类加载器去完成类加载的动作。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat是一个开源的Java Servlet容器,也是Apache软件基金会的一个项目。它实现了Java Servlet和JavaServer Pages(JSP)规范,提供了一个运行Java Web应用程序的环境。 以下是一些关于Tomcat的常见知识点: 1. Tomcat的架构:Tomcat由多个组件组成,包括Catalina、Coyote、Jasper等。Catalina是Tomcat的核心组件,负责处理Servlet和JSP。Coyote是Tomcat的HTTP协议处理组件,用于接收和处理HTTP请求。Jasper负责编译JSP文件。 2. 配置Tomcat:配置文件位于Tomcat安装目录下的conf文件夹中。其中,server.xml文件是主要的配置文件,可以配置监听端口、虚拟主机等。 3. 部署Web应用程序:将打包好的Web应用程序(通常是一个WAR文件)放置在Tomcat的webapps目录下,Tomcat会自动解压并部署该应用程序。 4. Tomcat的类加载机制:Tomcat使用了一个叫做Catalina的类加载器层次结构,按照一定的顺序加载类。其中,Common类加载器加载Tomcat共享的类库,Catalina加载器加载Tomcat内部使用的类库,Web应用程序类加载器加载各个Web应用程序中的类。 5. 连接池:Tomcat提供了连接池的功能,用于管理数据库连接。通过配置数据源和连接池参数,可以提高数据库连接的性能和效率。 6. Tomcat的日志:Tomcat会记录各种日志信息,包括访问日志、错误日志等。这些日志文件位于Tomcat安装目录下的logs文件夹中。 7. 虚拟主机:Tomcat支持虚拟主机,即在同一个Tomcat实例中运行多个独立的Web应用程序。通过配置不同的域名或端口,可以将请求分发到不同的虚拟主机上。 这些只是Tomcat的一些基础知识点,希望能对你有所帮助!如果你还有其他问题,可以继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值