【高并发优化手段】基于Springboot项目

SpringBoot项目并发处理大揭秘,你知道它到底能应对多少请求洪峰? Spring 生态的重要性不用多说,Spring Boot 已经成为 Java 后端开发的"标准",但是一个Spring Boot 项目到底能同时应对多少请求呢?你有没有考虑过这个问题呢?这时你可能回文,处理的业务是什么?服务的配置是什么样的?使用的 WEB 容器是什么等等问题,当然我们说的是默认配置,即什么也不配置的情况下到底能应对多少并发请求?下面我们通过项目演示逐步深入到源码内部,带你去揭开谜底。 阅读详情
AI摘要

本文介绍高并发场景下Spring Boot的优化配置。先阐述选择合适机器及配置服务器参数,如TCP网络层、文件系统和内存参数;接着说明Tomcat配置,包括调整最大连接数、配置压缩和缓存;最后提及线程池配置,可提高系统并发处理能力。

优快云

📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、优快云博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。跑过十五公里、徒步爬过衡山、有过三个月减肥20斤的经历、是个喜欢躺平的狠人。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。
📙在优快云创作了上千篇文章后,和清华大学出版社签约四本书籍,于明年陆续出版⚡《Java项目实战—深入理解大型互联网企业通用技术》⚡基础篇、进阶篇、架构篇、📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚,具体出版计划根据实际情况调整,希望各位读者大大到时多多支持。

💂博客主页: 我是廖志伟 | 👉开源项目:java_wxid | 🌥哔哩哔哩:我是廖志伟 | 🔖个人微信号: SeniorRD

🤟 希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!如需转载或搬运文章,请私信我哈。
🍋今天是2023年10月14日,愿你在新的一周里能够保持专业素养,成为技术领域的佼佼者!

优快云

🌟 一、概述

Spring Boot是基于Spring Framework的快速开发框架,它提供了许多自动化的配置方法,使得开发者可以更加专注于业务逻辑的实现。

在高并发场景下,Spring Boot的配置也是非常重要的,需要对服务器、Tomcat、线程池等进行优化配置,以达到最优的性能。本文将介绍如何对Spring Boot进行优化配置,在高并发场景下实现最佳的性能表现。
场景如下:提供30秒内2万用户每秒5次请求的10万并发服务支持。

🌟 二、服务器配置

🍊 1. 选择合适的机器

在高并发场景下,选择合适的机器是非常重要的。首先,需要根据业务需求和预期QPS(每秒请求数)选择合适的机型,例如CPU、内存、硬盘、网络带宽等。

其次,为了提高性能,建议选择高并发优化的系统。例如,针对Java应用,可以选择专门针对Java应用优化的Linux操作系统,例如CentOS、Ubuntu等。

🍊 2. 配置服务器参数

在服务器上,可以根据实际情况调整以下参数:

🎉 (1)TCP网络层参数

可以设置以下参数,以提高服务器网络性能和稳定性:

①. TCP握手队列长度:默认为128,可以设置为1024,以处理更多的TCP连接请求。

②. TCP连接超时时间:默认为2小时,可以设置为3秒,以加快连接失败的响应速度。

③. TCP连接重试次数:默认为10次,可以设置为3次,以加快连接失败的响应速度。

📝 如何配置

在CentOS 7上,可以使用以下命令来配置TCP网络层参数:

  1. 打开配置文件/etc/sysctl.conf:
sudo vi /etc/sysctl.conf
  1. 添加或编辑以下参数:
