Spring Boot 3 + Undertow 服务器优化配置

优化背景

当你的application需要支持瞬时高并发的时候,tomcat已经不在是最优的选择,我们可以改为Undertow,并对其进行优化。

Undertow 是一个轻量级的、高性能的Java Web 服务器,由JBoss 开发并开源。它是基于非阻塞(non-blocking)的I/O模型,具有低资源消耗和高并发处理能力。

SpringBoot3如何从tomcat改为undertow

需要在pom.xml中排除Tomcat,并添加Undertow的依赖:

<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 或 application.properties 中添加以下配置:

server:undertow:# 线程池配置threads:# I/O线程数(建议设置为CPU核心数的1-2倍)io: 16# 工作线程数(建议设置为CPU核心数的8-16倍)worker: 256# 缓冲池配置buffer-size: 1024# 是否直接使用内存作为缓冲区direct-buffers: true

限制接口超时时间

server:undertow:# 请求超时设置(毫秒)no-request-timeout: 30000# 连接空闲超时(毫秒)idle-timeout: 60000

限制请求体大小不超过2KB

server:undertow:# 限制HTTP POST请求体大小(2KB=2048字节)max-http-post-size: 2048

请求压缩配置

SpringBoot的server compression功能用于减少响应数据的大小,从而提高传输效率,减少带宽占用,加快页面加载速度。它通常使用GzipDeflate等压缩算法来优化HTTP响应。

作用

  1. 减少数据传输量:压缩后数据体积更小,降低网络开销。

  2. 提高加载速度:特别适用于前端页面、API接口等场景。

  3. 降低服务器负载:减少数据传输时间,提高服务器吞吐量。

  4. 优化用户体验:页面加载更快,提升访问流畅度。

推荐配置

在SpringBoot的application.ymlapplication.properties中启用压缩:

server:compression:enabled: true  # 开启压缩min-response-size: 1024  # 触发压缩的最小响应大小(默认2KB)mime-types: application/json, text/html, text/xml, text/plain, text/css, application/javascript  # 需要压缩的内容类型excluded-user-agents: IE6, IE7  # 排除旧版浏览器

启用HTTP/2 (需要SSL支持)

server:http2:enabled: true

Undertow 访问日志配置

server:undertow:accesslog:enabled: truedir: ./logsprefix: access_log.suffix: .logpattern: '%t %a "%r" %s (%D ms)'rotate: true
 

监控与调优建议

  1. 监控线程池状态:通过JMX或Actuator监控线程池使用情况

  2. 压力测试:使用JMeter或wrk进行负载测试,观察线程池表现

  3. JVM调优:根据负载情况调整JVM堆内存和GC参数

  4. 连接池调优:如果使用数据库,确保连接池配置与服务器线程数匹配 (SpringBoot3 + Druid + DynamicDataSource + PgSQL 连接池优化方案-CSDN博客)

附录:Undertow配置属性

Spring Boot 预置了很多属性,可用于在 applicaton.properties | yaml 中对 Undertow 服务器进行个性化配置。

它们都以 server.undertow.* 开头,总结如下:

