唐僧喜欢小龙女

导航

Tomcat 部署 war包以及Tomcat的理解

1、IDEA 把ssm项目打成一个war包

打开项目结构,找到Artifacts,点加号,找webapplication

 

 

 

 

 

 

此时 会在out/artifacts/ssm下出现一个ssm.war的包

2、把 ssm.war包部署在tomcat 目录下

 

启动tomcat

 

访问页面

 

3、服务发布后的调整

3.1 查看tomcat的日志

catalina.out 目录

3.2 设置应用的端口

1)war 包部署到 tomcat 时,server.port=9090 不生效,tomcat 运行时 访问端口 统一使用 tomcat 设置的端口 8080 等,位置是 D:\apache-tomcat-9.0.62\conf\server.xml

3.3 设置 访问路径为 localhost:8087/或者自定义访问路径

war 包部署到 tomcat时,tomcat 默认以 webapps下的文件夹来作为 context-path路径的,配置文件中的 context-path 只是对于 springboot 打包成 jar 包,才有用。

修改server.xml

 

 

在 根目录创建一个叫wars的文件夹,删除webapps 下的所有文件,把打好的war包ssm.war放在wars目录下,启动tomcat。

在 根目录创建一个叫wars的文件夹,删除webapps 下的所有文件,自定义Context标签中的 path 路径就行。

访问页面

4、应用打jar包是否需要tomcat

这里的意思是项目用的架构是Spring+Mybatis 不用SpringMVC,不和浏览器进行交互,所以不打war包 打jar包,运行方式是javar -jar就行

IDEA里面用Maven构建时需要再pom.xml配置打jar包的插件和打war包还不一样

  <build>
    <!--    jar bao de name   -->
    <finalName>JarPackageFileName</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <!--这里写你的main函数所在的类的路径名,也就是Class.forName的那个字符串-->
                  <mainClass>com.ali.gts.sofa.MyApp</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

5、Tomcat的理解和优化

  Tomcat 进程的名字 叫 org.apache.catalina.startup.Bootstrap,Tomcat是java语言写的。Tomcat优化的方向有两个优化方向

     1、tomcat 自身参数的优化 2、tomcat所运行的jvm的优化 

5.1 Tomcat 自身参数的优化

1、修改tomcat-users.xml配置文件,配置tomcat的管理用户
    tomcat/conf 目录下 的tomcat-users.xml 添加如下的代码
       <role rolename="manager-gui"/>
     <role rolename="manager"/>
       <role rolename="admin"/>
       <role rolename="admin-gui"/>
     <user username="tomcat" password="tomcat" roles="manager-gui,manager,admin,admin-gui"/>    

    保存退出

2、修改webapps/manager/META-INF/context.xml文件,修改后就可以登陆tomcat系统了,tomcat7 不用修改
    Context 这个标签下的value标签内容注视掉

3、此时可以启动tomcat了。
    此时http://localhost:8080 就可以方案tomcat 首页了


4、禁用AJP
    一般用不着所以会禁用掉
    tomcat/conf   server.xml 目录下 ajp的部分注释掉就行

5、tomcat线程池的配置
    在tomcat中 每一个用户请求都是一个线程,所以可以使用线程池提高性能
    还是修改server.xml就行

        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="50"  prestartminSpareThreads="true" 

        maxQueueSize="100"
        />
    
    参数说明
        maxThreads:最大并发数,默认是200 一般建议在500--1000 根据硬件设施和业务来判断
        minSpareThreads:tomcat 初始化时创建的线程数,默认设置是25
        prestartminSpareThreads: 在Tomcat 初始化的时候就初始化 minSpareThreads的参数值,如果不等于true,minSpareThreads
        的值就没有效果了
        maxQueueSize 最大的等待队列数,超过则拒绝请求
        namePrefix:线程前缀

    在Connector 中设置excutor 属性指向上面的执行器

               <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    
    在tomcat的 manager页面的 http-nio-8080 模块下发现 最大线程数是 -1,当前线程数是 50
        显示-1的原因是 我们配置了excuter 导致的,只要配置了excuter就显示是-1,是正常的,说明我们的执行器配置生效了

6、tomcat 3中运行模式
    分别是 bio、nio和apr三种模式
    1、bio   
        tomcat 8 以下都是bio 性能非常低下,没有经过任何优化处理和支持,建议改成nio的模式

    2、nio
        比 bio 性能好,性价比比较高,tomcat8 是中默认是nio,并且有最新的nio2,速度更快,建议使用nio2

        <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
               connectionTimeout="20000"
               redirectPort="8443" />   


        把原来的协议HTTP/1.1改掉
        
        重启tomcat
    3、此时 nio2 模式已经生效了  

7、tomcat的进程
    org.apache.catalina.startup.Bootstrap    