# 设置虚拟内存超配值为 1,可以允许分配比实际物理内存更多的内存空间,从而提高应用程序性能,但可能导致 OOM 错误。为 0 时表示内存空间不足时直接拒绝申请
vm.overcommit_memory = 1
# 设置系统脏页(未写入磁盘的页面)达到多少字节时可以开始写入磁盘
vm.dirty_background_bytes = 8388608
# 设置系统脏页达到多少字节时必须写入磁盘
vm.dirty_bytes = 25165824
# 设置可以在后台写入磁盘的脏页占总脏页的比例(即总脏页数的2%)
vm.dirty_background_ratio = 2
# 设置当系统脏页占总内存的比例超过5%时,系统必须开始写入磁盘
vm.dirty_ratio = 5
# 设置系统判定一个脏页需要写入磁盘的时间,单位为centisecond,即2000分之一秒
vm.dirty_expire_centisecs = 2000
# 设置最小内存分配单位(单位为KB)
vm.min_free_kbytes = 8192
# 将虚拟内存的 overcommit 比率设置为80%
vm.overcommit_ratio = 80
# 设置堆内存溢出处理方式(0表示不紧急内存压缩,1表示紧急内存压缩,2表示杀死进程)
vm.panic_on_oom = 2
# 设置发送方socket buffer大小的最大值为16MB
net.core.wmem_max = 16777216
# 设置接收方socket buffer大小的最大值为16MB
net.core.rmem_max = 16777216
# 当TCP流量控制窗口溢出时,中止连接
net.ipv4.tcp_abort_on_overflow = 1
# 对于高延迟、高带宽的网络,开启窗口缩放
net.ipv4.tcp_adv_win_scale = 1
# 允许使用的TCP拥塞控制算法,可以使用cubic和reno算法
net.ipv4.tcp_allowed_congestion_control = cubic reno
# 应用程序socket buffer的大小,单位为Kbyte
net.ipv4.tcp_app_win = 31
# TCP发送数据时,自动开启corking模式
net.ipv4.tcp_autocorking = 1
# 允许使用的TCP拥塞控制算法,可以使用cubic和reno算法
net.ipv4.tcp_available_congestion_control = cubic reno
# 设置TCP数据包的最小大小,单位为byte
net.ipv4.tcp_base_mss = 512
# 发送方最多允许发送多少个SYN报文段作为challenge ack防范syn flood攻击
net.ipv4.tcp_challenge_ack_limit = 1000
# TCP使用的拥塞控制算法,可以使用cubic算法
net.ipv4.tcp_congestion_control = cubic
# 开启对方乱序数据的确认,以降低网络延迟
net.ipv4.tcp_dsack = 1
# 当检测到丢包时,提前触发重传
net.ipv4.tcp_early_retrans = 3
# 开启ECN(Explicit Congestion Notification)拥塞控制算法
net.ipv4.tcp_ecn = 2
# 使用FACK(Forward Acknowledgment)作为拥塞控制算法的一部分
net.ipv4.tcp_fack = 1
# 开启TCP Fast Open,以加快连接速度
net.ipv4.tcp_fastopen = 3
# 设置TCP Fast Open使用的密钥,可以使用随机数生成器生成
net.ipv4.tcp_fastopen_key = 6d0c41a3-123fdf85-a7f901e8-59fea180
# TCP连接关闭的超时时间,单位为秒
net.ipv4.tcp_fin_timeout = 10
# 开启TCP Fast Recovery防止网络拥塞
net.ipv4.tcp_frto = 2
# 设置TCP连接每秒允许的最大无效数据包数,超过该值则降低发送速度
net.ipv4.tcp_invalid_ratelimit = 500
# TCP保持连接的时间间隔,单位为秒
net.ipv4.tcp_keepalive_intvl = 15
# 发送TCP保持连接探测报文的次数
net.ipv4.tcp_keepalive_probes = 3
# TCP保持连接的时间,单位为秒
net.ipv4.tcp_keepalive_time = 600
# 限制发送缓存的最大空间,单位为byte
net.ipv4.tcp_limit_output_bytes = 262144
# 开启TCP低延迟模式
net.ipv4.tcp_low_latency = 0
# 操作系统允许的最大TCP半连接数
net.ipv4.tcp_max_orphans = 16384
# TCP拥塞窗口增长算法的阈值,一般设为0不使用该功能
net.ipv4.tcp_max_ssthresh = 0
# 等待建立连接请求的最大个数
net.ipv4.tcp_max_syn_backlog = 262144
# 每秒最多处理的TCP连接数,越高则占用CPU时间越多
net.ipv4.tcp_max_tw_buckets = 5000
# 设置TCP Mem,包括min、default、max三个参数,单位为page数量
net.ipv4.tcp_mem = 88053	117407	176106
# 设置发送方socket buffer大小的最小值,单位为byte
net.ipv4.tcp_min_snd_mss = 48
# 设置TCP使用的最小TSO分段数目(只有在开启TSO时生效)
net.ipv4.tcp_min_tso_segs = 2
# 开启TCP自适应窗口大小控制
net.ipv4.tcp_moderate_rcvbuf = 1
# 开启TCP MTU探测,以避免网络分片
net.ipv4.tcp_mtu_probing = 1
# 禁止保存TCP延迟测量得到的数据
net.ipv4.tcp_no_metrics_save = 1
# 无需等待发送缓存为空,就可以发送数据
net.ipv4.tcp_notsent_lowat = -1
# TCP重传数据包的最大次数
net.ipv4.tcp_orphan_retries = 0
# TCP重传数据包后允许接收的最大乱序数据包个数
net.ipv4.tcp_reordering = 3
# 启用TCP Fast Retransmit和Fast Recovery算法
net.ipv4.tcp_retrans_collapse = 1
# 第一次重传TCP数据包的次数
net.ipv4.tcp_retries1 = 3
# 第二次重传TCP数据包的次数
net.ipv4.tcp_retries2 = 15
# 拒绝与RFC1337不兼容的数据包
net.ipv4.tcp_rfc1337 = 1
# 设置TCP接收缓存大小,包括min、default、max三个参数,单位为byte
net.ipv4.tcp_rmem = 4096	87380	33554432
# 开启TCP SACK(Selective Acknowledgments)支持
net.ipv4.tcp_sack = 1
# 关闭TCP连接空闲一段时间后再次发送数据包
net.ipv4.tcp_slow_start_after_idle = 0
# 禁用TCP Socket Urgent功能
net.ipv4.tcp_stdurg = 0
# TCP SYN请求重试的最大次数
net.ipv4.tcp_syn_retries = 1
# TCP SYN/ACK请求重试的最大次数
net.ipv4.tcp_synack_retries = 1
# 开启TCP SYN Cookie防止syn flood攻击
net.ipv4.tcp_syncookies = 1
# 关闭TCP Thin Dupack
net.ipv4.tcp_thin_dupack = 0
# 关闭TCP Thin Linear Timeouts
net.ipv4.tcp_thin_linear_timeouts = 0
# 开启TCP时间戳
net.ipv4.tcp_timestamps = 1
# 设置TCP TSO窗口大小的除数,只有在开启TSO时生效
net.ipv4.tcp_tso_win_divisor = 3
# 开启TCP TIME_WAIT Socket重用机制
net.ipv4.tcp_tw_recycle = 1
# 允许将TIME_WAIT Socket重用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
# 开启TCP窗口缩放
net.ipv4.tcp_window_scaling = 1
# 设置发送方socket buffer大小,包括min、default、max三个参数,单位为byte
net.ipv4.tcp_wmem = 4096	16384	33554432
# 关闭TCP workaround signed windows(https://tools.ietf.org/html/rfc7323)
net.ipv4.tcp_workaround_signed_windows = 0
# 当使用conntrack跟踪TCP连接时,设置是否采用liberal模式
net.netfilter.nf_conntrack_tcp_be_liberal = 0
# 当使用conntrack跟踪TCP连接时,设置是否采用loose模式
net.netfilter.nf_conntrack_tcp_loose = 1
# TCP连接最大重传次数
net.netfilter.nf_conntrack_tcp_max_retrans = 3
# TCP连接关闭后,等待fin结束的时间,单位为秒
net.netfilter.nf_conntrack_tcp_timeout_close = 10
# TCP连接关闭后,进入CLOSE_WAIT状态的时间,单位为秒
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
# TCP连接已经建立时,如果长期没有数据传输,连接最长保持时间,单位为秒
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
# 当关闭TCP连接时,TCP_FIN等待ACK的超时时间,单位为秒
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
# 当关闭TCP连接时,ACK等待FIN的超时时间,单位为秒
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
# TCP连接最大重传次数,以及TCP RTO
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 300
# 设置 TCP SYN_RECV 状态的超时时间为 60 秒
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
# 设置 TCP SYN_SENT 状态的超时时间为 120 秒
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
# 设置 TCP TIME_WAIT 状态的超时时间为 120 秒
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
# 设置 TCP 未确认连接的超时时间为 300 秒
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 300
# 设置 sunrpc 协议的 FIN 超时时间为 15 秒
sunrpc.tcp_fin_timeout = 15
# 设置 sunrpc 协议的最大槽位表项数为 65536
sunrpc.tcp_max_slot_table_entries = 65536
# 设置 sunrpc 协议的槽位表项数为 2
sunrpc.tcp_slot_table_entries = 2
# 设置 sunrpc 协议的传输层为 TCP,缓存区大小为 1048576 字节
sunrpc.transports = tcp 1048576
# 设置系统最大连接数为 65535
net.core.somaxconn = 65535
# 设置网络设备缓存队列最大值为 65535
net.core.netdev_max_backlog = 65535
# 设置系统的最大文件句柄数为 65535
fs.file-max = 65535
# 增加文件描述符限制
fs.nr_open = 1000000
# 设置同时为当前用户打开的 inotify 实例的最大数目为 1024
fs.inotify.max_user_instances = 1024
# 设置当前用户为每个 inotify 实例可同时监视的文件和目录数目上限为 65536
fs.inotify.max_user_watches = 65536
# 设置 inotify 实例中等待处理的事件队列的最大(未处理)长度为 16384
fs.inotify.max_queued_events = 16384
# 调整文件系统缓存参数
vfs_cache_pressure = 50
# 设置进程ID的最大值为131072
kernel.pid_max = 131072
# 设置系统支持的最大进程ID值为131072
kernel.max_pid = 131072
# 设置系统的信号量的参数,分别是512个信号量集、每个信号量集的最大值为65535、每个进程最多可以持有的信号量数量为1024、最大的信号量值为2048
kernel.sem = 512 65535 1024 2048
  1. 保存文件并退出。

  2. 使用以下命令使新配置生效:

