tomcat安装与undertow

一、前置条件

   先安装jdk,详见参考文章

二、Linux上安装tomcat

1. 下载Apache tomcat

    tomcat官网下载地址

    在左边,可以选择下载各种版本的tomcat。根据服务器操作系统选择下载。Linux操作系统就下载tar.gz包。

    我下载的文件名是:apache-tomcat-8.5.37.tar.gz

2. 上传服务器、解压缩tomcat

    使用Xftp等工具将tar.gz压缩包上传到 /usr/local 目录中,以下操作命令都需要在root账户下操作。

    进入目录解压安装包

    进入目录:cd /usr/local

    解压文件:tar -zxvf apache-tomcat-8.5.37.tar.gz  

    将目录apache-tomcat-8.5.37重命名为tomcat,方便一些

    重命名文件:mv apache-tomcat-8.5.37  tomcat

3. 正常启动

    进入tomcat的bin目录下面 ,执行: ./startup.sh 就会启动tomcat,在浏览器中访问http://ip:8080了,能看到经典的汤姆猫界面,说明访问成功。

4. 正常关闭

   进入tomcat的bin目录下面 ,执行: ./shutdown.sh  就会关闭tomcat

5. 修改tomcat配置

   进入 /usr/local/tomcat/conf 目录修改server.xml中的tomcat端口

   运行 vim server.xml,用“/8080”定位到8080端口。如下图:  


    可以修改端口,默认8080,然后按ESC键,然后按 :wq(注意有一个英文冒号),保存并退出。

6. 启动失败解决办法

    如果不能访问,说明没有开启8080端口

    先查看防火墙开放端口列表 firewall-cmd --zone=public --list-ports

    如果没有8080端口,添加端口

  •  如果是firewalld防火墙 ,开启防火墙端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent  并且重新加载防火墙 firewall-cmd --reload
  •  如果是iptables防火墙 ,执行 vi  /etc/sysconfig/iptables 加入下面内容 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

7. 其他一些问题 

   启动以后,可以利用命令 ps -ef|grep tomcat 查看tomcat是否正常启动。 

   如果正常启动以后,无法访问,可以先不修改8080端口,尝试用8080端口访问。如果可以通过8080端口正常访问,则说明8080端口被其他应用占用。 

   或者使用 netstat -an|grep 8080 命令查看是否有程序占用8080端口。需要看清楚,如果没用的话就Kill掉。

三、前言

在 SpringBoot 框架中,我们使用最多的是 Tomcat,这是 SpringBoot 默认的容器技术,而且是内嵌式的 Tomcat。

同时,SpringBoot 也支持 Undertow 容器,我们可以很方便的用 Undertow 替换 Tomcat,而 Undertow 的性能和内存使用方面都优于 Tomcat,那我们如何使用 Undertow 技术呢?本文将为大家细细讲解。

      

 undertow,jettytomcat可以说是javaweb项目当下最火的三款服务器,tomcat是apache下的一款重量级的服务器,不用多说历史悠久,经得起实践的考验。然而:当下微服务兴起,spring boot ,spring cloud 越来越热的情况下,选择一款轻量级而性能优越的服务器是必要的选择。spring boot 完美集成了tomcat,jetty和undertow,本文将通过对jetty和undertow服务器的分析以及测试,来比较两款服务器的性能如何。
  值得一提的是jetty和undertow都是基于NIO实现的高并发轻量级的服务器,支持servlet3.1和websocket。所以,有必要先了解下什么是NIO。

NIO(非阻塞式输入输出)


    Channel  
    Selector  
    Buffer      
    Acceptor 

  Client和Server只向Buffer读写数据不关注数据的流向,数据通过Channel通道进行流转。而Selector是存在与服务端的,用于Channel的注册以此实现数据I/O操作。Acceptor负责接受所以的连接通道并且注册到Channel中。而整个过程客户端与服务端是非阻塞的也就是异步操作。

下面是压力测试对比图:

服务器     命中     成功率     吞吐量     平均耗时
Jetty     11488     100% 96.25 trans/sec   0.00sec
Undertow11280100% 94.02 trans/sec0.00sec
Tomcat 10845 
100% 90.95 trans/sec 0.02sec

        从中可以看出在高负载下Undertow的吞吐量高于Jetty而且随着压力增大Jetty和Undertow成功率差距会拉大。而在负载不是太大情况下服务器处理能力差不多,jetty还略微高于Undertow。而tomcat的负载能力似乎和Undertow很接近。
  对比三个服务器发现在Undertow在负载过重情况下比Jetty和Tocmat更加顽强,实践证明在负载继续加大情况下Undertow的成功率高于其它两者,但是在并发不是太大情况下三款服务器整体来看差别不大。

SpringBoot 设置 Undertow

对于 Tomcat 技术,Java 程序员应该都非常熟悉,它是 Web 应用最常用的容器技术。我们最早的开发的项目基本都是部署在 Tomcat 下运行,那除了 Tomcat 容器,SpringBoot 中我们还可以使用什么容器技术呢?

没错,就是题目中的 Undertow 容器技术。SrpingBoot 已经完全继承了 Undertow 技术,我们只需要引入 Undertow 的依赖即可,如下所示。

更新pom.xml文件:           

            <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-starter-web</artifactId>-->
            <!--</dependency>-->
    
            <!-- 下面的配置将使用undertow来做服务器而不是tomcat -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-undertow</artifactId>
            </dependency>


application.yml配置:
    server:
      port: 8081
      # 下面是配置undertow作为服务器的参数
      undertow:
      # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
      io-threads: 4
      # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,值取决于系统的负载
      worker-threads: 20
      # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
      # 每块buffer的空间大小,越小的空间被利用越充分
      buffer-size: 1024
      # 是否分配的直接内存
      direct-buffers: true

经过测试发现,在高并发系统中,Tomcat 相对来说比较弱。在相同的机器配置下,模拟相等的请求数,Undertow 在性能和内存使用方面都是最优的。并且 Undertow 新版本默认使用持久连接,这将会进一步提高它的并发吞吐能力。所以,如果是高并发的业务系统,Undertow 是最佳选择。

最后

SpingBoot 中我们既可以使用 Tomcat 作为 Http 服务,也可以用 Undertow 来代替。Undertow 在高并发业务场景中,性能优于 Tomcat。所以,如果我们的系统是高并发请求,不妨使用一下 Undertow,你会发现你的系统性能会得到很大的提升。

本人亲测,试验成功!


全部评论