问题: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专属,找不到 → 共享实例
528 lines
13 KiB
YAML
528 lines
13 KiB
YAML
# 资金服务平台 - 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
|