sudo sysctl -p
  1. 使用命令行工具查看TCP网络参数的值,例如使用命令:
sysctl -a | grep tcp

可以查看到当前TCP网络参数的值,确认修改是否生效。
在这里插入图片描述

以上配置仅供参考,具体的参数设置应根据实际情况进行调整。在更改任何系统参数之前,请确保了解所需的配置和可能的影响。

🎉 (2)文件系统参数

可以设置以下参数,以提高服务器的文件系统性能:

①. 文件打开数:默认为1024,可以设置为65535,以支持更多的文件打开。

②. 文件描述符大小:默认为1024,可以设置为65535,以支持更大的文件。

③. 内存缓存大小:默认为32MB,可以设置为512MB,以加快磁盘访问速度。

📝 仅根据硬件配置,估算机器的最大性能

对于2核心4G内存的机器,最大的QPS和TPS取决于三个主要限制因素:

  1. CPU性能

  2. 内存大小

  3. 磁盘速度

在这个配置下,可能的最大QPS和TPS取决于这三个因素中最小的那个。

对于文件打开数和文件描述符大小的设置,655355是足够高的,不太可能成为限制因素。

对于内存缓存大小,512MB也足够大了,对性能的提升是有帮助的,但也不会明显改变最大性能。

考虑到压测的机器ESSD AutoPL云盘 40000 IOPS,可以假设磁盘速度也足够高。因此,最大性能主要取决于CPU和内存。

根据经验,一个CPU核心的最大处理能力通常在1万到10万之间。2核心4线程的CPU最大的处理能力是在2万到20万之间。这个范围是因为处理能力还取决于其他因素,如CPU主频、缓存大小、内存带宽等等。

以我本机i9-12900k为例,根据Intel官方资料,i9-12900k是一款16核32线程的处理器,其主频为3.2GHz,最大增强主频为5.2GHz。因此,其最大处理能力可以计算为:
最大处理能力 = 核心数 x 主频 x 指令执行效率
其中,指令执行效率可以用IPC(Instructions Per Cycle)来表示指令执行效率通常是通过 CPU 的性能指标来评估,例如时钟频率、IPC (Instructions Per Cycle) 等指标。在 Linux 中,可以使用一些工具来查看 CPU 的性能指标,例如 top、perf、htop 等。i9-12900k的IPC约为2。因此,i9-12900k的最大处理能力约为:
16 x 5.2GHz x 2 = 166.4万
即最大处理能力为166.4万。需要注意的是,实际应用中的性能取决于多种因素,包括软件优化程度、内存速度、硬盘速度等,因此实际性能可能会有所不同。

📝 修改配置

修改文件系统参数需要以管理员身份登录系统,然后按照以下步骤进行操作:

①. 修改文件打开数:

  1. 打开命令行终端,输入以下命令:
sudo vi /etc/sysctl.conf
  1. 在打开的配置文件中添加以下代码:
# 设置系统的最大文件句柄数为 65535
fs.file-max = 65535
  1. 保存文件并关闭。

  2. 输入以下命令,使配置修改生效:

sudo sysctl -p

②. 修改文件描述符大小:

  1. 打开命令行终端,输入以下命令:
sudo vi /etc/security/limits.conf
  1. 在打开的配置文件中添加以下代码:
