fundplatform/docker-compose.yml
zhangjf 5843cc050e feat: Docker Compose配置多租户混合模式负载均衡
## 主要改动

### docker-compose.yml
- fund-sys 服务改为混合模式部署:
  - fund-sys-shared: 共享实例(8100端口),供所有租户使用
  - fund-sys-vip001: VIP_001专属实例(8101端口)
  - 预留VIP_002模板(注释状态)
- 添加TENANT_ID、TENANT_GROUP环境变量

### NacosMetadataConfig
- 支持从环境变量读取租户元数据(优先级最高)
- 动态注册租户标签到Nacos
- 区分共享实例和VIP专属实例

### Prometheus配置
- 监控共享实例和VIP实例
- 添加tenant_mode、tenant_group标签

## 混合模式说明
- 共享实例(TENANT_GROUP为空): 所有普通租户请求路由到此类实例
- VIP实例(TENANT_GROUP有值): VIP租户请求路由到专属实例
2026-02-19 20:04:21 +08:00

531 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
# 租户元数据 - 共享实例(无特定租户组,所有租户可用)
TENANT_ID: "1"
TENANT_GROUP: ""
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
# 租户元数据 - VIP_001 专属实例
TENANT_ID: "1001"
TENANT_GROUP: "TENANT_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
# # 租户元数据 - VIP_002 专属实例
# TENANT_ID: "1002"
# TENANT_GROUP: "TENANT_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