Files
jiebanke/docs/DEPLOYMENT_JAVA.md

10 KiB
Raw Blame History

📦 结伴客Java微服务部署指南

📋 项目概述

本文档详细说明了如何将结伴客Java微服务项目部署到生产环境。项目采用微服务架构包含多个独立的服务模块。

🛠️ 环境要求

服务器要求

  • 操作系统: Ubuntu 20.04+ / CentOS 7+ / macOS 10.15+
  • 内存: 最低 4GB推荐 8GB+
  • 存储: 最低 20GB 可用空间
  • 网络: 稳定的互联网连接

软件要求

  • JDK: Java 17
  • 构建工具: Maven 3.6+
  • 数据库: MySQL 8.0+
  • 缓存: Redis 6.0+
  • 消息队列: RabbitMQ 3.8+
  • 容器化: Docker 20.10+ 和 Docker Compose 1.29+

🏗️ 开发环境部署

1. 克隆项目

git clone <repository-url>
cd jiebanke/backend-java

2. 环境准备

确保已安装Java 17和Maven并验证安装

java -version
mvn -version

3. 构建项目

# 清理并构建项目
./build-services.sh

4. 启动服务

# 使用Docker Compose启动所有服务
docker-compose up -d

# 或者使用启动脚本启动服务
./start-services.sh

5. 验证部署

🧪 测试环境部署

1. 服务器准备

# 登录测试服务器
ssh user@test-server

# 创建项目目录
mkdir -p /opt/jiebanke
cd /opt/jiebanke

2. 部署脚本

#!/bin/bash
# deploy-test.sh

# 拉取最新代码
git pull origin develop

# 构建项目
cd backend-java
./build-services.sh

# 重启服务
docker-compose down
docker-compose up -d

3. 环境配置

# 测试环境变量
cat > /opt/jiebanke/backend-java/.env << EOF
DB_HOST=mysql.jiebanke.com
DB_PORT=3306
DB_USER=root
DB_PASSWORD=testpassword
DB_DATABASE=jiebanke_test
JWT_SECRET=your-test-jwt-secret
EOF

🚀 生产环境部署

1. 服务器准备

# 购买云服务器 (阿里云/腾讯云/AWS)
# 配置安全组: 开放80, 443, 8761, 8080-8090端口

# 服务器初始化
apt update && apt upgrade -y
apt install -y openjdk-17-jdk maven docker docker-compose

2. 数据库部署

# 安装MySQL
apt install -y mysql-server

# 安全配置
mysql_secure_installation

# 创建生产数据库
mysql -u root -p -e "CREATE DATABASE jiebanke CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 导入数据
mysql -u root -p jiebanke < scripts/init-database.sql

3. 应用部署

# 创建部署用户
adduser deploy
usermod -aG docker deploy

# 项目目录
mkdir -p /home/deploy/jiebanke
chown deploy:deploy /home/deploy/jiebanke

4. 自动化部署脚本

#!/bin/bash
# deploy-prod.sh

set -e

# 变量配置
APP_NAME="jiebanke"
APP_DIR="/home/deploy/jiebanke"
BRANCH="main"

echo "🚀 开始部署 $APP_NAME..."

# 拉取代码
echo "📦 拉取最新代码..."
cd $APP_DIR
git fetch origin
git checkout $BRANCH
git reset --hard origin/$BRANCH

# 构建项目
echo "🔧 构建项目..."
cd backend-java
./build-services.sh

# 停止当前服务
echo "⏹️ 停止当前服务..."
docker-compose down

# 启动新服务
echo "▶️ 启动新服务..."
docker-compose up -d

echo "✅ 部署完成!"
echo "🌐 Eureka Dashboard: http://your-domain.com:8761"
echo "🌐 API Gateway: http://your-domain.com:8080"

5. Nginx 配置