配置项说明示例
server.undertow.accesslog.dirUndertow 访问日志目录。
server.undertow.accesslog.enabled是否启用访问日志。false
server.undertow.accesslog.pattern访问日志的格式。common
server.undertow.accesslog.prefix日志文件前缀。access_log.
server.undertow.accesslog.rotate是否开启日志滚动。true
server.undertow.accesslog.suffix日志文件后缀。log
server.undertow.always-set-keep-alive是否应在所有响应中添加 Connection: keep-alive Header,即使 HTTP 规范没有要求。true
server.undertow.buffer-size每个 buffer 的大小。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.decode-slash是否应解码已编码的斜线字符(%2F)。如果前端代理不执行相同的解码,解码可能会导致安全问题。只有在传统应用程序需要时才启用。设置后,server.undertow.allow-encoded-slash 无效。
server.undertow.decode-url是否对 URL 进行解码。禁用时,URL 中的百分比编码字符将保持原样。true
server.undertow.direct-buffers是否在 Java 堆外分配 buffer。默认大小是根据 JVM 可用的最大内存确定的。
server.undertow.eager-filter-init是否应在启动时初始化 servlet Filtertrue
server.undertow.max-cookies允许的最大 cookie 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。200
server.undertow.max-headers允许的最大 header 数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.max-http-post-sizeHTTP post content 的最大大小。当值为-1(默认值)时,大小为无限。-1B
server.undertow.max-parameters允许查询或路径参数的最大数量。这一限制是为了防止基于哈希碰撞的 DOS 攻击。
server.undertow.no-request-timeout在服务器关闭连接之前,连接在不处理请求的情况下闲置的时间。
server.undertow.options.server.*在 io.undertow.UndertowOptions 中定义的服务器选项。
server.undertow.options.socket.*在 org.xnio.Options 中定义的 socket 选项。
server.undertow.preserve-path-on-forward转发请求时是否保留请求路径。false
server.undertow.threads.ioI/O 线程数。默认值为可用的处理器数量。
server.undertow.threads.workerWorker 线程数。默认为 I/O 线程数的 8 倍。
server.undertow.url-charset用于解码 URL 的字符集。UTF-8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 Python pyttsx3实现文字转语音(TTS)

今天&#xff0c;我想跟大家分享如何利用 Python 编程语言&#xff0c;来实现文字转换为语音的功能&#xff0c;也就是我们常说的 Text-to-Speech (TTS) 技术。 你可能会好奇&#xff0c;为什么学习这个&#xff1f;想象一下&#xff0c;如果你想把书本、文章、杂志的内容转换…

vue修改了node_modules中的包,打补丁

1、安装patch npm i patch-package 安装完成后&#xff0c;会在package.json中显示版本号 2、在package.json的scripts中增加配置 "postinstall": "patch-package" 3、执行命令 npx patch-package 修改的node_modules中的包的名称 像这样 npx patch-packag…

Vue3快速入门/Vue3基础速通

Vue3 渐进式的javascript框架&#xff0c;我们可以逐步引入vue的功能 官方文档 Vue.js中文手册 你可以借助 script 标签直接通过 CDN 来使用 Vue&#xff1a; <script src"https://unpkg.com/vue3/dist/vue.global.js"></script>通过 CDN 使用 Vue 时…

[人机交互]理解界面对用户的影响

零.重点 – 什么是情感因素 – 富有表现力的界面 – 用户的挫败感 – 拟人化在交互设计中的应用 – 虚拟人物&#xff1a;代理 一.什么是情感方面 情感是指某事物对心理造成的一种状态 二.计算机科学中存在的两个相关的研究领域 2.1情感计算 机器如何能感知其他代理的情感&…

Ubuntu22.04及以上版本buildroot SIGSTKSZ 报错问题

本文提供一种解决 Buildroot SIGSTKSZ 报错途径 解决途径来源参考&#xff1a;Buildroot error when building with Ubuntu 21.10 其出现原因在于 GNU C Library 2.34 release announcement&#xff1a; Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…

Spark处理过程-案例数据清洗

&#xff08;一&#xff09;需求说明 准备十条符合包含用户信息的文本文件&#xff0c;每行格式为 姓名,年龄,性别&#xff0c;需要清洗掉年龄为空或者非数字的行。 例如&#xff1a; 张三,25,男 李四,,女 王五,30,男 赵六,a,女 孙七,35,男 周八,40,女 吴九,abc,男 郑十,45,女…

多模态大语言模型arxiv论文略读(六十五)

VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ➡️ 论文标题&#xff1a;VS-Assistant: Versatile Surgery Assistant on the Demand of Surgeons ➡️ 论文作者&#xff1a;Zhen Chen, Xingjian Luo, Jinlin Wu, Danny T. M. Chan, Zhen Lei, Jinqi…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…

算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

150. 逆波兰表达式求值 题目 思路与解法 第一思路&#xff1a; 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …

