fundplatform/docker-compose.yml
zhangjf 5a2154c1a1 refactor: 简化路由逻辑,直接使用 tenantId 匹配实例
问题:tenantGroup 是 tenantId 的简单转换,造成冗余
  tenantGroup = "TENANT_" + tenantId.toUpperCase()

解决方案:
1. 直接使用 tenantId 匹配实例
   - 移除 tenantGroup 概念
   - 负载均衡器直接匹配 metadata.tenant-id

2. 简化配置
   - JWT 只需 tenantId 一个字段
   - 实例元数据只有 tenant-id

3. 前端简化
   - 请求头只需 X-Tenant-Id
   - 不再需要 X-Tenant-Group

路由规则:
  共享实例: metadata.tenant-id = "" (空)
  VIP实例:  metadata.tenant-id = "VIP_001"
  匹配逻辑: 找到匹配实例 → VIP专属,找不到 → 共享实例
2026-02-19 21:33:51 +08:00

528 lines
13 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 资金服务平台 - Docker Compose 编排配置
# 版本: 1.1
# 支持多租户混合模式VIP专属实例 + 普通租户共享实例
version: '3.8'
services:
# ==================== 基础设施服务 ====================
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: fund-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
MYSQL_DATABASE: fund_platform
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d:ro
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- fund-network
# Redis 缓存
redis:
image: redis:7-alpine
container_name: fund-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- fund-network
# Nacos 注册中心 & 配置中心
nacos:
image: nacos/nacos-server:v3.0.0
container_name: fund-nacos
restart: unless-stopped
environment:
MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
volumes:
- nacos_data:/home/nacos/logs
depends_on:
mysql:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 10
start_period: 60s
networks:
- fund-network
# ==================== 监控服务 ====================
# Prometheus 监控
prometheus:
image: prom/prometheus:v2.48.0
container_name: fund-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./docker/prometheus/rules:/etc/prometheus/rules:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
- '--web.enable-lifecycle'
networks:
- fund-network
# Grafana 可视化
grafana:
image: grafana/grafana:10.2.0
container_name: fund-grafana
restart: unless-stopped
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin123}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_SERVER_ROOT_URL: http://localhost:3000
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
- ./docker/grafana/dashboards:/var/lib/grafana/dashboards:ro
depends_on:
- prometheus
networks:
- fund-network
# ==================== 业务微服务 ====================
# API 网关
gateway:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-gateway
container_name: fund-gateway
restart: unless-stopped
environment:
SERVER_PORT: 8000
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8000:8000"
depends_on:
nacos:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# ==================== 系统服务(多租户混合模式) ====================
# 系统服务 - 共享实例(供所有租户使用)
fund-sys:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-sys
container_name: fund-sys-shared
restart: unless-stopped
environment:
SERVER_PORT: 8100
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
REDIS_HOST: redis
REDIS_PORT: 6379
JAVA_OPTS: -Xms256m -Xmx512m
# 租户 ID - 共享实例(空值,所有租户可用)
TENANT_ID: ""
ports:
- "8100:8100"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8100/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# 系统服务 - VIP_001 专属实例
fund-sys-vip001:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-sys
container_name: fund-sys-vip001
restart: unless-stopped
environment:
SERVER_PORT: 8101
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
REDIS_HOST: redis
REDIS_PORT: 6379
JAVA_OPTS: -Xms256m -Xmx512m
# 租户 ID - VIP_001 专属实例
TENANT_ID: "VIP_001"
ports:
- "8101:8101"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8101/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# 系统服务 - VIP_002 专属实例(可选,按需启用)
# fund-sys-vip002:
# build:
# context: .
# dockerfile: Dockerfile
# args:
# MODULE: fund-sys
# container_name: fund-sys-vip002
# restart: unless-stopped
# environment:
# SERVER_PORT: 8102
# SPRING_PROFILES_ACTIVE: docker
# NACOS_SERVER_ADDR: nacos:8848
# NACOS_USERNAME: nacos
# NACOS_PASSWORD: nacos
# MYSQL_HOST: mysql
# MYSQL_PORT: 3306
# MYSQL_DB: fund_platform
# MYSQL_USER: root
# MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
# REDIS_HOST: redis
# REDIS_PORT: 6379
# JAVA_OPTS: -Xms256m -Xmx512m
# # 租户 ID - VIP_002 专属实例
# TENANT_ID: "VIP_002"
# ports:
# - "8102:8102"
# depends_on:
# nacos:
# condition: service_healthy
# mysql:
# condition: service_healthy
# redis:
# condition: service_healthy
# healthcheck:
# test: ["CMD", "curl", "-f", "http://localhost:8102/actuator/health"]
# interval: 30s
# timeout: 10s
# retries: 5
# start_period: 120s
# networks:
# - fund-network
# 客户服务
fund-cust:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-cust
container_name: fund-cust
restart: unless-stopped
environment:
SERVER_PORT: 8200
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8200:8200"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 项目服务
fund-proj:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-proj
container_name: fund-proj
restart: unless-stopped
environment:
SERVER_PORT: 8300
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8300:8300"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 需求工单服务
fund-req:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-req
container_name: fund-req
restart: unless-stopped
environment:
SERVER_PORT: 8400
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8400:8400"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 支出服务
fund-exp:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-exp
container_name: fund-exp
restart: unless-stopped
environment:
SERVER_PORT: 8500
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8500:8500"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 收款服务
fund-receipt:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-receipt
container_name: fund-receipt
restart: unless-stopped
environment:
SERVER_PORT: 8600
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8600:8600"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 报表服务
fund-report:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-report
container_name: fund-report
restart: unless-stopped
environment:
SERVER_PORT: 8700
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8700:8700"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 文件服务
fund-file:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-file
container_name: fund-file
restart: unless-stopped
environment:
SERVER_PORT: 8800
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8800:8800"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# ==================== 网络配置 ====================
networks:
fund-network:
driver: bridge
name: fund-network
# ==================== 数据卷 ====================
volumes:
mysql_data:
name: fund-mysql-data
redis_data:
name: fund-redis-data
nacos_data:
name: fund-nacos-data
prometheus_data:
name: fund-prometheus-data
grafana_data:
name: fund-grafana-data