当前位置: 首页 > news >正文

Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南

文章目录

    • 引言
    • 一、嵌入式服务器核心原理
      • 1.1 架构设计特点
      • 1.2 主流服务器对比
    • 二、嵌入式服务器配置实战
      • 2.1 基础配置模板
      • 2.2 HTTPS安全配置
    • 三、高级调优策略
      • 3.1 线程池优化(Tomcat示例)
      • 3.2 响应压缩配置
      • 3.3 访问日志配置
    • 四、服务器切换实战
      • 4.1 切换至Undertow服务器
      • 4.2 Undertow性能优化配置
    • 五、容器健康监控
      • 5.1 Actuator端点监控
      • 5.2 可视化监控方案
    • 六、生产环境最佳实践
    • 七、常见问题排查指南
      • 7.1 端口冲突问题
      • 7.2 内存泄漏检测
    • 总结

引言

在传统Java Web开发中,部署WAR包到外部Web服务器的流程复杂且低效。Spring Boot通过**嵌入式服务器(Embedded Server)**机制彻底改变了这一现状,使得应用打包即包含完整运行时环境。本文将深入剖析Spring Boot嵌入式服务器的技术原理,并通过实战案例演示各种进阶配置技巧。


一、嵌入式服务器核心原理

1.1 架构设计特点

  • 无外部依赖:将Servlet容器(Tomcat/Jetty/Undertow)作为应用依赖打包
  • 即插即用:通过starter依赖自动装配服务器实例
  • 统一生命周期:应用启动时自动初始化服务器

1.2 主流服务器对比

特性TomcatJettyUndertow
默认版本10.x11.x2.x
内存占用中等较低最低
吞吐量优秀良好卓越
异步支持Servlet 3.1+原生异步IO基于XNIO
WebSocket性能标准实现高性能最佳性能
适用场景传统Web应用高并发长连接资源敏感型应用

二、嵌入式服务器配置实战

2.1 基础配置模板

# application.properties# 服务器基础配置
server.port=8080
server.servlet.context-path=/api
server.connection-timeout=30s# Tomcat专属配置
server.tomcat.max-threads=200
server.tomcat.accept-count=100
server.tomcat.uri-encoding=UTF-8# Undertow专属配置
server.undertow.io-threads=16
server.undertow.worker-threads=64

2.2 HTTPS安全配置

@Bean
public ServletWebServerFactory servletContainer() {TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();factory.addAdditionalTomcatConnectors(createSslConnector());return factory;
}private Connector createSslConnector() {Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();try {File keystore = new ClassPathResource("keystore.jks").getFile();connector.setScheme("https");connector.setSecure(true);connector.setPort(8443);protocol.setSSLEnabled(true);protocol.setKeystoreFile(keystore.getAbsolutePath());protocol.setKeystorePass("changeit");protocol.setKeyAlias("tomcat");return connector;} catch (Exception ex) {throw new IllegalStateException("SSL配置失败", ex);}
}

三、高级调优策略

3.1 线程池优化(Tomcat示例)

# application.yml
server:tomcat:threads:max: 500          # 最大工作线程数min-spare: 50     # 最小空闲线程connection-timeout: 5000msmax-connections: 10000accept-count: 500   # 等待队列长度

3.2 响应压缩配置

# 启用GZIP压缩
server.compression.enabled=true
server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/json
server.compression.min-response-size=1024

3.3 访问日志配置

@Bean
public TomcatServletWebServerFactory tomcatFactory() {return new TomcatServletWebServerFactory() {@Overrideprotected void postProcessContext(Context context) {AccessLogValve valve = new AccessLogValve();valve.setPattern("%t %a %r %s (%D ms)");valve.setDirectory("logs");valve.setSuffix(".access.log");context.getPipeline().addValve(valve);}};
}

四、服务器切换实战

4.1 切换至Undertow服务器

<!-- pom.xml -->
<dependencies><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>
</dependencies>

4.2 Undertow性能优化配置

# Undertow高级参数
server.undertow.buffer-size=1024
server.undertow.direct-buffers=true
server.undertow.eager-filter-init=true
server.undertow.max-http-post-size=10MB

