如何通过脚本运行多实例Spring Boot应用并批量发送POST请求
实现Spring Boot多实例自动化启动与批量请求发送
一、自动化启动20个递增端口的Spring Boot实例
可以通过脚本实现批量启动,以下是针对不同操作系统的方案:
Linux/macOS(Bash脚本)
创建start_instances.sh脚本,内容如下:
#!/bin/bash START_PORT=8001 INSTANCE_COUNT=20 # 循环启动每个实例 for ((i=0; i<INSTANCE_COUNT; i++)); do PORT=$((START_PORT + i)) echo "启动端口为${PORT}的Spring Boot实例..." # 后台运行并将日志输出到对应文件,同时记录进程ID mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=${PORT} > instance_${PORT}.log 2>&1 & echo $! > instance_${PORT}.pid # 预留启动缓冲时间,避免端口冲突或启动不完整 sleep 3 done echo "所有${INSTANCE_COUNT}个实例启动指令已下发,可查看对应日志文件确认启动状态。"
执行前赋予脚本权限:chmod +x start_instances.sh,然后运行:./start_instances.sh
Windows(批处理脚本)
创建start_instances.bat脚本,内容如下:
@echo off setlocal enabledelayedexpansion set START_PORT=8001 set INSTANCE_COUNT=20 for /l %%i in (0,1,%INSTANCE_COUNT%) do ( set /a PORT=START_PORT + %%i echo 启动端口为!PORT!的Spring Boot实例... start "Instance_!PORT!" mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=!PORT! timeout /t 3 /nobreak > nul ) echo 所有%INSTANCE_COUNT%个实例启动指令已下发。 endlocal
直接双击运行该批处理文件即可。
二、验证实例启动完成
为确保所有实例启动成功后再发送请求,可编写检查脚本(以Bash为例):
#!/bin/bash START_PORT=8001 INSTANCE_COUNT=20 for ((i=0; i<INSTANCE_COUNT; i++)); do PORT=$((START_PORT + i)) # 检查/actuator/health端点(需确保项目已引入spring-boot-starter-actuator) until curl -s http://localhost:${PORT}/actuator/health | grep -q "UP"; do echo "等待端口${PORT}的实例启动完成..." sleep 2 done echo "端口${PORT}的实例已就绪。" done
如果项目没有actuator,可替换为项目中某个启动后会正常响应的端点。
三、批量发送POST请求到每个实例的/someEndpoint
编写send_requests.sh脚本(Bash):
#!/bin/bash START_PORT=8001 INSTANCE_COUNT=20 # 定义JSON请求体 JSON_BODY='{"param1": "value1", "param2": "value2"}' for ((i=0; i<INSTANCE_COUNT; i++)); do PORT=$((START_PORT + i)) echo "向端口${PORT}的实例发送POST请求..." curl -X POST http://localhost:${PORT}/someEndpoint \ -H "Content-Type: application/json" \ -d "${JSON_BODY}" echo -e "\n" done
Windows环境可使用PowerShell脚本实现类似逻辑:
$startPort = 8001 $instanceCount = 20 $jsonBody = '{"param1": "value1", "param2": "value2"}' for ($i=0; $i -lt $instanceCount; $i++) { $port = $startPort + $i Write-Host "向端口$port的实例发送POST请求..." Invoke-RestMethod -Uri "http://localhost:$port/someEndpoint" -Method Post -ContentType "application/json" -Body $jsonBody }
注意事项
- 确保8001-8020端口未被其他进程占用,可提前用
netstat或ss命令检查。 - 若20个实例占用资源过高,可在启动命令中添加JVM参数限制内存,例如:
-Dspring-boot.run.jvmArguments="-Xmx512m"。 - 日志文件和PID文件可用于后续查看启动状态或停止实例(通过
kill $(cat instance_${PORT}.pid)终止对应进程)。
内容的提问来源于stack exchange,提问作者SA97
相关产品推荐
相关产品推荐

