Tomcat-架构、生命周期、优化
【056扩展1 Tomcat的线程池】
在conf的server.xml中通过connector可以改变,默认的线程池是Tomcat自定义的,类似于ThreadPoolExecutor,通过参数可以指定核心线程数和最大线程数等,阻塞队列是继承了LinkedBlockingQueue的TaskQueue。
【056扩展2 Tomcat是线程安全的吗?】
Tomcat不是线程安全的,因为Tomcat的servlet被包装在wrapper容器里,而相同请求的wrapper只在第一次完成初始化,后面的请求会调用同一个servlet的doGet和doPost方法,其成员变量是共享的。
【057 Tomcat的内部架构】
Tomcat启动时,调用的是BootStrap的run方法,该方法会调用Catalina生命周期的start方法(之后所有组件的启动也是依靠各自生命周期的start方法),加载conf目录下的server.xml文件,启动唯一的Server。而Server又会启动内部的多个Service方法,每一个Service代表一种类型的Web服务(A "Service" is a collection of one or more "Connectors" that share a single "Container"),可以有多个Connector,但只能有一个Engine。每个Connector指定不同的连接方式,包括协议,监听端口号等。然后通过线程池的线程处理,分析请求,并交给合适的容器。容器的顶层是Engine,一个Engine可以有多个Host,每个Host是一台虚拟主机,而每个Host又可以有多个Context,代表每一个Web应用,Context包含多个Wrapper,每个Wrapper封装一个Java Servlet或者Jasper编译生成的Jsp Servlet。不管是哪一个层次的容器或子容器,都可以设置valve过滤链,处理公共流程。
【057扩展1 Tomcat连接器Connector】
Connextor一般需要指定协议如protocol="HTTP/1.1"、监听端口号port="8080"、连接超时如connectionTimeout="20000"、把客户请求转发至SSL的redirectPort="8443"以及线程池executor="tomcatThreadPool"。线程池可以是多个Connector共享的,也可独占,需要指定maxThreads和minSpareThreads。
【057扩展2 Tomcat虚拟主机Host】
如果把所有web站点的目录都放在webapps下,可能导致磁盘空间不够用,也不利于对web站点目录的管理,把web站点的目录分散到其他磁盘管理就需要配置虚拟目录(默认情况下,只有配置在Host的appBase中的目录,也就是webapps下的目录才能被Tomcat自动管理成一个web站点)。在server.xml中<Host>的节点下添加<Context path="/web1" docBase="D:\web1"/>,path表示访问应用名,docBase表示绝对路径。
【057扩展4 什么是Jasper?】
Jasper的作用是把Jsp文件转为servlet,存放在Tomcat的Work目录下,每个应用会有一个独立的子目录。转换过程发生在Server的监听器JasperListener。
【推荐文章】https://blog.csdn.net/u012906938/article/details/36718809
【058 Tomcat的生命周期】
Tomcat自带的所有组件都继承了Lifecycle接口,实现start和stop方法。Tomcat是通过BootStrap来实现启停的,继承了Lifecycle接口的类会采用观察者模式,通过事件通知的方式来启动和停止。以Context为例,其内部还有一个LifcycleSupport类型的成员,该类型维护了一个LifecycleListener的数组,调用Context的start和stop方法时,除了会通知所属的Wrapper和Valve组件,还会通知该数组的所有成员触发内部注册的lifecycle的start和stop方法。
【059 Tomcat的设计模式】
①单例模式的扩展StringManager,每个包有一个共享的单例String配置信息;
②装饰者模式ResponseFacade/RequestFacade,封装了Response和Request中希望对Tomcat开发者公开但是对Web开发者屏蔽的函数,因此不能简单地用public/private权限,如对请求的readLine等解析方法;
③ 责任链模式管道与阀门;
④ 观察者模式lifecycle。
【060 Tomcat的Connector运行模式】
BIO、NIO、APR三种。BIO是默认的,修改为NIO只需要修改connector的协议,例如将协议Http11Protocol修改为Http11NioProtocol;APR是从操作系统级别来解决异步的IO问题,利用中断的方式主动处理请求,需要安装APR和native,协议修改为Http11AprProtocol。
【061 Tomcat的调优方案】
Tomcat调优可以从JVM虚拟机和Tomcat自身两个层面进行优化:
① JVM方面,主要是考虑内存大小,调整堆空间,Tomcat默认可以使用的内存为128MB。应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出。在bin目录下的catalina.bat或catalina.sh,设置JAVA_OPTS=-Xms初始化内存大小 -Xmx可以使用的最大内存,一般建议堆的最大值设置为可用内存的最大值的80%,另外[初始化内存大小]等于[可以使用的最大内存],这样可以减少平凡分配堆而降低性能。
② Tomcat方面,主要是连接器Connector的优化,通过修改minProcessors和maxProcessors的值来控制线程数,通常Windows是1000个左右,Linux是2000个左右。