*    soft    nofile    65535
*    hard    nofile    65535
  1. 保存文件并关闭。

  2. 输入以下命令,使配置修改生效:

ulimit -n 65535

注意:此配置只对当前用户有效,如果要对所有用户生效,需要重启系统。

③. 修改内存缓存大小:

要修改CentOS 7系统的内存缓存大小,可以执行以下步骤:

  1. 打开终端并以root用户身份登录。
  2. 编辑 /etc/sysctl.conf 文件,如下所示:
vi /etc/sysctl.conf
  1. 在文件的末尾添加以下行:
# 设置系统脏页(未写入磁盘的页面)达到多少字节时可以开始写入磁盘
vm.dirty_background_bytes = 8388608
# 设置系统脏页达到多少字节时必须写入磁盘
vm.dirty_bytes = 25165824
# 设置可以在后台写入磁盘的脏页占总脏页的比例(即总脏页数的2%)
vm.dirty_background_ratio = 2
# 设置当系统脏页占总内存的比例超过5%时,系统必须开始写入磁盘
vm.dirty_ratio = 5
# 设置系统判定一个脏页需要写入磁盘的时间,单位为centisecond,即2000分之一秒
vm.dirty_expire_centisecs = 2000

这些参数表示内存缓存的大小,可以根据需要进行修改。上述示例将默认值设置为16 MB和48 MB。
4. 保存并关闭文件。
5. 执行以下命令以使更改生效:

sysctl -p

现在,您已成功修改了CentOS 7系统的内存缓存大小。

🎉 (3)内存参数

可以设置以下参数,以提高服务器的内存管理效率:

①. 最小内存分配单位:默认为4KB,可以设置为1KB,以节省内存开销。

②. 堆内存大小:默认为1/4的物理内存大小,可以根据应用需求和机器配置进行调整。

③. 堆内存溢出处理方式:可以选择直接退出应用,或者打印错误信息并继续运行。

🌟 三、Tomcat配置

Tomcat是Spring Boot默认的Web容器,它的配置也需要进行优化,以提高性能。

🎉 1. 调整最大连接数

sever:
  tomcat:
    # 1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800,以此类推
    threads:
      # 最多的工作线程数,默认大小是200。该参数相当于临时工,如果并发请求的数量在10到200之间,就会使用这些临时工线程进行处理。建议设置为 2 倍到 4 倍的 QPS
      max: 6667
      # 最少的工作线程数,默认大小是10。该参数相当于长期工,如果并发请求的数量达不到10,就会依次使用这几个线程去处理请求。如果min-spare设置得太低,那么当应用程序接收到高并发请求时,线程池将无法满足服务要求而导致请求失败。较高的min-spare值可能会导致系统响应时间变慢,因为它会创建大量线程来处理请求,这可能会占用过多的CPU和内存资源。如果将min-spare值设置得太低,则线程池可能无法及时响应请求。当系统负载较高时,有些请求可能会被暂时挂起,等待线程变得可用。如果没有足够的空闲线程,则请求将会等待更长时间。设置较高的min-spare值会占用更多的内存资源。如果线程池中的线程数超出了系统的实际需求,则会浪费内存资源。因此,将min-spare值设置为10至20是一种平衡内存和线程利用率的方式。
      min-spare: 20
      # 最大连接数,默认大小是8192。表示Tomcat可以处理的最大请求数量,超过8192的请求就会被放入到等待队列。如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。建议设置为 2 倍到 4 倍的 QPS。如果设置的值太低,将会限制服务器处理客户端请求的能力,从而可能导致应用程序出现性能问题。如果设置的值太高,则会浪费服务器资源,因为服务器的处理能力可能不足以处理所有的连接。通过经验和测试,2到4倍的QPS值通常会在服务器处理客户端请求时提供最佳性能和稳定性。这个范围也会提供一定的缓冲以应对突发流量,从而在服务器资源短缺时避免过载。
    max-connections: 6667
    # 等待队列的长度,默认大小是100。建议设置为 2 至 5 倍的 max-connections。将accept-count设置为2至5倍的max-connections可以确保Tomcat能够处理足够的连接请求,同时避免因过多排队连接导致的性能问题。但是,设置过高的accept-count会增加系统负担和内存压力,同时也可能会引起其他问题,如拒绝服务攻击等。至于为什么建议不超过5倍,是因为实际上超过这个范围的设置已经很少能带来明显的性能提升,反而会增加系统负担。同时,设置过高的accept-count还可能会导致频繁的连接请求失败和性能下降,甚至可能会导致Tomcat崩溃。
    accept-count: 13334

🎉 2. 配置压缩

Spring Boot使用内嵌的Tomcat作为其默认的Web容器,支持HTTP协议下的数据压缩。

要启用数据压缩,需要在application.properties文件中添加以下配置:

server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
server.compression.min-response-size=2048

解释一下每一个配置项的含义:

  • server.compression.enabled:启用数据压缩,默认为false。
  • server.compression.mime-types:需要压缩的数据类型列表,支持多个值,用逗号分隔。
  • server.compression.min-response-size:响应数据的最小大小(字节),只有响应数据大小超过该值才会进行压缩。

配置完成后,当客户端请求的Accept-Encoding头中包含“gzip”或“deflate”时,Tomcat会自动压缩响应数据并返回。

需要注意的是,如果使用了反向代理服务器(如Nginx),则需要确保代理服务器不会重复压缩响应数据,否则可能会导致网页无法正确加载。可以通过设置代理服务器的“proxy_set_header Accept-Encoding ”和“proxy_set_header TE ”选项来解决该问题。

🎉 3. 配置缓存

Spring Boot的默认配置会自动将静态资源缓存一段时间,并指定缓存路径。默认情况下,静态资源的缓存时间是1小时(3600秒),缓存路径为“/static/”和“/public/” 。

如果需要自定义静态资源的缓存配置,可以在application.properties中添加如下配置:

