Tomcat介绍
简单的介绍下tomcat平时会用到的几个知识点。也是自己看别人博客做的一个总结
配置文件
最常用的配置文件有server.xml和web.xml。前者主要是server的配置,后者主要是servlet,和映射的。主要介绍的server.xml。
首先介绍下他常用的几个节点:
server:代表着一个服务器,类似于一个JVM的存在,他可以包含多个service节点。主要的属性有port,shutdown。主要的作用就是让运维可以通过telnet到你所配置的这个端口进行关闭容器。
service:主要的作用就是把引擎和链接给关联起来(即放到一个service下面)
Connector:链接。这个节点是为了适应tomcat不同的工作模式(有2中,一个是当做应用服务器 请求来自web服务器,服务器可能是Apache,Nginx。一个是独立服务器 请求来自web浏览器),配置多种连接器来完美的响应不同的工作模式。常见的连接器有4种。分别是HTTP,SSL,AJP,PROXY四种,通过配置Connector的protocol属性来确定使用哪种。
Connector常用可配置的属性:
address :指定改连接器监听的地址。
maxThreads : 支持的最大并发数.
prot : 改连接器监听的端口
protocol : 该链接器的协议,默认HTTP/1.1 .AJP需指定为AJP/1.3
connectionTimeout: 链接的超时时间,单位毫秒 ,默认一分钟
acceptCount : 队列的长度,当tomcat容器所有的线程均被使用时,可以吧请求放到该队列里。
redirectPort : 重定向端口,如果一个请求是HTTPS协议,但是被HTTP连接器所监听到。可以通过这个配置重定向到某个端口
enableLookups : 是否获取到客户端的主机名
Engine:引擎。其实就是一个servlet处理器的实例,默认是Catalina。Engine需要defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。比如说localhost。或者另外具体的ip。
host:接受请求的虚拟主机,主要的配置就是appbase :指定webapps路劲。autoDeploy: 放置在appbase目录下的应用程序是否自动发布。unpachWars :是否对webapps的war格式的归档文件进行展开。
context: 指定一个应用。通过dobase属性指出应用在tomcat的绝对路径。path属性来匹配请求连接。
tomcat启动的过程
首先是引导启动。开始调用org.apache.catalina.startop.BootStrap.class的main方法。
然后调用org.apache.catalina.startop.BootStrap.class的init方法。改方法主要是创建cataline的核心对象。首先根据calatine.properties配置文件来确定classloader。再通过这个loader来获取到org.apache.catalina.startup.Catalina这个类。以达到创建calatine的核心对象。并执行该类的设置loader方法。
然后是调用org.apache.catalina.startop.BootStrap.class的通过反射调用calatine的load方法。实际上是通过反射调用了catalina的load方法。 加载server.xml配置文件,然后给各个容器加上关系。
最后是调用org.apache.catalina.startop.BootStrap.class的通过反射调用calatine的start方法
tomcat的一个连接的请求过程。
一个连接(localhost(Engine配置):8080(connector配置)/wechat(context配置)/test/index.jsp(servlet映射))从web端发送过来被tomcat的连接器锁连接,然后分配给改service下的engine,等待engine的响应。engine获得该请求,并和host进行匹配。这个连接会匹配到localhost的host。如果没有匹配到会进入到默认的host。host获得we chat/test/index.jsp.。然后用这个区匹配context里配置的path进行匹配,如果没有匹配到就匹配默认的context(即path为“”的context)。在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。然后构造request和response。最后通过处理之后吧response按照这个相反的顺序返回给浏览器。
connector是如何接受请求的呐?
首先connector可以分为3个模块,分别是EndPoint,process,Adatepr。EndPonit主要就是实现了TCP/IP协议,处理底层的socket的连接。然后把socket发送给process。process实现了HTTP协议,可以吧socket包装成HttpServletRequest交给Adatepr处理。Adatepr通过适配给对应的servlet进行处理。在Container下面各个容器采用的是责任制模式(类似与流水线的工作一样)来处理,每个容器都有自己的通道,每个通道的最后都有个一个basevalue。这个basevalue会指向下一个容器,直到是Wrapper容器会创建一个FilterChina。这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理。
Container下面的四个容器
Engine:引擎 。管理多个站点,一个service最多只有一个Engine;
Host:站点。也可以叫虚拟主机,通过配置Host就可以添加站点;
Context:代表一个引用程序,像biz-ins-oss。
Wrapper:指定一个Servlet。
**
tomcat的优化
**
首先是运行模式,有三种
1.bio 最基础的io方式,效率低下
2.nio java1.4之后出现的新io,有缓存并是非阻塞的io方式,所以效率会比bio高的多
3.apr
默认的应该都是bio模式 ,启动nio的方式是吧connector节点的protocol改成org.apache.coyote.http11.Http11NioProtocol;
其次是打开线程池的功能,并在connector指定使用哪个线程池,属性是executor,打卡线程池功能就是在sever.xml里的service节点下 新增Executor节点,常见的属性有name(类似于id,确保唯一性),namePrefix(线程名称前缀),maxThreads(最大的线程数),minSpareThreads(最小的空闲线程数),maxIdleTime(空闲的线程最多的空闲时间,超过这个时间就会被销毁)。