奋斗
努力

一台ecs上部署两个springboot服务?

云计算

在一台ECS实例上部署两个Spring Boot服务是完全可行的,以下是详细的实现方案和注意事项:

一、部署方案

方案1:不同端口运行(推荐)

# 服务1 (默认端口8080)
java -jar service1.jar --server.port=8080

# 服务2 (使用其他端口如8081)
java -jar service2.jar --server.port=8081

方案2:Docker容器化部署

# Dockerfile示例
FROM openjdk:8-jdk
COPY target/service1.jar /app/
CMD ["java", "-jar", "/app/service1.jar"]
# 运行容器
docker run -d -p 8080:8080 --name service1 service1-image
docker run -d -p 8081:8080 --name service2 service2-image

方案3:反向X_X(Nginx)

# nginx配置示例
upstream service1 {
    server 127.0.0.1:8080;
}

upstream service2 {
    server 127.0.0.1:8081;
}

server {
    listen 80;
    server_name service1.example.com;
    location / {
        proxy_pass http://service1;
    }
}

server {
    listen 80;
    server_name service2.example.com;
    location / {
        proxy_pass http://service2;
    }
}

二、详细实施步骤

  1. 资源准备

    # 检查系统资源
    free -h
    df -h
  2. 服务配置

    # application-service1.properties
    server.port=8080
    management.server.port=9080  # 单独的管理端口
    
    # application-service2.properties
    server.port=8081
    management.server.port=9081
  3. 启动脚本

    #!/bin/bash
    nohup java -Xms512m -Xmx512m -jar /path/to/service1.jar > service1.log 2>&1 &
    nohup java -Xms512m -Xmx512m -jar /path/to/service2.jar > service2.log 2>&1 &
  4. 进程管理

    # 使用systemd服务单元
    /etc/systemd/system/service1.service
    [Unit]
    Description=Service1
    After=syslog.target
    
    [Service]
    ExecStart=/usr/bin/java -jar /opt/apps/service1.jar
    User=appuser
    Restart=always
    
    [Install]
    WantedBy=multi-user.target

三、关键注意事项

  1. 资源隔离

    • 为每个服务配置JVM内存限制(-Xmx)
    • 使用cgroups限制CPU和内存
      # 使用cgroups
      yum install libcgroup
      cgcreate -g cpu,memory:/service1
      echo "100000" > /cgroup/cpu/service1/cpu.cfs_quota_us
  2. 日志管理

    # 日志轮转配置
    /etc/logrotate.d/springboot
    /var/log/service1.log {
       daily
       rotate 7
       compress
       missingok
       notifempty
    }
  3. 监控方案

    # Prometheus配置示例
    scrape_configs:
     - job_name: 'service1'
       metrics_path: '/actuator/prometheus'
       static_configs:
         - targets: ['localhost:9080']
     - job_name: 'service2'
       metrics_path: '/actuator/prometheus'
       static_configs:
         - targets: ['localhost:9081']
  4. 安全加固

    # 使用不同用户运行
    useradd service1_user
    chown -R service1_user:service1_user /opt/service1/

四、性能优化建议

  1. JVM调优

    # 针对微服务优化JVM参数
    java -XX:+UseG1GC -Xms512m -Xmx512m -XX:MaxGCPauseMillis=200 -jar service.jar
  2. 连接池配置

    # 数据库连接池配置示例
    spring.datasource.hikari.maximum-pool-size=10
    spring.datasource.hikari.minimum-idle=5
  3. 缓存策略

    @Configuration
    @EnableCaching
    public class CacheConfig {
       @Bean
       public CacheManager cacheManager() {
           return new ConcurrentMapCacheManager("cache1", "cache2");
       }
    }

五、故障排查命令

# 查看服务状态
systemctl status service1

# 检查端口占用
netstat -tulnp | grep java

# 查看资源占用
top -p $(pgrep -d',' java)

# 分析线程堆栈
jstack <PID> > thread_dump.log

# 内存分析
jmap -heap <PID>

六、扩展建议

  1. 配置中心

    <!-- Spring Cloud Config依赖 -->
    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
  2. 服务发现

    @EnableDiscoveryClient
    public class Application {
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
       }
    }
  3. CI/CD集成

    # GitLab CI示例
    deploy_service1:
     stage: deploy
     script:
       - scp target/service1.jar user@ecs:/opt/apps/
       - ssh user@ecs "systemctl restart service1"
     only:
       - master

通过以上方案,您可以在一台ECS上稳定运行多个Spring Boot服务。建议生产环境至少保留30%的资源余量,并设置完善的监控告警系统。

未经允许不得转载:云服务器 » 一台ecs上部署两个springboot服务?