# 🌟 配置静态资源缓存时间为10分钟
spring.resources.cache.cachecontrol.max-age=600

# 🌟 配置缓存路径
spring.resources.static-locations=classpath:/static/,classpath:/public/

在上述配置中,通过spring.resources.cache.cachecontrol.max-age可以配置缓存时间,单位为秒;通过spring.resources.static-locations可以配置缓存路径。在配置路径时,需要指定静态资源存放的位置,多个位置可以使用逗号分隔。

需要注意的是,如果静态资源名带有版本号或者时间戳等动态变化的参数,那么缓存路径需要指定到该参数前面的部分,否则可能会导致缓存无效。

🌟 四、线程池配置

在高并发场景下,线程池的配置也是非常重要的,可以大大提高系统的并发处理能力。

Spring Boot默认使用Tomcat线程池,它提供了以下参数可以进行调整:

(1)最大工作线程数(maxThreads):表示Tomcat可以处理的并发请求数量,超过最大线程数的请求将会被拒绝。可以根据预期并发请求量进行调整,建议设置为CPU核心数量的2~4倍。

(2)最小工作线程数(minSpareThreads):表示Tomcat最少保持的空闲工作线程。可以根据预期并发请求量进行调整,建议设置为CPU核心数量。

(3)最大连接数(maxConnections):表示Tomcat可以处理的最大请求数量,超过最大连接数的请求将会被放入等待队列。可以根据预期并发请求量进行调整,建议设置为maxThreads的2~4倍。

(4)等待队列长度(acceptCount):表示Tomcat等待队列的长度,超过等待队列长度的请求将会被拒绝。可以根据预期并发请求量进行调整,建议设置为maxConnections的2~4倍。

# 🌟 server配置
server:
  compression:
    # 启用数据压缩,默认为false。配置完成后,当客户端请求的Accept-Encoding头中包含“gzip”或“deflate”时,Tomcat会自动压缩响应数据并返回。
    enabled: true
    # 需要压缩的数据类型列表,支持多个值,用逗号分隔。
    mime-types: application/json,application/xml,text/html,text/xml,text/plain
    # 响应数据的最小大小(字节),只有响应数据大小超过该值才会进行压缩。
    min-response-size: 2048
  # 服务端口
  port: 8097
  tomcat:
    # 1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800,以此类推
    threads:
      # 最多的工作线程数,默认大小是200。该参数相当于临时工,如果并发请求的数量在10到200之间,就会使用这些临时工线程进行处理。建议设置为 2 倍到 4 倍的 QPS
      max: 6667
      # 最少的工作线程数,默认大小是10。该参数相当于长期工,如果并发请求的数量达不到10,就会依次使用这几个线程去处理请求。如果min-spare设置得太低,那么当应用程序接收到高并发请求时,线程池将无法满足服务要求而导致请求失败。较高的min-spare值可能会导致系统响应时间变慢,因为它会创建大量线程来处理请求,这可能会占用过多的CPU和内存资源。如果将min-spare值设置得太低,则线程池可能无法及时响应请求。当系统负载较高时,有些请求可能会被暂时挂起,等待线程变得可用。如果没有足够的空闲线程,则请求将会等待更长时间。设置较高的min-spare值会占用更多的内存资源。如果线程池中的线程数超出了系统的实际需求,则会浪费内存资源。因此,将min-spare值设置为10至20是一种平衡内存和线程利用率的方式。
      min-spare: 20
      # 最大连接数,默认大小是8192。表示Tomcat可以处理的最大请求数量,超过8192的请求就会被放入到等待队列。如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。建议设置为 2 倍到 4 倍的 QPS。如果设置的值太低,将会限制服务器处理客户端请求的能力,从而可能导致应用程序出现性能问题。如果设置的值太高,则会浪费服务器资源,因为服务器的处理能力可能不足以处理所有的连接。通过经验和测试,2到4倍的QPS值通常会在服务器处理客户端请求时提供最佳性能和稳定性。这个范围也会提供一定的缓冲以应对突发流量,从而在服务器资源短缺时避免过载。
    max-connections: 6667
    # 等待队列的长度,默认大小是100。建议设置为 2 至 5 倍的 max-connections。将accept-count设置为2至5倍的max-connections可以确保Tomcat能够处理足够的连接请求,同时避免因过多排队连接导致的性能问题。但是,设置过高的accept-count会增加系统负担和内存压力,同时也可能会引起其他问题,如拒绝服务攻击等。至于为什么建议不超过5倍,是因为实际上超过这个范围的设置已经很少能带来明显的性能提升,反而会增加系统负担。同时,设置过高的accept-count还可能会导致频繁的连接请求失败和性能下降,甚至可能会导致Tomcat崩溃。
    accept-count: 13334
# 🌟 mybatis配置
mybatis:
  configuration:
    # 日志输出实现使用stdoutImpl
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 启用下划线转驼峰
    map-underscore-to-camel-case: true
