一、背景与问题

随着我们业务在全国各地拓展,客户逐渐分布在北京、上海、广州、成都、哈尔滨等多个地区。这些客户都使用我们统一开发的系统,部署在Spring Cloud体系下。然而,目前我们将所有客户的数据统一存储在客户数据中心或某一主节点,这导致以下问题:

  • 远程客户访问延迟高:南方客户访问部署在北方的数据中心,存在明显的网络时延。

  • 带宽与并发瓶颈:大量跨地域访问造成出口带宽压力大,影响系统性能。

  • 数据合规性:部分客户有本地化部署诉求或数据合规要求,要求数据不出本地。

因此,我们希望搭建一套多租户 SaaS 系统架构,保证:

  • 每个地方客户都能“就近访问”

  • 客户拥有自己的数据库实例

  • 后台统一管理、运维与升级


二、目标架构设计目标

目标 描述
高可用 系统必须实现跨地域高可用,支持多数据中心故障切换
高性能 客户访问延迟尽可能低,尤其是跨省访问
多租户隔离 每个客户使用独立数据库,实现数据物理隔离
易部署 SaaS 平台能够快速接入新客户并部署其数据库实例
易运维 支持统一监控、升级与配置管理

三、总体技术架构概览

1. 技术栈基础

  • 开发框架:Spring Boot + Spring Cloud (Gateway, Config, Eureka/Nacos, OpenFeign)

  • 服务注册与发现:Nacos + 自定义服务权重控制

  • 配置中心:Spring Cloud Config + Git

  • 链路追踪:SkyWalking

  • 服务网关:Spring Cloud Gateway + 租户路由

  • 数据库隔离:MySQL(客户私有部署)+ 动态多数据源支持

  • 缓存层:客户本地 Redis 或集中式 Redis Cluster(支持读写分离)


四、关键设计模块

1. 多租户识别与路由策略

方法一:基于域名识别
client1.example.com → 客户1租户ID
client2.example.com → 客户2租户ID

网关通过子域名解析当前租户,从而决定请求落地到哪个服务节点或数据库。

方法二:基于请求头

前端在登录后请求中携带租户标识:

X-Tenant-ID: client1

网关统一解析并添加到请求上下文中,供下游服务识别。


2. 多数据源切换机制(Spring Boot)

通过AbstractRoutingDataSource + ThreadLocal的方式实现多数据源切换。每个租户的数据库连接信息存储在配置中心或注册中心中,系统运行时动态加载。

public class TenantDataSourceRouter extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return TenantContext.getCurrentTenant();
    }
}

3. 就近部署策略(边缘节点)

将每个客户的数据节点部署在其所在城市或省份的边缘云服务商,例如:

  • 华北客户 → 北京云节点

  • 华南客户 → 广州边缘计算节点

  • 华中客户 → 武汉云服务节点

服务架构上采用类似 CDN 的边缘部署方式,客户访问的是最近的数据节点,服务逻辑和数据都近在本地。


4. 统一平台与管理后台

在总部部署一套统一后台系统,用于:

  • 租户管理(租户创建、授权、状态)

  • 版本控制与升级

  • 各地实例的心跳监控与健康检查

  • 数据备份同步任务调度

  • 故障报警与自动化修复


5. 数据同步与容灾设计

每个客户的数据由本地数据库负责主存,但可根据需要配置:

  • 主从复制:总部备份或区域节点热备

  • 异步数据上传:日志、审计数据每日上传总部

  • 容灾切换:跨节点部署的高可用数据库集群


五、访问优化策略

优化策略 说明
接入层网关部署本地化 Spring Cloud Gateway 根据租户域名做路由,网关部署在各地
前后端 CDN 分发 静态资源前置至 CDN,减少客户端加载耗时
数据库连接池本地化 每地服务连接本地数据库,最大化数据库访问性能
缓存就近分布 Redis 部署在客户本地,热点数据缓存避免频繁数据库访问
长连接优化 使用 HTTP/2 或 WebSocket 实现与服务端稳定通信

六、运维与监控设计

  • 多租户监控指标隔离(Prometheus + Grafana)

  • 链路追踪(SkyWalking 标记租户ID)

  • 配置管理统一下发(Spring Cloud Config 支持租户维度配置)

  • 告警系统对接钉钉/飞书


七、总结

在全国部署 SaaS 系统时,仅靠中心化部署已经难以满足客户性能与合规性要求。通过“就近访问+多租户隔离+本地化部署+中心管控”的架构设计,我们可以:

  1. 为每位客户提供更快的访问体验

  2. 实现数据物理隔离,增强安全合规性

  3. 支持快速扩展和敏捷部署

  4. 在 Spring Cloud 技术体系内保持良好的可维护性和标准化

这套架构既适合中大型客户使用,也便于未来支持海外扩展或省级政府、集团分支独立部署。


Logo

更多推荐