8、开始测试
    接口 return-string-ajax.do 
    第一次测试接口 禁用掉了ajp的服务
        吞吐量 757 /秒   rt 1168 

    第二次测试接口 
        吞吐量 652 /秒   rt 1232

    设置线程池
        1、最大线程数为500,初始化为50,最大队列等待数100,协议是nio2

            <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50"  prestartminSpareThreads="true" 

            maxQueueSize="100"
            />


            <Connector executor="tomcatThreadPool"  port="8087" protocol="org.apache.coyote.http11.Http11Nio2Protocol"
            connectionTimeout="20000"
            redirectPort="8443" />
        
            吞吐量 714 /秒   rt 1260

        

        2、最大线程数为1000,初始化为200,最大队列等待数100,协议是nio2

           
            <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="1000" minSpareThreads="200"  prestartminSpareThreads="true" 

            maxQueueSize="100"
            />


            <Connector executor="tomcatThreadPool"  port="8087"  protocol="org.apache.coyote.http11.Http11Nio2Protocol"
            connectionTimeout="20000"
            redirectPort="8443" />

            吞吐量 651 /秒   rt 1357 测试了三次发现 这次没有第一次好

        3、最大线程数为200,初始化为100,协议是nio2

            吞吐量 590 /秒   rt 1535 测试了三次发现 这次没有第一次好


        4、设置最大等待队列数为50
            默认情况下,请求发送到tomcat,如果tomcat忙,那么请求就会一直等待,如果设置了最大等待队列
            大小,如果等待队列也满了,那么请求就不等待了,虽然此时请求会失败 但是请求响应时间会缩短


            最大线程数为500,初始化为50,最大队列等待数50,协议是nio2

            <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
            maxThreads="500" minSpareThreads="50"  prestartminSpareThreads="true" 

            maxQueueSize="50"
            />

 

 

5.2、TomcatJVM参数的优化

        1、设置并行垃圾回收器 在 bin/catalina.sh 这个执行脚本里面 补充如下的代码

            年轻代、老年代均使用并行收集器,初始化堆内存64M,最大堆内存512M 垃圾处理器是并行的默认也是并行的
            JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms64m -Xmx512m -XX:+PrintGCDetails -XX
            :+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"
        
            位置cygwin=false前

            jps -lv | grep  进程号 看是否生效以及gc.log 是否生效
            压测结果
                fullgc 6次
                minorgc  105次

                说明年轻代大小需要调整,避免出现gc
                fullgc 6次 说明堆内存需要调整

            使用的是在线的gc分析工具 gceasy.io

        2、设置堆和年轻代大小
            堆初始化128m,最大堆内存1024m,初始化年轻代大小64m 最大年轻代大小 256m   

            JAVA_OPTS="-XX:+UseParallelGC -XX:+UseParallelOldGC -Xms128m -Xmx1024m -XX:NewSize=64m -XX:MaxNewSize=256m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"    


            此时发现 吞吐量 860 /秒  平均响应时间 1012 

            minorgc  47次
            fullgc 2次

            说明调整有效果


        3、使用G1垃圾回收器
            设置了最大停顿时间100毫秒,初始堆内存128m,最大堆内存1024m,这里年轻代相关的参数
            JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -Xms128m -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:../logs/gc.log"  


            此时发现 吞吐量 870 /秒  平均响应时间 1008

            理论上G1垃圾处理器比并行的垃圾处理器好


            调优要不断的测试,学会方法就行。

6、Tomcat配置数据库连接池

conf/context.xml中配置数据库连接信息

    <Resource name="jdbc/mysqlds"
        auth="Container"
        type="javax.sql.DataSource"
        username="root"
        password="root"
        maxIdle="30"
        maxWait="10000"
        maxActive="100"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://192.168.54.248:3306/mybatis" />

测试

<%--
  Created by IntelliJ IDEA.
  User: gaoheqiang
  Date: 2022/4/11
  Time: 9:28 AM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<%@ page import="java.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.sql.DataSource" %>


<html>
<head>
    <title>Title</title>
</head>
<body>

   hello.jsp, ${msg}

   Tomcat连接池测试,获取数据源 <br>
   <%
       try {
           //初始化查找命名空间
           Context ctx = new InitialContext();
           //参数java:/comp/env为固定路径
           Context envContext = (Context)ctx.lookup("java:/comp/env");
           //参数jdbc/mysqlds为数据源和JNDI绑定的名字
           DataSource ds = (DataSource)envContext.lookup("jdbc/mysqlds");
           Connection conn = ds.getConnection();

           PreparedStatement pstmt = null;//PreparedStatement对象
           String sql = " select * from t_emp ";//'?'动态设置
           pstmt = conn.prepareStatement(sql);//预编译sql语句
//           pstmt.setString(1,"hello");//第一个动态字段是String类型
//           pstmt.setInt(2,123);//第二个动态字段是int类型
           //pstmt.executeUpdate();//执行语句
           ResultSet resultSet = pstmt.executeQuery();

           while(resultSet.next()) {
               String column = resultSet.getString(3);
               out.println(column);

           }

           conn.close();
           out.println("<span style='color:red;'>JNDI测试成功<span>");


       } catch (NamingException e) {
           e.printStackTrace();
       } catch (SQLException e) {
           e.printStackTrace();
       }
   %>

   Tomcat连接池测试,获取数据源1 <br>

</body>
</html>

结果

 

7、新电脑拉取Servlet项目 IDEA的配置并启动项目

http://www.zztongyun.com/article/idea%E5%A6%82%E4%BD%95%E9%83%A8%E7%BD%B2web

 

posted on 2022-07-22 14:39  与时具进&不忘初心  阅读(4191)  评论(0编辑  收藏  举报