原生 IP(Native IP)

目录 一、核心特点 二、原生 IP 的常见应用 三、原生 IP vs. 数据中心 IP 四、如何获取原生 IP&#xff1f; 五、原生 IP 的优缺点 六、实际案例 原生 IP&#xff08;Native IP&#xff09; 是指由互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的 IP 地址&…

k8s的pod挂载共享内存

k8s的pod挂载共享内存&#xff0c;限制不生效问题&#xff1a; 注&#xff1a;/dev/shm 是 Linux 系统中用于共享内存的特殊路径。通过将 emptyDir 的 medium 设置为 Memory&#xff0c;可以确保 /dev/shm 正确地挂载到一个基于内存的文件系统&#xff0c;从而实现高效的共享内…

DOCX转PDF怎么操作最简单?快速将DOCX转换为专业PDF文档

在日常办公或学习中&#xff0c;我们经常需要将 Word 文档&#xff08;.docx格式&#xff09;转换为 PDF 文件。这不仅有助于保持文档格式的一致性&#xff0c;还能确保接收者无需特定软件即可查看文件内容。本文将详细介绍几种常见的方法来实现从 DOCX 到 PDF 的转换&#xff…

VUE+ElementUI 使用el-input类型type=“number” 时,取消右边的上下箭头

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 在项目中有时候需要输入框的type“number”&#xff0c;这个时候&#xff0c;输入框的右边就会出现两个按钮&#xff0c;这两个按钮可以递增/递减&#xff0c;但是这样输入框看上去就不太美观&#x…

深入浅出理解常见的分布式ID解决方案

目录 UUID 自增ID 数据库多主模式 号段模式 Redis 雪花算法 百度 UIDgenerator 美团Leaf 滴滴TinyID 实战中的分布式ID生成器&#xff01;保障数据唯一性的核心组件 怎么编写Lua脚本是关键 怎么执行&#xff1f; 总结 分布式ID在构建大规模分布式系统时扮演着至关…

技术视界 | 青龙机器人训练地形详解(一):如何创建一个地形

机器人强化学习中的地形训练是利用强化学习算法让机器人在不同地形环境中通过试错学习最优行为策略的过程&#xff0c;通过环境建模、策略学习与优化等环节&#xff0c;使机器人能够自主适应复杂多变的地形&#xff0c;提高其移动效率、稳定性和自主性&#xff0c;减少人为干预…

【SGL】Scatter-Gather List内存传输技术

文章目录 1. What is SGL&#xff1f;2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL&#xff1f; sgl&#xff08;Scatter-Gather List&#xff09;内存传…

10.idea中创建springboot项目_jdk17

10.idea中创建springboot项目_jdk17 一、前期准备 安装与配置&#xff1a; 确保已安装 IntelliJ IDEA配置好 JDK17 二、创建 Maven 项目 新建项目&#xff1a; 点击 File → New → Project&#xff0c;选择左侧的 Maven。填写项目名称&#xff08;如 demo&#xff09;、存…

如何使用极狐GitLab 软件包仓库功能托管 ruby?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 Ruby gems (BASIC ALL) WARNING:Ruby gems 软件包库正在开发中&#xff0c;由于功能有限&#xff0c;尚未准备好…

LeetCode 热题 100 131. 分割回文串

LeetCode 热题 100 | 131. 分割回文串 大家好&#xff0c;今天我们来解决一道经典的回溯算法问题——分割回文串。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求将一个字符串 s 分割成若干个子串&#xff0c;使得每个子串都是回文串&#xff0c;并返回所有可能的分割…

〖 Linux 〗操作系统进程管理精讲(2)

文章目录 1、环境变量基本概念常见环境变量查看环境变量方法测试 PATH测试 HOME和环境变量相关的命令环境变量的组织方式<p align"center">main 函数的三个参数通过代码获得环境变量通过系统调用获取环境变量环境变量通常是具有全局属性的 2、程序地址空间2.1 …