从servlet说去。tomcat 实在servlet的基础上开发的web容器
servlet规范:
说明:1、资源的开发步骤,也就是定好了接口,用户需要实现接口的方法,才可以作为一个动态资源文件被使用
其中:httpsevlet的子类,直接实现httpservletservlet类也可以
而如果用户的类实现httpservletservlet类,不需要用户实现的方法,已经实现,也就是需要设置请求的相关处理方法即可(模板方法设计模式)
tomcat的底层架构
最简单版本,tomcat的核心是servlet,请求过来通过加载的servlet对请求处理,并返回结果
http请求sevlet容器会加载实现了servlet接口的类,这些类可以处理请求
版本二,tomcat的核心组件是catalina servlet容器 和 coyote连接器,
tomcat分为连接器和容器,连接器负载接收socket,容器执行具体逻辑,;连接器和容器的交流是servletrequest和servletresponse
连接器部分分为coyote和catalina,其中coyote负责协议的解释和io的操作 sevlet的相关操作交由catalina去处理
支持的io模型和应用协议
nio,nio2,bio
连接器coypte的模型 模型的说明: endpoint:接收socket请求,tcp/ip协议,
processor转化为http请求 requst请求
适配器 传servletreqest给容器catalina
catalina,负责解析tomcat配置文件,以此创建server组件,并根据命令对其管理
server服务器表示整个catalina servlet容器及其组件,负责组装比启动servlet引擎,tomcat连接,servlet通过实现liftcycle接口,提供一种优雅的启动和关闭整个系统的方式
service服务是server服务的内部组件,一个server包含多个service,它将一个connecter绑定在多个connector组件上
connector容器,负责对请求的接收
contianer容器,负责处理客户端的请求,并返回对象给web用户模块
host一个主机,context(一个服务程序存放在一个server中),wrapper 服务里面的servlet
host为主机:可能有多个端口
context 服务
wrapper 服务内部的servlet
tomcat的启动流程(启动的主程序bootstrap),excutor是tomcat的共享线程池
(这个过程加载tomcat配置文件,初始化容器组件,监听对应的端口,准备通过protocolhandler接收客户端请求)
举例:
请求处理流程
engine ,host,context,wrapper是链式的调用,在filterchain中执行过滤器和具体的servlet,用户实现的servlet实现了具体方法,在这里执行
pipline是责任链的设计模式 责任链模式的设计,是为了将http请求分类执行,engine是分到集群的机器,host是不同的主机,context是分到不同的servlert不同的执行方法
最终在applicationfilterchain里面执行service.doget方法
tomcat配置文件
server.xml的 server标签的端口是用于监听tomcat的情况
service标签(里面可以配置监听器,共享线程池,连接器等)
excutor标签(共享线程池
线程池的配置例子
属性说明
connector
指定连接池使用的线程池
service内可以配置多个host,放不同的项目
context配置访问的项目路径,指定项目的路径
docBase 指定项目路径 path:指定访问的路径
web应用的配置
jvm的配置
不同的环境,配置方法不同
参数配置
安全问题 ,删除webapps下自动的项目删掉,禁止用user.xml 修改监听的端口8005 并且改一个复杂的指令 修改报错的返回,不要返回错误的栈信息
tomcat性能调优
指标:1、响应时间,2、吞吐量:时间内可以承受的访问量
可以调节连接件数,共享线程池的线程数,jvm内存的调节
连接器的配置
jvm的调优
建议tomcat的内存占可用内存的80%
tomcat高性能
tomcat通过配置线程池的线程数量,可以提高服务的吞吐量
main线程主要是启动tomcat的其他线程,阻塞在8005端口
tomcat的主线程在bootstrap
main线程的任务:1、初始化(加载server.xml文件的各个组件),2、启动(启动这些组件的线程)
local-startStop线程 main线程只走到了engine,就将需要执行的线程由startStopExcutor去执行,启动加载的组件
当组件启动完成后,那么该线程就推出,生命周期就限制于此
asycfilehandlerwriter线程(异步文件处理)(该线程通过静态代码块自启动)
tomcat(8)contiannerbackgroud线程
主要负责实时扫描tomcat容器的变化,在某一时刻触发某些事件,例如tomcat的热部署
catalina-utinity线程(tomcat9)
将tomcat(8)的contiannerbackgroud和start-stop线程合并
下面的线程非常主要
acceptor线程(在处理完的交接线程在bio和nio模式中略有差异 )
tomcat前段统一接受的外层线程,负责统一接受sockt请求
poller,实现io复用(nio使用),poller的线程都是就绪有数据的通道
clientpoller线程 nio的特有线程,reactor模式的实现者
负责接受accepter叫过来的线程,对事件轮询后交接给exec线程处理
exec线程,工作线程,默认开启10个,接受poller丢过来的io。主要的工作是解释http协议,获取到request和response后,调用tomcat后端容器
acceptor、poller、exc都是tomcat前段内容
nioblockingselector。blockpoller
负责sevelet的输入输出
左边的是辅助线程,右边的是核心线程,最繁忙,决定了tomcat的性能
tomcat的前后端由coyoteadaptor
、
反射在底层中的应用:读取配置文件,执行配置的类,创建对象