Spring Boot项目在同一个服务器上如何设置不同的启动端口?

在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. 注意事项

  1. 端口冲突检查:确保端口没有被其他应用占用
  2. 防火墙设置:开放相应的防火墙端口
  3. 负载均衡:多实例时考虑使用Nginx等做负载均衡
  4. 日志分离:不同实例的日志应该分开存储
  5. 健康检查:确保每个实例的健康检查端点可访问

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"

选择哪种方式取决于你的具体需求:

  • 开发环境:推荐使用配置文件方式
  • 生产环境:推荐使用环境变量或命令行参数
  • 容器化部署:推荐使用环境变量
  • 快速测试:推荐使用命令行参数
云服务器