五、容器健康监控

5.1 Actuator端点监控

# 启用健康检查端点
management.endpoints.web.exposure.include=health,metrics
management.endpoint.health.show-details=always# 自定义健康指标
@Component
public class ServerHealthIndicator implements HealthIndicator {@Overridepublic Health health() {// 检查服务器状态return Health.up().withDetail("activeSessions", 42).build();}
}

5.2 可视化监控方案

@Bean
public MeterRegistryCustomizer<PrometheusMeterRegistry> metricsCommonTags() {return registry -> registry.config().commonTags("application", "spring-boot-server","container", "embedded-tomcat");
}

六、生产环境最佳实践

  1. 内存限制策略
    JVM参数建议配置:

    -Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m
    
  2. 优雅停机配置

    server.shutdown=graceful
    spring.lifecycle.timeout-per-shutdown-phase=30s
    
  3. 连接池优化

    spring:datasource:hikari:maximum-pool-size: 20connection-timeout: 30000idle-timeout: 600000
    
  4. 容器版本管理
    在pom.xml中显式指定容器版本:

    <properties><tomcat.version>10.0.27</tomcat.version>
    </properties>
    

七、常见问题排查指南

7.1 端口冲突问题

# Linux/Mac查询端口占用
lsof -i :8080# Windows查询端口占用
netstat -ano | findstr :8080

7.2 内存泄漏检测

@RestController
public class MemDebugController {@GetMapping("/heapdump")public void getHeapDump(HttpServletResponse response) throws IOException {HeapDumper.dumpHeap("heap.hprof", true);FileCopyUtils.copy(new FileInputStream("heap.hprof"), response.getOutputStream());}
}

总结

Spring Boot嵌入式服务器的优势:

  • 部署效率提升:单JAR包部署,无需安装Web服务器
  • 资源利用率优化:根据应用需求选择最佳容器
  • 快速水平扩展:天然适合容器化部署
  • 配置灵活性:细粒度的性能调优参数

相关文章:

Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南

文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化&#xff08;Tomcat示例&#xff09;3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…...

深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)

本文以https://example.com为例&#xff0c;逐层剖析浏览器从输入URL到页面渲染的完整链路&#xff0c;涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段&#xff0c;结合代码示例与性能调优技巧&#xff0c;助你掌握浏览器底层运行机制。 一、导航阶段&#xff1…...

【网络安全】常见的web攻击

1、SQL注入攻击 定义&#xff1a; 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;当服务器利用参数构建SQL语句的时候&#xff0c;恶意的SQL代码被一起构建,并在数据库中执行。 示例&#xff1a; 用户登录&#xff1a; 输入用户名xx&#xff0c; 密码 or 1 …...

MySQL面试学习

MySQL 1.事务 事务的4大特性 事务4大特性&#xff1a;原子性、一致性、隔离性、持久性 原⼦性&#xff1a; 事务是最⼩的执⾏单位&#xff0c;不允许分割。事务的原⼦性确保动作要么全部完成&#xff0c;要么全不执行一致性&#xff1a; 执⾏事务前后&#xff0c;数据保持⼀…...

一文读懂Docker之Docker Compose

目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…...

escape SQL中用法

select * from tablename where username like %#%% escape # 这个的意思就是&#xff0c;escape指定字符#&#xff0c;#字符后面的第一个字符被认为是普通字符 查询示例2 查询username字段中包含[的数据也是一样&#xff0c;即&#xff1a; select * from tablename where us…...

Cherno C++ P57 Standard array处理静态数组

这篇文章当中我们讲一下如何使用C自带的standard array来处理静态数组。 首先什么是静态数组&#xff0c;静态数组通常指的是不会增长的数据&#xff0c;长度是已经确定了的。我们在定义数组的时候就必须确定好长度与类型。 其次C当中也确实给我们提供了一些可以用来处理静态…...

linux学习【7】Sourc Insight 4.0设置+操作

