如何在阿里云ECS上同时运行多个SpringBoot应用?

在阿里云ECS上同时运行多个Spring Boot应用是常见需求。以下是详细的操作步骤和最佳实践:

1. 环境准备

安装Java环境

# 更新系统
sudo yum update -y

# 安装Java 8或11
sudo yum install java-11-openjdk-devel -y

# 验证安装
java -version

2. 应用部署方式

方式一:不同端口运行(推荐)

配置每个应用的端口

# application-service1.properties
server.port=8080
spring.application.name=service1

# application-service2.properties
server.port=8081
spring.application.name=service2

# application-service3.properties
server.port=8082
spring.application.name=service3

启动脚本示例

#!/bin/bash
# start-service1.sh
nohup java -jar /opt/apps/service1.jar 
  --spring.profiles.active=prod 
  --server.port=8080 
  > /var/log/service1.log 2>&1 &

echo "Service1 started on port 8080"

方式二:使用Docker容器化部署

Docker Compose配置

# docker-compose.yml
version: '3.8'
services:
  service1:
    image: your-registry/service1:latest
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    restart: unless-stopped
    volumes:
      - ./logs/service1:/app/logs

  service2:
    image: your-registry/service2:latest
    ports:
      - "8081:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    restart: unless-stopped
    volumes:
      - ./logs/service2:/app/logs

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - service1
      - service2

3. 系统服务管理

创建systemd服务文件

service1.service

[Unit]
Description=Spring Boot Service 1
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/apps/service1
ExecStart=/usr/bin/java -jar /opt/apps/service1.jar --spring.profiles.active=prod
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=service1

[Install]
WantedBy=multi-user.target

服务管理命令

# 复制服务文件
sudo cp service1.service /etc/systemd/system/
sudo cp service2.service /etc/systemd/system/

# 重新加载systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start service1
sudo systemctl start service2

# 设置开机自启
sudo systemctl enable service1
sudo systemctl enable service2

# 查看状态
sudo systemctl status service1

4. Nginx反向X_X配置

# /etc/nginx/conf.d/multiple-services.conf
upstream service1 {
    server 127.0.0.1:8080;
}

upstream service2 {
    server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name service1.yourdomain.com;

    location / {
        proxy_pass http://service1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 80;
    server_name service2.yourdomain.com;

    location / {
        proxy_pass http://service2;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

5. 资源监控与优化

JVM参数优化

# 根据内存分配合理的JVM参数
java -Xms512m -Xmx1g 
     -XX:+UseG1GC 
     -XX:MaxGCPauseMillis=200 
     -jar your-app.jar

监控脚本

#!/bin/bash
# monitor-services.sh
echo "=== Service Status ==="
ps aux | grep java | grep -v grep

echo -e "n=== Memory Usage ==="
free -h

echo -e "n=== Disk Usage ==="
df -h

echo -e "n=== Active Connections ==="
netstat -tlnp | grep java

6. 安全配置

防火墙设置

# 开放必要端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8080-8089/tcp
sudo firewall-cmd --reload

用户权限管理

# 创建专用用户
sudo useradd -m -s /bin/bash appuser
sudo chown -R appuser:appuser /opt/apps

7. 日志管理

Logback配置示例

<!-- logback-spring.xml -->
<configuration>
    <property name="LOG_PATH" value="/var/log/${spring.application.name}"/>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/application.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="FILE"/>
    </root>
</configuration>

8. 健康检查

创建健康检查脚本

#!/bin/bash
# health-check.sh
SERVICES=("http://localhost:8080/actuator/health" 
          "http://localhost:8081/actuator/health")

for url in "${SERVICES[@]}"; do
    response=$(curl -s -o /dev/null -w "%{http_code}" $url)
    if [ "$response" != "200" ]; then
        echo "Service at $url is DOWN (HTTP $response)"
        # 可以添加告警逻辑
    else
        echo "Service at $url is UP"
    fi
done

最佳实践建议

  1. 资源规划:根据应用负载合理分配ECS实例规格
  2. 监控告警:配置云监控和告警规则
  3. 备份策略:定期备份应用和数据
  4. 安全加固:及时更新系统和应用
  5. 自动化部署:使用CI/CD工具进行部署

通过以上配置,你可以在阿里云ECS上稳定地运行多个Spring Boot应用。

未经允许不得转载:云计算导航 » 如何在阿里云ECS上同时运行多个SpringBoot应用?