- Maven集成Tomcat插件启动的分析
我们来分析下,就一个插件能跑起来Tomcat。
第一:是不是本身就引入了Tomcat源码,我们来看下tomcat-embed-core这个包就已经把Tomcat的代码放入了,我们来看看。
第二:肯定有一个类能把Tomcat运行起来,我先来看看,没有bin目录,没有启动脚本,本身jar里面也不好这样做。我们就找啊找,直接Tomcat,居然找到这个类,这个类还有main方法。我们再来仔细分析下。
原来这个类把Tomcat的启动和加载全部实现在里面了。
1.位置:org.apache.catalina.startup.Tomcat
2.该类是public的。
3.该类有Server、Service、Engine、Connector、Host等属性。
4.该类有init()、start()、stop()、destroy()等方法。
使用Tomcat api来写一个tomcat嵌入式
public static void main(String[] args) throws Exception {
//把目录的绝对的路径获取到
String classpath = System.getProperty("user.dir");
System.out.println(classpath);
//D:\workspace-tomcat\tomcat-maven
//我们new一个Tomcat
Tomcat tomcat = new Tomcat();
//插件是6或者6以前的
//Embbedded
//设置Tomcat的端口
//tomcat.setPort(9090);
Connector connector = tomcat.getConnector();
connector.setPort(9091);
//设置Host
Host host = tomcat.getHost();
//我们会根据xml配置文件来
host.setName("localhost");
host.setAppBase("webapps");
//前面的那个步骤只是把Tomcat起起来了,但是没啥东西
//要把class加载进来,把启动的工程加入进来了
Context context = tomcat.addContext(host, "/", classpath);
if (context instanceof StandardContext) {
StandardContext standardContext = (c) context;
standardContext.setDefaultContextXml("D:/tools/apache-tomcat-8.0.52/conf/web.xml");
//我们要把Servlet设置进去
Wrapper wrapper = tomcat.addServlet("/", "DemoServlet", new DemoServlet());
wrapper.addMapping("/sam");
}
//Tomcat跑起来
tomcat.start();
//强制Tomcat server等待,避免main线程执行结束后关闭
tomcat.getServer().await();
}
Tomcat优化
优化性能的三个指标:
- 降低响应时间
- 提高系统吞吐量(QPS)
- 提高服务的可用性
性能优化的原则
-
具体情况具体分析
-
积少成多
tomcat中的Server.xml
-
Connector连接器的I/O模型 连接器模式改为NIO模式. NIO模式最大化压榨了CPU,把时间片更好利用起来 NIO适合大量长连接
-
关闭自动重载 关闭自动重载,默认是true(不同版本中有差异) 自动加载增加运行开销并且很容易内存溢出
-
配置线程池
-
Executor标签中属性
- namePrefix 线程命名前缀
- maxThreads最大允许线程数
- minSpareThreads最少空闲线程,相当于初始化的线程,线程池中的线程
-
Connector标签中的属性
- executor对上面Executor标签标签的引用
-
Tomcat中web.xml优化
servlet优化
- 当前应用是REST应用(微服务):
- 去掉不必要的资源:JspServlet
- seesion也可以移除
valve优化:
-
移除掉AccessLogValve
-
valve实现都需要消耗java应用的计算时间,一般我们可以使用nginx来记录日志