目录 1.Source Insight是什么&#xff1f;2.需要哪些配置&#xff1f;3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了&#xff0c;下面的设置会标明设置理…...

JDK、Hadoop下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡 三、Hadoop Apache Download Mirrors...

【小白向超详细】使用 VSCode 远程连接 Linux 服务器详细教程

使用 VSCode 远程连接 Linux 服务器详细教程 前提条件 已安装 VSCode。已在 VSCode 中安装 Remote - SSH 插件。目标 Linux 服务器 开启了 SSH 服务&#xff0c;并可以通过 SSH 访问。本地电脑已安装 SSH 客户端&#xff08;Linux 和 macOS 自带&#xff0c;Windows 用户可以…...

设计心得——解耦的实现技术

一、说明 在前面的“设计心得——解耦”中&#xff0c;对解耦进行了高层次的抽象说明。本篇则对在实践中常用的解耦技术进行逐一分析说明&#xff0c;以期为开发者能更从理论到实践搭建一个桥梁。至于大家能够如何更好的在自己的项目中进行解耦的实践&#xff0c;就需要不断的…...

计算机毕业设计SpringBoot+Vue.jst在线文档管理系统(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …...

一文讲解Redis为什么读写性能高以及I/O复用相关知识点

Redis为什么读写性能高呢&#xff1f; Redis 的速度⾮常快&#xff0c;单机的 Redis 就可以⽀撑每秒十几万的并发&#xff0c;性能是 MySQL 的⼏⼗倍。原因主要有⼏点&#xff1a; ①、基于内存的数据存储&#xff0c;Redis 将数据存储在内存当中&#xff0c;使得数据的读写操…...

TPU(Tensor Processing Unit)详解

一、什么是TPU&#xff1f; TPU&#xff08;Tensor Processing Unit&#xff0c;张量处理器&#xff09;是谷歌专门为机器学习任务设计的定制化ASIC芯片&#xff0c;旨在加速神经网络训练与推理。其核心目标是针对矩阵运算&#xff08;如矩阵乘加&#xff09;优化硬件架构&…...

Ubuntu20.04.2安装Vmware tools

软件版本&#xff1a;Vmware Workstation Pro 17.6.2 操作系统镜像文件&#xff1a;ubuntu-20.04.2-desktop-amd64 方式1&#xff1a;用iso镜像安装 没用这种方法&#xff0c;太麻烦 方式2&#xff1a;用apt安装Open VM Tools 如果你使用的是较新的Ubuntu版本&#xff08;如…...

检测服务端口是否开放的常用方法

检测服务端口是否开放的常用方法 文章目录 检测服务端口是否开放的常用方法背景使用nc命令使用 telnet 命令使用 curl 命令使用 openssl 命令使用 Python 脚本,socket连接使用 bash 内建命令:使用 nmap:总结 背景 有时候需要测试网络是否连通&#xff0c;端口是否开放&#xf…...

muduo源码阅读:socket常见操作及一些补充

TCP连接和释放 一个典型的TCP连接、通信过程&#xff1a; &#xff08;假设有资源的一端是服务器端&#xff09; 服务器会启用一个监听循环&#xff0c;不断接受client连接请求(三次握手建立连接), 进行数据通信&#xff0c;通信完成以后断开连接(四次挥手断开连接)。 对于…...

虚拟表格实现全解析

在数据展示越来越复杂的今天&#xff0c;大量数据的渲染就像是“满汉全席”——如果把所有菜肴一次性摆上桌&#xff0c;既浪费资源也让人眼花缭乱。幸运的是&#xff0c;我们有两种选择&#xff1a; 自己动手&#xff1a;通过二次封装 Element Plus 的表格组件&#xff0c;实…...

使用 Grafana 监控 Spring Boot 应用

随着软件开发领域的不断发展&#xff0c;监控和可观测性已成为确保系统可靠性和性能的关键实践。Grafana 是一个功能强大的开源工具&#xff0c;能够为来自各种来源的监控数据提供丰富的可视化功能。在本篇博客中&#xff0c;我们将探讨如何将 Grafana 与 Spring Boot 应用程序…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...