# 🌟 mybatis-plus配置
mybatis-plus:
  # mapper文件所在路径
  mapper-locations: classpath*:/mapper/*.xml
  # 实体类所在包路径
  typeAliasesPackage: com.example.redpacketrain.model
  global-config:
    # 数据库表字段名转换为驼峰命名
    db-column-underline: true
    # 字段插入策略,填充器顺序执行
    field-strategy: 1
    # ID类型 0:"数据库ID自增",1:"用户输入ID",2:"全局唯一ID(UUID)"
    id-type: 0
# 🌟 actuator暴露端点配置
management:
  endpoints:
    web:
      exposure:
        # 包含所有端点
        include: '*'
# 🌟 spring配置
spring:
  profiles:
    # 配置文件的前缀,默认是application.name的值,如果配了prefix,就取prefix的值。开发环境dev,测试环境test,生产环境prod。
    # nacos会根据当前环境去拼接配置名称查找相应配置文件,示例:{spring.application.name}-{spring.profiles.active}-{spring.cloud.nacos.config.file-extension},获取到值:nacos-config-dev.yml
    active: dev
  application:
    # 配置应用的名称,用于获取配置
    name: red-packet-rain
  jackson:
    # 日期格式
    date-format: yyyy-MM-dd HH:mm:ss
    # 时区
    time-zone: GMT+8
  main:
    # 允许覆盖bean定义
    allow-bean-definition-overriding: true
  devtools:
    restart:
      # 启用自动重启
      enable: true
  redis:
    # 数据库
    database: 0
    # 主机地址
    host: r-uf63c2kc5bhsl6sw94pd.tairpdb.rds.aliyuncs.com
    # 密码
    password: 2023@Liao
    # 端口
    port: 6379
    timeout: 60000
  datasource:
    # 数据库驱动
    driver-class-name: com.mysql.jdbc.Driver
    # 用户名
    username: root
    # 密码
    password: 2023@Liao
    # 数据库连接地址
    url: jdbc:mysql://rm-uf6613ss8xgiqpdkiao.mysql.rds.aliyuncs.com:3306/red-packet-rain?characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
    # 初始连接数
    initial-size: 100
    # 最大连接数
    max-active: 300
    # 最小空闲连接数
    min-idle: 100
    # 最长等待时间
    max-wait: 60000
    # 连接池配置
    pool-prepared-statements: true # 启用预编译语句池
    max-pool-prepared-statement-per-connection-size: 20 # 每个连接的预编译语句数
    time-between-eviction-runs-millis: 60000 # 检查需要关闭的连接间隔毫秒数
    min-evictable-idle-time-millis: 300000 # 连接在池中最小生存时间
    test-while-idle: true  # 空闲连接是否在连接池被空闲连接回收器进行检测
    test-on-borrow: false # 申请连接时是否检测连接可用性
    test-on-return: false # 归还连接时是否检测连接可用性
    # Druid 监控配置
    stat-view-servlet:
      enabled: true # 启用监控
      url-pattern: /druid/* # 访问路径
    # 过滤器配置
    filter:
      stat:
        log-slow-sql: true # 开启慢 SQL 记录
        slow-sql-millis: 1000 # 慢 SQL 阈值
        merge-sql: false # 是否合并 SQL
      wall:
        config:
          multi-statement-allow: true # 是否允许多个 SQL 语句同时执行
  cloud:
    sentinel:
      transport:
        # 添加sentinel的控制台地址
        dashboard: 139.224.215.67:8080
    stream:
      default-binder: rocketmq #选择默认绑定器
      rocketmq:
        binder:
          transaction:
            producer:
              transactionalIdPrefix: tx- #事务ID的前缀,用于区分不同的应用
              corePoolSize: 5 #事务Producer线程池初始大小
              maxPoolSize: 10 #事务Producer线程池最大大小
          # RocketMQ的NameServer地址
          name-server: rmq-cn-uax3f2kxe03.cn-shanghai.rmq.aliyuncs.com:8080
          access-key: tAPs290605b36eJh
          secret-key: 08qWfJh5ZQ793h0U
      binders: #可以绑定多个消息中间件
        rocketmq: #表示定义的名称,用于binding整合 名字可以自定义 在此处配置要绑定的rocket的服务信息
          type: rocketmq
      bindings: # 服务的整合处理
        rocketmqOutput: # 通道名称
          # 消息发往的目的地,对应topic 在发送消息的配置里面,group是不用配置的
          destination: rocket-destination
          # 设置消息类型,本次为json,文本则设置“text/plain” 如果我们需要传输json的信息,那么在发送消息端需要设置content-type为json(其实可以不写,默认content-type就是json)
          content-type: application/json
          default-binder: rocketmq # 如果没设定,就使用default-binder默认的
          # 指定了消息分区的数量
          partitionCount: 2
          # 指定分区键的表达式规则,我们可以根据实际的输出消息规则来配置SpEL来生成合适的分区键;
          partition-key-expression: headers.id3
        rocketmqInput:
          # 消息发往的目的地,对应topic
          destination: rocket-destination
          # 设置消息类型,本次为json,如果是文本则设置“text/plain”
          content-type: application/json
          # 设置要绑定的消息服务的具体设置
          default-binder: rocketmq
          # 分组名称,在rocket当中其实就是交换机绑定的队列名称
          group: my-rocketmq-group
          consumer:
            # 初始/最少/空闲时消费者数量,默认为1
            concurrency: 2
            # 重试次数
            max-attempts: 3
            # 通过该参数开启消费者分区功能;
            partitioned: true
file:
  path: D://opt
探究 Spring Boot 可以同时处理多少请求 一般来说,CPU 的处理速度、内存的大小、磁盘的读写速度等都会影响到应用程序的并发处理能力。(Spring Boot实现数量与异步请求处理有直接关联) Spring Boot 提供了可扩展的异步请求处理机制,通过使用 CompletableFuture 或 DeferredResult 等异步编程模型来处理请求,可以避免线程阻塞,从而提高并发处理能力。总结一下吧,Spring Boot 同时处理请求的数量受到硬件资源、Web 服务器的选择、配置参数的设置和异步请求处理等多个因素的影响。 阅读详情

相关推荐

海康威视SDK二次开发实战:从官方Java Demo到SpringBoot项目整合

本文详细介绍了海康威视SDK二次开发实战,从官方Java Demo到SpringBoot项目整合的全过程。通过优化依赖管理、封装核心功能模块和跨平台部署解决方案,帮助开发者高效实现设备控制与视频监控功能。文章还提供了典型问题排查指南,助力企业级项目快速落地。

weixin_28725949的博客 376

微服务Springboot实战大揭秘/高并发/高可用/高负载/互联网技术

Java架构师系列课程是针对有志向架构师发展的广大学员而设置,不管你是工作一到三年,还是三到五年,本课程都会对你产生巨大的提升,让你的薪资大幅翻倍,走向BAT架构师的伟大梦想。

Java秒杀系统优化(高性能高并发)

主题:在大并发,大流量的情况下如何提升吞吐量或者说QPS? 而秒杀活动恰恰就是属于大并发的情形,因此下面简单来谈谈大并发下秒杀方案的优化。 项目采用技术:SpringBoot + MyBatis + MySql + RabbitMq + Redis RabbitMq安装参考:https://blog.youkuaiyun.com/zwx19921215/article/details/10325583......

2413

Spring Boot接口实现百万并发

随着互联网的发展,越来越多的应用需要支持高并发。在这种情况下,如何实现高并发成为了一个重要的问题。Spring Boot是一个非常流行的Java框架,它提供了很多方便的功能来支持高并发。本文将介绍如何使用Spring Boot来实现百万并发。Spring Boot是一个基于Spring框架的快速开发框架,它可以帮助开发人员快速构建Spring应用程序。Spring Boot提供了很多默认的配置,可以减少开发人员的工作量。同时,Spring Boot也提供了很多扩展功能,可以帮助开发人员更好地处理业务逻辑。

果酱 の 博客 1万+

Spring Boot 如何在高并发场景下如何提升性能?

2021年6月,随着容器、微服务架构、Serverless架构的兴起,互联网应用的复杂性不断上升。而Spring Boot作为Java世界中最流行的轻量级开发框架,也逐渐被越来越多的开发者所熟悉,在面对高并发场景下,Spring Boot如何提升性能,这是一个值得关注的话题。本文就从以下几个方面进行阐述:Spring Boot中的缓存组件EhCache和Redis的配置及使用;Tomcat线程池配置及优化等方面的知识;服务器硬件资源分配和负载均衡器配置等方面相关知识;

AI天才研究院 1219

Amesim基础篇-热仿真常用模型库-Thermal Hydraulic /Resistance

流体库、管路库在热管理中是必备模块,如动力电池液冷循环系统均需要Thermal Hydraulic /Resistance库的元件建模。

2201_75375391的博客 5663

快马AI教你一招解决MySQL锁等待超时:高并发场景实战指南

通过这个项目,我们学习了如何在高并发场景下避免MySQL锁等待超时错误。乐观锁和悲观锁各有优劣,需要根据实际业务需求选择合适的策略。同时,合理设置事务隔离级别和优化事务逻辑,也是提升系统并发能力的关键。在使用。

AmberLeopard26的博客 1040

最优化方法 25:PDHG

前面的章节要么从原始问题出发,要么从对偶问题出发,通过求解近似点或者一个子优化问题进行迭代,而且推导过程中我们发现根据问题的参数特征,比如矩阵 AAA 是瘦高型的还是矮胖型的,采用对偶和原始问题的复杂度会不一样,可以选择一个更简单的。而这一节,我们将要从原始对偶问题出发来优化,什么是原始对偶问题呢?就是原始优化变量和对偶优化变量(原始函数和共轭函数)混合在一块,看下面的原理就知道了。 1. 原始对偶问题 现在考虑原始优化问题,其中 f,gf,gf,g 为闭凸函数 min⁡f(x)+g(Ax) \min \q

Glooow的博客 4600

快马AI三分钟搭建SpringBoot+Kafka:从零实现高并发订单处理系统

高并发场景下,订单服务需要快速响应请求,同时保证消息不丢失。SpringBoot的自动配置能快速集成Kafka,而Kafka的分布式特性可以轻松应对流量高峰。实际测试中,单机Kafka就能达到每秒数万条消息的处理能力。建议将topic名称提取为常量,方便多处引用。创建简单的Controller暴露/createOrder接口,用Postman测试时可以观察Kafka消息流转情况。最近在做一个电商项目的订单模块,需要处理突发的高并发下单请求。最惊喜的是可以直接一键部署成可访问的服务,不用自己折腾服务器配置。

GoldenleafLynx28的博客 712

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 224

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 112

NestJS 高并发实战:从异步到集群的完整方案

NestJS 高并发实战:从异步到集群的完整方案是 Java 后端开发中的核心知识点。本文覆盖NestJS、高并发、后端,配有完整可运行的代码示例。SpringBoot 的核心是约定优于配置——善用注解和自动配置所有外部输入必须校验——用@Valid异常要分类处理——业务异常和系统异常分开连接池合理配置——根据并发量调整 pool size💬关注我,后续更新更多 Java 实战系列。💬标签:NestJS | 高并发 | 后端 | 性能 | 实战。

斌味代码的博客 236

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

XiaoqiangClub的博客 3361

SpringBoot项目实战:精选企业级开源项目解析

SpringBoot作为Java生态中最流行的企业级开发框架,其自动配置、起步依赖等特性大幅提升了开发效率。理解其核心原理后,通过研究优质开源项目能快速掌握生产级代码的架构设计。典型应用场景包括后台管理系统(RuoYi)、微服务电商(mall-swarm)、高并发秒杀(miaosha)等,这些项目展示了分层架构、分布式事务、缓存策略等关键技术实现。学习时建议重点关注项目中的Redis缓存优化、Nacos服务发现等热词相关实现,这些既是面试高频考点,也是提升系统性能的关键手段。

weixin_33404102的博客 282

Mastercam软件二次开发:使用C#进行Mastercam二次开发

C#(发音为“C Sharp”)是一种现代、面向对象的编程语言,由微软开发,首次发布于2000年。它结合了C和C++的强大功能,同时引入了Java的垃圾回收机制,使得C#在开发效率和运行性能之间找到了一个良好的平衡点。C#的设计目标是提高开发者的生产力,它支持多种编程范式,包括面向对象、泛型、委托和事件等,这使得它成为开发Windows应用程序、Web应用程序、游戏(尤其是使用Unity引擎)和企业级应用的理想选择。

kkchenjj的博客 2214

【AUTOSAR-RTE】-1-聊一聊RTE(Run-Time Environment)

RTE(Run-Time Environment)是AUTOSAR ECU架构的核心。

「汽车电子助手」的博客 6502

springboot旅游网站—开题报告

Hbuilderx;Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。8、AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

bishe288的博客 99

MIMO-OFDM通信系统性能仿真及MATLAB实现

将MIMO和OFDM技术结合起来,可以充分利用两者的优点,进一步提高无线通信系统的性能。在MIMO-OFDM系统中,多个天线同时发射多个子载波,称为多天线多载波(MIMO-OFDM)系统。随着无线通信技术的不断发展,MIMO-OFDM技术因其高效、可靠和适应性等优点已被广泛应用于新一代通信系统中。本篇文章旨在介绍MIMO-OFDM通信系统的基本原理及其性能评估方法,并结合MATLAB提供相关代码实现。本篇文章介绍了MIMO-OFDM通信系统的基本原理和性能评估方法,并结合MATLAB提供了相关的实现代码。

学习使你进步。 2216

Spring Cloud为啥用HTTP交互?不慢吗?

但如用tcp交互,虽然不用在通讯过程中传输业务无关的http请求头和返回头信息,但开发交互过程中,得自己确保数据的完整性,如用md5],得自己编写数据报文的协议,一般还需要用netty或其它组件的线程模型处理高并发情况下的tcp请求,这些工作的难度就不是初级开发能做。500也可能还过于乐观了,也许是100。应对高并发,其实更在数据库层和业务交互层,如在项目里引入redis或分库组件或再引入kafka业务异步处理,外带3,4个实例,哪怕用http协议的openfeign,应对个2,3k并发量没问题。

欢迎来到我的博客 130

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

高并发项目部署以及优化手段

列举了上百个优化手段以及多种高并发项目部署方案,图文视频都有,文章质量超高。

我是Java程序员廖志伟,感谢朋友们的支持! 1447

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java高并发秒杀项目

Java高并发秒杀项目 项目代码见github,欢迎issue、fork、star。 项目实现 项目运行环境:Win10+Ubuntu18.04虚拟机,JDK1.8 项目中使用了关系型数据库MySQL(5.7.29)和非关系型数据库Redis(4.0.2),中间件RabbitMQ,因此在运行前需要将他们安装好,这三个都安装在Ubuntu系统中。 Mysql安装步骤 数据库表生成见gi...

nageaixiaodenanhai的博客 1338

Spring Boot中的高并发处理

高并发是指系统能够处理大量并发请求的能力。在互联网应用中,高并发处理是一个重要的性能指标,涉及到系统的吞吐量、响应时间和资源利用率等。为了实现高并发处理,我们需要从多个方面进行优化,包括硬件层面、网络层面、操作系统层面和应用层面。在Spring Boot中实现高并发处理需要综合考虑异步处理、线程池、缓存、数据库连接池和限流等多种技术。通过合理的配置和优化,可以显著提高系统的并发处理能力,提升用户体验和系统的稳定性。

技术研究中心 3679

基于Springboot高并发商品限时秒杀系统

系统介绍 本系统是使用SpringBoot开发的高并发限时抢购秒杀系统,除了实现基本的登录、查看商品列表、秒杀、下单等功能,项目中还针对高并发情况实现了系统缓存、降级和限流。 开发工具 IntelliJ IDEA + Navicat + Sublime Text3 + Git + Chrome 压测工具 JMeter 开发技术 前端技术 :Bootstrap + jQue...

w 1万+

SpringBoot优化之项目启动优化

保证服务正常启动 的方式来改造的,而删除"com.xxx.ad.rediscache"后启动服务并无异常,因此就没有进一步的操作,直接上预发验证了。这就奇怪了,既然不扫描该组件的业务代码根路径,也就没有执行注入该组件中定义的。原理,添加一个自定义的实现类,在不同阶段结束时打印下当前时间,通过计算不同阶段的运行时间,就能大体定位哪些阶段耗时比较高,然后重点排查这些阶段的代码。了解缓存失效的原因后,就有解决的办法了,因为是自己团队的组件,就没必要通过 JavaConfig 显式手动导入的方式改造,而是通过。

上善若泪 960

SpringBoot实现Java高并发秒杀系统之并发优化(四)

本项目中做到了以下优化: 秒杀接口采用md5加密方式防刷。 订单表使用联合主键方式,限制一个用户只能购买该商品一次。 配合Spring事务控制实现简单的优化。 使用redis缓存优化。 Spring的事务控制 Spring的声明式事务通过:传播行为、隔离级别、只读提示、事务超时、回滚规则来进行定义。 传播行为 事务的第一个方面就是传播行为。传播行为定义了客户端与被调用方法之间的事务边...

史天航的博客 983

SpringBoot老年人问诊系统设计与高并发优化实践

微服务架构下的高并发系统设计是当前企业级应用开发的核心挑战,特别是在医疗健康等民生领域。SpringBoot作为轻量级Java开发框架,通过自动配置和起步依赖等机制显著提升了开发效率。结合Redis缓存、RabbitMQ消息队列等中间件,可构建出具备弹性扩展能力的分布式系统。本文以老年人问诊预约系统为例,详解如何利用SpringBoot 1.5.10实现医疗资源的高效调度,包括分布式锁处理资源竞争、二级缓存优化响应速度等关键技术方案。系统特别针对老年用户群体进行了交互优化,采用响应式布局和大字体设计,同时满

weixin_30832405的博客 368
上一篇: 我的创作纪念日
下一篇: 【红包雨压测】提供2万用户30秒内5次请求的并发服务支持
Java程序员廖志伟
Java程序员廖志伟 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 1902原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值