# /etc/nginx/sites-available/jiebanke
server {
    listen 80;
    server_name your-domain.com;
    
    # 反向代理到API网关
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

6. SSL证书配置

# 安装Certbot
apt install -y certbot python3-certbot-nginx

# 获取SSL证书
certbot --nginx -d your-domain.com

# 自动续期
certbot renew --dry-run

📊 监控与日志

应用监控

# 查看Docker容器状态
docker-compose ps

# 查看容器日志
docker-compose logs -f

# 查看特定服务日志
docker-compose logs -f user-service

日志管理

# 查看实时日志
docker-compose logs -f

# 查看特定服务日志
docker-compose logs -f auth-service

# 日志文件位置 (Docker容器内)
/var/log/jiebanke/

性能监控

# 安装监控工具
apt install -y htop iotop nmon

# 监控系统资源
top
htop

# 监控Docker资源使用
docker stats

# 监控磁盘使用
df -h

🔒 安全配置

防火墙配置

# 配置UFW防火墙
apt install -y ufw
ufw allow ssh
ufw allow http
ufw allow https
ufw allow 8761
ufw allow 8080
ufw enable

数据库安全

# 修改MySQL默认端口
vim /etc/mysql/mysql.conf.d/mysqld.cnf
# port = 3307

# 创建应用专用用户
mysql -u root -p -e "
CREATE USER 'appuser'@'%' IDENTIFIED BY 'strongpassword';
GRANT SELECT, INSERT, UPDATE, DELETE ON jiebanke.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
"

SSH安全

# 禁用root登录
vim /etc/ssh/sshd_config
# PermitRootLogin no

# 使用密钥认证
# PasswordAuthentication no

# 重启SSH
systemctl restart sshd

📦 容器化部署

Docker Compose 配置

# docker-compose.yml
version: '3.8'

services:
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: jiebanke-mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: jiebanke
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./scripts/init-database.sql:/docker-entrypoint-initdb.d/init-database.sql
    networks:
      - jiebanke-network

  # Redis缓存
  redis:
    image: redis:6.0
    container_name: jiebanke-redis
    ports:
      - "6379:6379"
    networks:
      - jiebanke-network

  # RabbitMQ消息队列
  rabbitmq:
    image: rabbitmq:3.8-management
    container_name: jiebanke-rabbitmq
    ports:
      - "5672:5672"
      - "15672:15672"
    networks:
      - jiebanke-network

  # Eureka服务注册中心
  eureka-server:
    build:
      context: ./eureka-server
    container_name: jiebanke-eureka
    ports:
      - "8761:8761"
    networks:
      - jiebanke-network

  # API网关
  gateway-service:
    build:
      context: ./gateway-service
    container_name: jiebanke-gateway
    ports:
      - "8080:8080"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server

  # 认证服务
  auth-service:
    build:
      context: ./auth-service
    container_name: jiebanke-auth
    ports:
      - "8081:8081"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

  # 用户服务
  user-service:
    build:
      context: ./user-service
    container_name: jiebanke-user
    ports:
      - "8082:8082"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

  # 旅行服务
  travel-service:
    build:
      context: ./travel-service
    container_name: jiebanke-travel
    ports:
      - "8083:8083"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

  # 动物服务
  animal-service:
    build:
      context: ./animal-service
    container_name: jiebanke-animal
    ports:
      - "8084:8084"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

  # 订单服务
  order-service:
    build:
      context: ./order-service
    container_name: jiebanke-order
    ports:
      - "8085:8085"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

  # 推广服务
  promotion-service:
    build:
      context: ./promotion-service
    container_name: jiebanke-promotion
    ports:
      - "8086:8086"
    networks:
      - jiebanke-network
    depends_on:
      - eureka-server
      - mysql

volumes:
  mysql_data:

networks:
  jiebanke-network:
    driver: bridge

Kubernetes部署 (可选)

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jiebanke-eureka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: eureka
  template:
    metadata:
      labels:
        app: eureka
    spec:
      containers:
      - name: eureka
        image: jiebanke/eureka-server:latest
        ports:
        - containerPort: 8761
---
apiVersion: v1
kind: Service
metadata:
  name: eureka-service
spec:
  selector:
    app: eureka
  ports:
  - port: 8761
    targetPort: 8761
  type: ClusterIP

🚨 故障排除

常见问题

  1. 端口占用
# 查找占用端口的进程
lsof -i :8080

# 杀死进程
kill -9 <PID>
  1. 权限问题
# 修改文件权限
chown -R deploy:deploy /home/deploy/jiebanke
chmod -R 755 /home/deploy/jiebanke
  1. 数据库连接失败
# 检查MySQL服务
systemctl status mysql

# 检查防火墙
ufw status
  1. Docker容器问题
# 查看容器状态
docker-compose ps

# 查看容器日志
docker-compose logs <service-name>

# 重新构建容器
docker-compose build --no-cache

日志分析

# 查看错误日志
docker-compose logs -f --tail 100

# 查看特定服务日志
docker-compose logs -f user-service

# 数据库日志
tail -f /var/log/mysql/error.log

📞 支持与维护

紧急联系人

维护窗口

  • 常规维护: 每周四凌晨 2:00-4:00
  • 紧急维护: 随时响应
  • 系统监控: 7x24小时

备份策略

# 数据库备份
mysqldump -u root -p jiebanke > backup-$(date +%Y%m%d).sql

# 文件备份
tar -czf backup-$(date +%Y%m%d).tar.gz /home/deploy/jiebanke

# 上传到云存储
rclone copy backup-* remote:backups/

🎯 性能优化建议

JVM调优

# 在Dockerfile中设置JVM参数
ENV JAVA_OPTS="-Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

数据库连接池优化

# 在application.yml中配置
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000

Redis连接池优化

# 在application.yml中配置
spring:
  redis:
    lettuce:
      pool:
        max-active: 20
        max-idle: 10
        min-idle: 5
        max-wait: 2000ms

负载均衡优化

# 在application.yml中配置
ribbon:
  ConnectTimeout: 3000
  ReadTimeout: 10000
  MaxAutoRetriesNextServer: 1
  MaxAutoRetries: 0

最后更新: 2025年 📅