tomcat之嵌入式

202 阅读2分钟
  1. 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适合大量长连接

    截屏2020-06-23 下午3.53.06

  • 关闭自动重载 关闭自动重载,默认是true(不同版本中有差异) 自动加载增加运行开销并且很容易内存溢出

  • 配置线程池

    • Executor标签中属性

      • namePrefix 线程命名前缀
      • maxThreads最大允许线程数
      • minSpareThreads最少空闲线程,相当于初始化的线程,线程池中的线程
    • Connector标签中的属性

      • executor对上面Executor标签标签的引用

Tomcat中web.xml优化

servlet优化

  • 当前应用是REST应用(微服务):
    • 去掉不必要的资源:JspServlet
    • seesion也可以移除

valve优化:

  • 移除掉AccessLogValve

  • valve实现都需要消耗java应用的计算时间,一般我们可以使用nginx来记录日志