在Spring Boot项目中,可以通过以下几种方式在同一服务器上设置不同的启动端口:
1. 配置文件方式(推荐)
1.1 使用不同的配置文件
创建多个配置文件,如:
application-dev.properties(开发环境)application-test.properties(测试环境)application-prod.properties(生产环境)
application-dev.properties:
server.port=8080
application-test.properties:
server.port=8081
application-prod.properties:
server.port=8082
启动时指定配置文件:
# 启动开发环境
java -jar myapp.jar --spring.profiles.active=dev
# 启动测试环境
java -jar myapp.jar --spring.profiles.active=test
# 启动生产环境
java -jar myapp.jar --spring.profiles.active=prod
1.2 使用YAML配置
application.yml:
spring:
profiles:
active: dev
---
spring:
config:
activate:
on-profile: dev
server:
port: 8080
---
spring:
config:
activate:
on-profile: test
server:
port: 8081
---
spring:
config:
activate:
on-profile: prod
server:
port: 8082
2. 命令行参数方式
2.1 直接指定端口
# 启动实例1
java -jar myapp.jar --server.port=8080
# 启动实例2
java -jar myapp.jar --server.port=8081
# 启动实例3
java -jar myapp.jar --server.port=8082
2.2 结合环境变量
# 设置环境变量
export SERVER_PORT=8080
java -jar myapp.jar
# 或者直接传递
SERVER_PORT=8081 java -jar myapp.jar
3. 环境变量方式
3.1 使用系统环境变量
在系统或容器中设置环境变量:
# Linux/Mac
export SERVER_PORT=8080
# Windows
set SERVER_PORT=8080
3.2 使用Docker环境变量
Dockerfile:
FROM openjdk:11-jre
COPY target/myapp.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
启动容器:
docker run -e SERVER_PORT=8080 -p 8080:8080 myapp
docker run -e SERVER_PORT=8081 -p 8081:8081 myapp
4. 编程方式配置
4.1 通过Java代码动态设置
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
// 如果没有指定端口,使用默认端口
String port = System.getProperty("server.port", "8080");
new SpringApplicationBuilder(MyApplication.class)
.properties("server.port:" + port)
.run(args);
}
}
4.2 使用随机端口
application.properties:
# 使用随机端口
server.port=0
# 或者指定范围
server.port=${random.int[8000,8100]}
启动后可以在日志中查看实际分配的端口。
5. 多实例部署脚本示例
5.1 Shell脚本启动多个实例
#!/bin/bash
# start_multiple_instances.sh
# 定义端口数组
PORTS=(8080 8081 8082 8083)
# 启动每个实例
for port in "${PORTS[@]}"
do
echo "Starting instance on port $port"
nohup java -jar myapp.jar --server.port=$port > app-$port.log 2>&1 &
echo "Instance started on port $port, PID: $!"
done
echo "All instances started"
5.2 使用PM2管理多个实例
# 安装PM2
npm install -g pm2
# 创建启动脚本
echo 'module.exports = {
apps: [
{
name: "app-8080",
script: "java",
args: "-jar myapp.jar --server.port=8080"
},
{
name: "app-8081",
script: "java",
args: "-jar myapp.jar --server.port=8081"
}
]
}' > ecosystem.config.js
# 启动所有实例
pm2 start ecosystem.config.js
6. 最佳实践建议
6.1 推荐组合使用
# 使用默认配置 + 命令行覆盖
java -jar myapp.jar
--spring.profiles.active=prod
--server.port=${PORT:-8080}
6.2 Docker Compose多实例部署
docker-compose.yml:
version: '3.8'
services:
app1:
image: myapp:latest
environment:
- SERVER_PORT=8080
ports:
- "8080:8080"
app2:
image: myapp:latest
environment:
- SERVER_PORT=8081
ports:
- "8081:8081"
app3:
image: myapp:latest
environment:
- SERVER_PORT=8082
ports:
- "8082:8082"
6.3 Kubernetes部署
deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
template:
spec:
containers:
- name: myapp
image: myapp:latest
env:
- name: SERVER_PORT
value: "8080"
ports:
- containerPort: 8080
7. 注意事项
- 端口冲突检查:确保端口没有被其他应用占用
- 防火墙设置:开放相应的防火墙端口
- 负载均衡:多实例时考虑使用Nginx等做负载均衡
- 日志分离:不同实例的日志应该分开存储
- 健康检查:确保每个实例的健康检查端点可访问
8. 快速测试命令
# 快速启动两个实例测试
java -jar myapp.jar --server.port=8080 &
java -jar myapp.jar --server.port=8081 &
# 检查端口占用
netstat -tlnp | grep java
lsof -i :8080
lsof -i :8081
# 停止所有实例
pkill -f "myapp.jar"
选择哪种方式取决于你的具体需求:
- 开发环境:推荐使用配置文件方式
- 生产环境:推荐使用环境变量或命令行参数
- 容器化部署:推荐使用环境变量
- 快速测试:推荐使用命令行参数
CLOUD技术笔记