tomcat优化

131 阅读5分钟

从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

反射在底层中的应用:读取配置文件,执行配置的类,创建对象