Linux环境下Java如何进行分布式部署
小樊
38
2025-12-20 02:01:16
Linux环境下Java分布式部署实操指南
一 架构与服务器规划
- 典型三层架构:接入层(Nginx 反向代理/负载均衡)→ 服务层(多台 Java 应用实例)→ 数据与中间件层(MySQL 8.0+、Redis 6.0+、对象存储如 MinIO,注册中心如 Nacos 2.x)。
- 建议最小集群(示例网段 192.168.100.0/24):
- 192.168.100.1:Nginx、MySQL、Redis、MinIO、Nacos(控制/管理面)
- 192.168.100.2 / 192.168.100.3:JDK + 应用服务节点(业务面,至少2个实例便于横向扩展)
- 常用端口规划:80/443(HTTP/HTTPS)、3306(MySQL)、6379(Redis)、8848(Nacos)、9000(MinIO)、8080(应用)。
二 基础环境准备
- 系统与网络
- 所有节点统一时区(如 Asia/Shanghai)、同步时间(如 chrony)、确保节点间 SSH 互通;按需配置 DNS/hosts。
- JDK 安装(示例 JDK 8/11)
- 方式一(RPM/仓库):
yum install -y java-11-openjdk-devel 或 yum install -y java-1.8.0-openjdk*
- 方式二(Tar 包):解压至 /usr/local/jdk,配置环境变量(
JAVA_HOME、PATH),执行 source /etc/profile 生效。
- 防火墙与端口
- 建议生产环境按白名单开放端口,示例:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload && firewall-cmd --list-ports
- 基础监控与日志
- 建议同步规划 Prometheus/Grafana 监控与 ELK(或 Loki/EFK)日志集中,便于分布式链路观测与排障。
三 中间件部署与高可用要点
- Nacos(服务注册与配置中心)
- 下载解压至 /usr/local/nacos;生产建议集群模式并接入 MySQL(执行
nacos-mysql.sql 初始化)。
- 配置
application.properties:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.100.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root、db.password.0=******
- 启动:单机
sh startup.sh -m standalone;集群 sh startup.sh;访问控制台 http://IP:8848/nacos(默认账号/密码 nacos/nacos)。
- MySQL 8.0
- 安装(Tar 包或仓库),初始化数据目录,启动服务;创建业务库与账号,按需配置主从复制/组复制以提升可用性。
- Redis 7.x
- 编译安装(
make && make install),以系统服务运行(/usr/local/bin/redis-server /etc/redis.conf),建议开启 AOF/RDB 持久化与必要安全配置(如绑定内网、设置密码)。
- MinIO(对象存储)
- 下载二进制至 /usr/local/bin/minio,数据目录 /data/minio;
- 启动:
minio server --address :9000 /data/minio;
- 建议以 systemd 托管并设置强口令(环境变量
MINIO_ROOT_USER / MINIO_ROOT_PASSWORD)。
- Nginx(四层/七层负载均衡)
- 安装(源码或仓库),配置 upstream 与反向代理:
- upstream:
server 192.168.100.2:8080; server 192.168.100.3:8080;
- server:
listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
- 启用
systemd 管理,支持热重载与开机自启。
四 Java应用部署与发布策略
- 打包与目录
- 构建可执行 Fat JAR(如
mvn clean package),上传至应用节点目录(如 /opt/app/),准备启动脚本与日志目录(如 /var/log/app/)。
- systemd 服务示例(/etc/systemd/system/app.service)
- [Unit] Description=My Java App
- [Service] Type=simple
- User=app
- WorkingDirectory=/opt/app
- ExecStart=/usr/bin/java -Xms2g -Xmx2g -jar /opt/app/app.jar --spring.profiles.active=prod
- Restart=always
- StandardOutput=journal
- StandardError=journal
- [Install] WantedBy=multi-user.target
- 常用命令:
systemctl daemon-reload && systemctl enable --now app
- 发布与回滚
- 蓝绿发布:准备两套目录(如 /opt/app/v1、/opt/app/v2),通过软链切换或 Nginx
upstream 权重/摘除节点实现零停机切换。
- 滚动升级:逐台替换实例并健康检查,确保容量冗余后再继续。
- 健康检查:应用暴露 /actuator/health;Nginx 可配置
health_check(商业版)或在外部做 TCP/HTTP 探活脚本。
- 配置与密钥
- 建议将可变配置托管至 Nacos 或 Kubernetes ConfigMap/Secret,避免硬编码;数据库、Redis、MinIO 等凭据使用 Vault 或 KMS 管理。
- 优雅停机
- 启用 JVM 关闭钩子(Spring Boot 默认),设置合理的
terminationGracePeriodSeconds(K8s 场景),先停止接收流量再等待处理中请求完成。
五 自动化与容器化方案
- Ansible 自动化
- 控制节点安装 Ansible,配置 SSH 免密 与 inventory(按角色分组:web、db、redis 等),通过 Playbook/Roles 一键部署 JDK、Nginx、应用与回滚;模板化配置(Jinja2)支持多环境差异化。
- Docker 与 Kubernetes
- Dockerfile 示例:
- FROM openjdk:11-jre-slim
- COPY target/app.jar /app.jar
- CMD [“java”,“-jar”,“/app.jar”]
- Kubernetes:
- 使用 Deployment 管理副本数(如 replicas: 3),Service 暴露端口,ConfigMap/Secret 注入配置与密钥;
- 借助 readiness/liveness 探针实现自动恢复与滚动升级;Ingress 统一南北向流量治理。
- 框架与生态
- Spring Boot 提供自动配置与内嵌容器,便于微服务快速交付;Quarkus/Micronaut 面向云原生,具备更快启动与更低内存占用,适合容器化与 Serverless 场景。