在一台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;
}
}
二、详细实施步骤
-
资源准备
# 检查系统资源 free -h df -h -
服务配置
# application-service1.properties server.port=8080 management.server.port=9080 # 单独的管理端口 # application-service2.properties server.port=8081 management.server.port=9081 -
启动脚本
#!/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 & -
进程管理
# 使用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
三、关键注意事项
-
资源隔离
- 为每个服务配置JVM内存限制(-Xmx)
- 使用cgroups限制CPU和内存
# 使用cgroups yum install libcgroup cgcreate -g cpu,memory:/service1 echo "100000" > /cgroup/cpu/service1/cpu.cfs_quota_us
-
日志管理
# 日志轮转配置 /etc/logrotate.d/springboot /var/log/service1.log { daily rotate 7 compress missingok notifempty } -
监控方案
# 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'] -
安全加固
# 使用不同用户运行 useradd service1_user chown -R service1_user:service1_user /opt/service1/
四、性能优化建议
-
JVM调优
# 针对微服务优化JVM参数 java -XX:+UseG1GC -Xms512m -Xmx512m -XX:MaxGCPauseMillis=200 -jar service.jar -
连接池配置
# 数据库连接池配置示例 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 -
缓存策略
@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>
六、扩展建议
-
配置中心
<!-- Spring Cloud Config依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> -
服务发现
@EnableDiscoveryClient public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } -
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%的资源余量,并设置完善的监控告警系统。
云服务器