部署一个Java服务需要考虑多个方面的配置,以下是一个详细的清单,涵盖了从基础环境到高级优化的关键配置:
1. 基础环境配置
- 操作系统:Linux(推荐CentOS/Ubuntu Server)或Windows Server。
- Java版本:根据项目需求选择:
- JDK 8/11/17(LTS版本,生产推荐)。
- 通过
java -version验证安装。
- 环境变量:配置
JAVA_HOME和PATH。
2. 服务依赖
- 应用打包格式:
- JAR:通过
java -jar直接运行(内嵌Tomcat常见)。 - WAR:需部署到Servlet容器(如Tomcat、Jetty、WildFly)。
- JAR:通过
- 依赖管理:
- Maven/Gradle构建的依赖库(
pom.xml或build.gradle)。 - 第三方服务依赖(数据库、消息队列等)。
- Maven/Gradle构建的依赖库(
3. 运行时配置
- JVM参数(关键!):
java -Xms512m -Xmx2G -XX:+UseG1GC -jar your-app.jar-Xms和-Xmx:堆内存初始值和最大值(建议设为相同值避免动态调整开销)。- 垃圾回收器:G1GC(JDK9+默认)、ZGC(低延迟场景)。
- 其他:
-XX:MaxMetaspaceSize(元空间)、-XX:+HeapDumpOnOutOfMemoryError(OOM时生成堆转储)。
- 配置文件:
application.properties/application.yml(Spring Boot)。- 外部化配置:通过
--spring.config.location指定路径。
4. 网络与端口
- 服务端口:默认
8080(Spring Boot),可通过server.port修改。 - 防火墙:开放端口(Linux示例):
sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload - HTTPS:配置SSL证书(如Let’s Encrypt)。
5. 部署方式
- 传统部署:
- 直接运行JAR/WAR。
- 使用
nohup或systemd保活(Linux):# systemd示例(/etc/systemd/system/myapp.service) [Service] ExecStart=/usr/bin/java -jar /path/to/your-app.jar User=appuser Restart=always
- 容器化(推荐):
- Docker示例:
FROM openjdk:17-jdk-slim COPY target/your-app.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] - Kubernetes:配置Deployment、Service、Ingress等。
- Docker示例:
6. 监控与运维
- 日志:
- 使用Logback/Log4j2,输出到文件或ELK。
- 日志轮转:通过
logrotate或框架自带配置。
- 健康检查:
- Spring Boot Actuator(
/actuator/health)。 - Prometheus + Grafana监控JVM指标。
- Spring Boot Actuator(
- APM工具:SkyWalking、New Relic、Arthas(线上诊断)。
7. 高可用与扩展
- 集群部署:通过Nginx/HAProxy负载均衡。
- 数据库连接池:HikariCP配置(如
spring.datasource.hikari.maximum-pool-size=20)。 - 缓存:Redis集成减少数据库压力。
8. 安全配置
- 权限控制:使用Spring Security或Shiro。
- 敏感信息:避免硬编码,使用Vault或环境变量。
- 防攻击:配置HTTPS、CORS、CSRF防护。
9. 备份与恢复
- 数据备份:定期备份数据库。
- 灾备方案:多可用区部署。
10. 自动化与CI/CD
- 构建工具:Jenkins/GitHub Actions打包镜像。
- 部署脚本:Ansible/Terraform自动化部署。
常见问题排查
- 端口冲突:
netstat -tulnp | grep 8080。 - 内存不足:调整JVM参数或检查内存泄漏。
- 启动失败:查看日志(
journalctl -u myapp或Docker日志)。
根据实际场景(如微服务、单体应用、云原生等),配置可能有所增减。建议从最小化配置开始,逐步优化。
云服务器