一、前置条件
先安装jdk,详见参考文章
二、Linux上安装tomcat
1. 下载Apache 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,jetty和tomcat可以说是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 |
Undertow | 11280 | 100% | 94.02 trans/sec | 0.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,你会发现你的系统性能会得到很大的提升。
全部评论