功能增强: - TENANT_ID 支持逗号分隔的多个租户 ID - 一个实例可以服务多个指定租户 实例类型: 共享实例: TENANT_ID = "" (空) 单租户专属: TENANT_ID = "VIP_001" 多租户专属: TENANT_ID = "VIP_001,VIP_002,VIP_003" 路由逻辑: 1. 解析实例 metadata.tenant-id 为租户列表 2. 检查请求 tenantId 是否在列表中 3. 匹配成功 → 专属实例 4. 匹配失败 → 回退共享实例 使用场景: - 大客户独占实例(单租户) - 多个小客户共享一个实例(多租户) - 普通客户使用公共实例(共享)
531 lines
13 KiB
YAML
531 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: ""
|
||
|
||
# 租户 ID - 多租户专属实例(逗号分隔,服务多个租户)
|
||
TENANT_ID: "VIP_001,VIP_002,VIP_003"
|
||
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 - 单租户专属实例
|
||
TENANT_ID: "VIP_004"
|
||
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
|