ToB架构师避坑指南:拒绝过度设计,用ROI思维构建高可用开放平台,一份设计指南

0 阅读47分钟

作者:面汤放盐 | uzong

本文将系统且全面地讨论如何设计一个开放平台,内容涉及布局、设计、踩坑及经验分享等。

面向群体:工程师、技术负责人、架构师等。

1. 开放平台

1.1. 定位清晰、MVP先行、ROI导向

需界定平台是专注于数据开放、能力开放,还是构建综合生态;同时明确目标用户群体,是服务大型企业、中小企业,还是特定行业客户

清晰的定位和画像直接决定了模块建设的优先级、功能深度及技术选型,是后续所有设计决策的基石,必须在方案初期落实。

在此基础上,应遵循 YAGNI(You Ain't Gonna Need It)原则和 MVP(最小可行产品)策略,避免过度工程化。技术负责人需精准计算 ROI(投资回报率),确保资源集中投入高价值场景。

1.2. 全景架构图

基于“大而全”的平台愿景,我们构建了全景架构蓝图。

在此基础上,需逐一拆解模块,明确核心必需功能与非必要功能的边界。每个模块的建设深度应严格匹配平台的定位、预期规模及目标用户群体,以确保投入产出比(ROI)合理。

1.3. 开放平台的挑战

开放平台建设需遵循安全、稳定、可扩展及高可用原则,以支撑长远发展。但这并非易事:网关设计作为核心系统工程,其最大挑战在于如何在确保内部系统稳定与安全的前提下,高效、便捷地向外部开发者开放能力。

技术类

  • 安全与治理挑战
  • 技术与架构挑战
  • 运维与监控挑战

非技术类

  • 开发者体验挑战

1.4. 开放平台模块组成

先敲定了开放平台的组成模块,给出优先级。比如大概分如下多个模块:

优先级模块名称建设原因与说明
P0(最高)平台网关这是开放平台的“大门”和“心脏”。没有网关,外部流量无法进入,内部服务无法暴露。它是所有API请求的必经之路,负责鉴权、限流、路由等核心功能。必须第一个建设,否则其他系统都是空架子。
P0(最高)接口上架负责API的定义、发布等。它是连接内部服务提供者和外部开发者的关键桥梁,决定了平台能提供什么能力。
P1(高)开发者前台开发者接入平台的第一站,用于展示文档、SDK下载、快速入门。如果开发者找不到文档或看不懂怎么用,网关和接口再强大也没人用。它是降低接入门槛的关键。前期用户少,甚至可以是一份标准的 doc 文档,但不是长久之计
P1(高)监控告警系统稳定性保障,平台上线后,必须实时掌握运行状态。用于监控API调用量、响应时间、错误率等。一旦出现故障(如雪崩、超时),能第一时间告警,保障业务连续性。
P2平台调控运营中心精细化管理,用于管理开发者账号、分配应用Key/Secret、设置流量配额、计费策略等。在平台初期用户量少时,可以通过人工或简单脚本处理;但随着用户增长,必须建立系统化管理能力。
P3开发者后台自助服务能力,供开发者管理自己的应用、查看调用数据、申请权限等。虽然重要,但初期可先提供基础功能,后续再逐步完善自助服务体验。
P4客服支持系统服务兜底,主要用于处理工单、在线咨询、知识库管理。在平台初期,开发者问题较少,可通过微信群、邮件等人工方式解决;当用户规模扩大后,需要系统化提升服务效率。

1.5. 天生多租户架构

开放平台采用标准的 SaaS 架构,专为【多租户】设计。

在设计开放平台时,需要支持单租户下的多应用架构。以此满足企业内部的复杂扩展需求,实现细粒度的权限管控多业务场景隔离,确保不同应用间的数据与功能互不干扰。

1.6. 建设原则和边界

建设原则:只做当下真正有用的功能,快速迭代,把精力全砸在能产生价值的高地,别搞花架子。别整虚的,只干有用的。

建设边界:仅限 ToB 企业场景,不涉及个人开发者,聚焦内部能力对外输出(纯 API),不涵盖国际化、开发者社区及运营体系建设等。

角色约束

角色描述
开发者使用开放平台的企业的研发人员
租户/ISV/ 第三方企业/开发者使用开放平台对应的企业
平台运营者负责平台审核、管控、运营、赋能的内部人员

架构是慢慢改出来的,没有一上来就完美无缺的。千万别为了显得高大上,还没跑通业务就先搞什么高并发、大流量那一套,那是浪费钱。

2. 开发者前台

面向开发者的系统设计通常包含两类核心界面开发者门户(前台)开发者控制台(后台)
尽管初期可仅通过文档满足需求,但从长远生态建设的角度看,这两套系统是不可或缺的。

2.1. 开发者文档

试着站在全景视角,构想一个理想的开放平台文档架构。如下图所示:

然而文档即产品,在开放平台里,API 文档是连接你和开发者的核心桥梁。一份好的文档,不仅能帮开发者快速上手、降低接入成本,更是平台专业度的直接体现。

文档应以开发者的视角,解答他们在接入、开发、测试和维护过程中可能遇到的所有问题。

比如:包含搜索、快速入门、最佳实践等,如下所示:

切忌错别字、逻辑错误等,让客户觉得不专业、不严谨。 比如在某开发平台官网文档的变更日志上就出现了日期格式不一致的问题。

开发者群体极度依赖口碑传播。一条负面评价(如“文档烂”、“接口不稳定”)可能劝退十倍潜在用户。

API 文档的核心要点:一致性、准确性、实时性和 交互性与可测试性。

2.2. 核心组成-API(最核心)

这是 API 文档的核心,每个接口都应提供详尽的说明。接口名称与描述、路径、返回体等等。

2.3. 核心组成-常见问题与故障排查(重要)

收集开发者在接入和使用过程中遇到的常见问题,并提供解决方案。

  • 常见问题解答:按类别组织,方便开发者自助查询。
  • 故障排查指南:针对常见的错误场景(如认证失败、参数错误、网络问题)提供排查步骤和建议。

2.4. 技术实现

开发者前台通常无需登录,核心模块是开发者文档;但出于安全等因素考虑,部分企业会将其设计为需登录后访问

开发者指南类型描述
对接文档、PDF/DOC文档- 客户群体少、快速MVP、资源不足、不长期投入
apifox、其他文档工具- 有一定客户群体、资源不足、公司规范
独立网站- 客户群体成熟、长远发展、重视客户体验,支持登录

如果追求快速高效,可以推荐 apifox,支持自定义域名,抓住核心,点击 apifox分享文档方案

涉及调试、工单提交及自助排查等敏感功能,原则上应置于后台。即使出于便利将其展示在前台,也必须强制要求用户登录后方可访问

3. 开发者后台

开发者控制台不仅是配置界面,更是开放平台开发者体验的核心枢纽,是平台安全策略、流量治理和商业化逻辑的最终落地阵地。一个卓越的控制台应具备‘自服务、高透明、强安全’的特征,旨在将繁琐的技术对接转化为流畅的自助式服务流程

下面重点讲解几个关键模块。

3.1. 密钥管理

密钥和应用Id绑定。

3.2. 回调技术

业务系统与开放平台之间存在状态同步需求。当平台侧的业务数据发生变更时,开发者系统需实时感知并做出响应。因此,建立可靠的回调机制是确保数据一致性与业务时效性的关键。

方式描述与特点
长连接 (WebSocket)SDK 与开放平台建立全双工 WebSocket 通道。 • 安全内置:通信全程加密并内置鉴权逻辑。 • 零配置:开发者无需自行处理解密、验签,也无需部署防火墙或配置 IP 白名单。
HTTP / Webhook基于标准 HTTP 协议的标准回调模式。 • 配置灵活:开发者设置回调地址即可。 • 基础安全:支持 Token、Private Key 等简易加密与签名校验机制。
定时轮询 (Polling)开发者主动发起请求拉取变更数据。 • 算法保障:内置加密算法确保数据完整性。 • 状态同步:可结合长连接信息实现高效的状态同步。

开放平台回调系统的难点,在于如何在复杂网络环境下,确保消息安全、准时且幂等地送达。这不仅是简单的 HTTP 请求,更是一项涵盖高并发异步处理、可靠投递、签名校验及自服务监控的系统工程。

3.3. 回调技术-长连接(复杂)

可以参考:飞书开放平台 SDK

以 Java 为例子。在 SDK 中客户端与飞书开放平台建立一个双向连接的关键代码。构建一个 WebSocket 连接

通过 appKey/appSecret 与飞书建立连接。

private String getConnUrl() throws IOException {
    String body = String.format("{"AppID": "%s", "AppSecret": "%s"}", this.appId, this.appSecret);
    Request request = new Request.Builder()
            .url("https://open.feishu.cn"+ "/callback/ws/endpoint")
            .addHeader("locale", "zh")
            .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), body))
            .build();
    try (Response response = this.httpClient.newCall(request).execute()) {
        if (response.code() != 200 || response.body() == null) {
            throw new ServerException(response.code(), "system busy");
        }

        EndpointResp resp = Jsons.DEFAULT.fromJson(response.body().string(), EndpointResp.class);
        if (resp.getCode() == OK) {
            // do nothing
        } else if (resp.getCode() == SYSTEM_BUSY) {
            throw new ServerException(resp.getCode(), "system busy");
        } else if (resp.getCode() == INTERNAL_ERROR) {
            throw new ServerException(resp.getCode(), resp.getMsg());
        } else {
            throw new ClientException(resp.getCode(), resp.getMsg());
        }

        Endpoint data = resp.getData();
        if (data.getClientConfig() != null) {
            this.configure(data.getClientConfig());
        }

        return data.getUrl();
    }
}

可以参考飞书回调设计我们自己开放平台的 SDK。

注意:WebSocket 运维难题 :NAT超时、心跳保活、客户端断线重连风暴、负载均衡器长连接粘性。幂等性,这是回调的核心(网络超时后重试,如何保证不重复处理)。

这部分的设计和实现都较重,没有太多资源,通常不建议这种方式。

3.4. 回调技术-webhook

参考飞书开放平台的webhook

Webhook 是开放平台中“坑”最多的模块。 表面上看只是发送一个 HTTP 请求,实际上涉及可靠投递、安全校验、顺序保证、开发者调试等一系列复杂问题。

开发者的服务器环境是不可控的。它可能面临宕机、超时、返回错误、处理缓慢或重启等情况。
平台目标:在不可控的环境下,保证消息安全、可靠、不重复地送达.。

当投递失败时,采用指数退避策略进行自动重试。开发者回调接口暴露公网,必须验证消息来源合法性。

回调地址必须进行白名单校验(开发者在后台配置白名单,仅允许白名单内的地址接收回调),禁止配置公网通配地址。做好简单的加密,主要是对开发者服务器安全比较重要

比如参考飞书设计 webhook 的安全策略。(配置加密策略,以加密传输事件数据并校验请求来源是否有风险)

超时控制:设置合理的超时阈值(如 1-3秒),建议开发者快速响应并异步处理业务,避免因长耗时导致连接被强制断开。耗时严重时,对服务端是有较大压力

3.5. 定时轮询(轻量)

并非所有场景都适合 Webhook。部分开放平台为了降低接入复杂度,选择不投入 Webhook 的建设成本,而是提供 定时轮询接口供客户获取状态。

轻量场景轮询是最优解,没必要硬上 Webhook 增加复杂度。 在项目初期或资源受限(追求高 ROI)的情况下,优先采用轮询模式是更务实的选择。

3.6. 工单系统

开放平台工单系统是连接开发者与平台运营、技术支持团队的关键桥梁。一个设计良好、高效运转的工单系统不仅能提升开发者体验,快速响应并解决开发者遇到的问题,还能沉淀知识、优化产品,并有效管理技术支持成本

开放平台工单系统是提升开发者体验、保障平台稳定运行的重要组成部分。

3.7. 自助排查

在运营/工单系统中,直接嵌入可观测性视图。输入requestId租户ID

展示该请求的调用链路拓扑图、关联的日志上下文(自动过滤出该requestId的所有日志);该租户的历史调用趋势、错误率、限流次数一键生成排障报告,可直接发送给开发者等。

定期分析高频问题,推动产品/文档改进,而非单纯靠人工重复回答。

3.8. 调试/测试 (重要)

API 调试平台能显著降低开发者的接入成本

虽然重要,但是这部分的建设需要考虑数据安全等众多问题。

在介绍完开发者相关的内容后,接下来我们将深入探讨网关的设计。

4. 开放平台 API 网关(重点)

网关是开放平台的“咽喉”,其性能与安全直接决定平台生死。为满足高性能要求,鉴权与路由必须摒弃传统同步数据库查询,转而采用“多级缓存+无状态校验”架构。作为平台最核心的组件,网关的重要性不言而喻。

整体请求链路 一个请求进来,网关的处理顺序很重要,顺序错了会有性能问题或者安全漏洞。

  • 黑名单拦截:最先做,成本最低,直接拒绝恶意 IP/Key
  • 权限校验:确认有权限调用这个接口
  • 限流检查:全局限流 → 租户限流 → 接口限流
  • 通用参数校验:必填项、类型、格式
  • 路由转发:找到目标服务,转发请求
  • 响应处理:字段映射、脱敏、统一格式封装
  • 审计日志异步写入:不阻塞响应

网关作为流量唯一入口,切忌因过度承载业务逻辑而异化为难以维护的单体应用。仅专注于鉴权、限流、路由、协议转换及审计日志等核心功能,坚决隔离业务逻辑。团队须对此形成共识,严防网关随业务发展而腐化

4.1. 限流与流量控制

API 流量的第一道防线,其承载着所有的流量,不仅仅是正常流量,还有可能各种异常流量。

限流策略需支持租户、API 等多维度组合,避免单一维度带来的局限,做好考量。

4.1.1. 惨痛的经历

当时平台有个硬性限制,接口处理只要超过3秒就会判定失败。偏偏供应商那边配置了失败重试机制,一旦超时它就疯狂重试。结果就是,接口因为处理慢而失败,供应商又因为失败而重试,导致服务器上瞬间堆积了大量的下载任务。

没过多久,服务器内存直接爆了(OOM)。最让我们绝望的是,当时的系统架构只支持API维度的全局限流,根本没有‘租户+API’这种细粒度的控制。这让我们陷入了一个死局:不限流,服务立马宕机;限流吧,又会误伤其他无辜的正常租户。那一刻的无奈,至今难忘。

4.1.2. 黑白名单

黑名单:针对恶意的刷量等,甚至需要进行黑名单机制限制,识别客户端IP、用户Id等。进行黑名单限制。

4.2. 鉴权中心-- TOB 企业鉴权模式

使用摘要签名认证方式(APP Key和APP Secret),客户端在调用API时,需要使用签名密钥对请求内容进行签名计算,并将签名同步传输给服务器端进行签名验证。( TOB 开放平台的主流模式)

4.2.1. AppKey/AppSecret 验签过程

  • 客户端调用 API 时,需要使用已授权签名密钥对请求内容的关键数据进行加密签名计算,并且将APP Key和加密后生成的字符串放在请求的 Header 传输给API网关
  • API网关会读取请求中的APP Key的头信息,并且根据APP Key的值查询到对应的APP Secret的值,使用APP Secret对收到的请求中的关键数据进行签名计算,并且使用自己的生成的签名和客户端传上来的签名进行比对,来验证签名的正确性。
  • 只有签名验证通过的请求才会发送给后端服务,否则API网关会认为该请求为非法请求,直接返回错误响应。

4.2.2. 摘要签名认证方式原理说明

API的调用方需要在调用API之前获取到已经授权给对应API的签名密钥对。 AppKey/AppSecret。

客户端生成签名

客户端生成签名一共分三步处理:

  1. 从原始请求中提取关键数据,得到一个用来签名的签名串。
  2. 使用加密算法,对关键数据签名串进行加密处理,得到签名。
  3. 将签名所相关的所有头加入到原始HTTP请求中,得到最终HTTP请求

服务器端验证签名

服务器验证客户端签名一共分四步处理:

  1. 从接收到的请求中提取关键数据,得到一个用来签名的签名串。
  2. 从接收到的请求中读取APP Key,通过APP Key查询到对应的APP Secret。
  3. 使用加密算法和APP Secret对关键数据签名串进行加密处理,得到签名。
  4. 从接收到的请求中读取客户端签名,对比服务器端签名和客户端签名的一致性

具体参考:签名算法细节可以参考阿里云

4.2.3. 签名校验--参数理解

  • 时间戳校验:网关检查 Timestamp 与服务器时间差是否在允许范围(如 ±5分钟),防止重放攻击。
  • Nonce 去重:在 Redis 中记录 Nonce,有效期内重复即拒绝。(TTL设为timestamp窗口 + 5分钟即最大重放窗口+缓冲)
  • 密钥缓存:网关本地缓存存储 AppKey -> AppSecret,避免每笔请求查库。
  • 数字签名 (Sign): 采用 HMAC-SHA256。所有请求参数参与签名,防止链路劫持和参数篡改

4.2.4. 注意事项

  • 时钟不同步:服务器必须使用 NTP 同步,允许 ±5 分钟误差;客户端 SDK 要处理时钟偏移问题
  • 参数排序不一致:文档必须明确:字典序、大小写敏感、空值是否参与签名
  • SDK 要统一实现,不能让开发者自己实现签名
  • 特殊字符编码 → URL 参数需要先 decode 再参与签名,否则 %20 和空格会导致签名不一致

4.3. 路由 && 负载均衡

网关需要根据接口请求,路由到不同的后端服务提供者。

路由必须有一层关系映射。

路由举例优缺点
不同的路径- /api/order
  • /api/product..... 不同 API 使用不同的路径 | 路由规则清晰,对开发者友好 | | 使用参数控制(固定参数) | /xxx/api{"apiName":"xxx"} | **** |

路由规则必须支持动态更新,不能重启网关才能生效。路由配置存在配置中心(Nacos/Apollo),网关监听配置变更,实时更新本地路由表。业务系统的API,常见有 RPC 和 HTTP。

4.3.1. 举例泛化调用

比如对 RPC 泛化调用实现一个简单路由。要考虑异步、动态路由

public Mono<ApiResponse<?>> invokeRpc(RouteRule rule, byte[] requestBody) {
    return Mono.fromFuture(() -> CompletableFuture.supplyAsync(() -> {
        try {
            // 1. 反序列化请求体
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = mapper.readTree(requestBody);
            
            // 2. 构建参数列表 (根据 paramTypes 动态转换)
            Object[] args = buildArgs(node, rule.getParamTypes());
            
            // 3. 调用 Dubbo 泛化接口
            Result result = genericService.invoke(rule.getMethodName(), 
                rule.getParamTypes().toArray(new String[0]), args, 
                rule.getVersion(), rule.getGroup());
            
            Object value = result.getValue();
            return ApiResponse.success(value);

        } catch (Exception e) {
            log.error("RPC Invoke Failed: {} - {}", rule.getId(), e.getMessage(), e);
            return ApiResponse.error(500, "Internal Server Error");
        }
    }, rpcExecutor));
}

关键步骤:

  • 配置与代码分离,通过 Nacos 管理路由规则,修改路由无需重新编译发布。
  • 独立的线程池 + 异常捕获,单个服务故障不会拖垮网关
  • 超时控制 (timeout=3000) 防止长尾延迟。

4.3.2. 动态配置

@Data
@Component
@ConfigurationProperties(prefix = "gateway.rules")
public class DynamicRouteConfig implements ApplicationContextAware {
    
    private List<RouteRule> rules;

    // 注意:在真实生产中,应配合 Nacos 的 ConfigChangeListener 实时更新此列表
    // 或者使用 Spring Cloud Gateway 的 RouteDefinitionWriter 将配置写入内存路由表
    // 此处仅为展示配置属性绑定
}

在此层级,可基于定制路由策略实现流量隔离,如将测试租户路由至专属集群或沙箱环境

4.4. 灰度策略(灰度开关)

灰度方案通过多维度的渐进式发布(支持租户、应用、用户),实现新能力平滑上线,最小化全量发布的业务风险

/**
 * 决策入口
 * @param exchange 请求上下文
 * @return 返回灰度策略对象,若为空则不灰度
 */
public GrayStrategy decide(ServerWebExchange exchange) {
    if (!routeConfig.isGlobalEnabled()) {
        return null;
    }

    // 1. 提取维度信息
    ServerHttpRequest request = exchange.getRequest();
    
    String tenantId = request.getHeaders().getFirst("X-Tenant-ID");
    String appId = request.getHeaders().getFirst("X-App-ID");
    String userId = request.getHeaders().getFirst("X-User-ID"); // 可能来自 Token 解析
    String path = request.getURI().getPath();
    
    // 2. 获取规则
    List<GrayRule> rules = xxx 
    
    // 3. 返回匹配规则
    return matches(rules); // 未命中任何规则
}

4.5. 分级治理思想

不要把所有流量都扔给核心网关; 网关的“分级治理”策略。

  • 边缘网关: 部署在公网,负责SSL卸载、DDoS清洗、黑白名单拦截。这里可以使用云厂商的托管服务或OpenResty,追求极致性能。(技术选型为OpenResty(轻量、高性能),部署在公网边缘节点。
  • 内部网关: 部署在内网,负责复杂的鉴权、流量染色、灰度发布。这里使用Java生态,追求灵活性。(技术选型为Spring Cloud Gateway(Java生态,灵活),部署在内网,承担鉴权、限流、路由、协议转换、审计日志异步写入,严格遵循“不嵌入业务逻辑”的原则,每次迭代必须经过架构师审核)

4.6. 网关架构注意事项(其他)

  • 针对企业网关的建设,建议和业务网关分库,切忌将开放平台网关和业务网关整合到一块。按照职责做好隔离。
  • 强制 HTTPS(TLS 1.2+),禁止 HTTP 降级。这个是最基本的安全要求。

5. 接口上架平台

API来源分散且标准不一时,混乱在所难免。我们需要一个统一平台来屏蔽底层差异,通过制定统一标准和抽象通用能力,解决“各家一套”接口带来的治理难题

5.1. 规范层

所有上架到开放平台的接口都应该遵循一致性。标准统一、切记命名等不一致。

  • 一致性的命名规范
  • 一致性的文档规范
  • 一致性的接口规范
  • 一致的错误码
  • ......

这一层可以是一个有UI的系统、也可以是一个标准的 SOP 文档。但标准必须要有。

  • 定义内容:路径、方法、参数结构、响应体、错误码规范、所需 Scope。不符合规范的设计直接驳回,不允许进入审核。

5.2. API 包装层(慎重)

API 包装层(通常称为“元数据驱动适配层”或“动态网关层”)。 API数据不多,没有必要上这一层。

内容:API 定义、字段映射规则(Source -> Target)、校验规则(必填、类型、正则、长度)、转换规则(枚举值翻译)

版本控制:支持 API 版本管理(v1, v2),避免破坏性变更。

设计一些元数据

{
  "apiId": "user_register",
  "version": "1.0",
  
  "route": {
    "service": "user-service",
    "path": "/internal/v1/users/register",
    "method": "POST"
  },

  "mappings": {
    "input": [
      {
        "from": "uid",
        "to": "userId",
        "default": null,
        "transform": "none"
      },
      {
        "from": "mobile",
        "to": "phone",
        "default": "",
        "transform": "trim"
      }
    ],
    "output": [
      {
        "from": "id",
        "to": "userId",
        "transform": "none"
      }
    ]
  },

  "validation": {
    "required": ["uid", "mobile"],
    "rules": {
      "uid": {
        "type": "string",
        "minLength": 6,
        "maxLength": 20
      },
      "mobile": {
        "type": "string",
        "pattern": "^1[3-9]\d{9}$"
      }
    }
  }
}

校验引擎: 基于元数据定义的 Schema(类似 JSON Schema)进行运行时校验,仅支持最简单的校验即可。

5.3. API 生命周期管理 && 审核

API 的完整生命周期(设计 → 审核 → 发布 → 灰度 → 废弃 → 下线)

无生命周期管理的后果

  • 不敢下线:旧接口堆积,维护成本激增。
  • 文档混乱:新旧版本混杂,开发者无所适从。
  • 生态僵化:新接口难以推广,技术债务越积越重

建立一套从设计到下线的全流程管控机制,确保接口变更的可控性、透明度和平滑过渡。

任何变更都需要有严格的审核流程,如果没有正确的变更,可能引发灾难性问题,比如接口不兼容、接口不规范等。

  • 审核维度
    1. 合理性:接口设计是否满足业务场景,是否存在过度设计。
    2. 安全性:是否有数据泄露风险、权限控制是否完备。
    3. 文档完整性:参数说明、示例代码、边界条件是否清晰。
    4. 兼容性:是否与现有生态产生冲突。

5.4. 灰度发布方案设计

灰度发布是保障系统稳定性、降低发布风险、提升开发者体验的核心技术手段。

  • API 兼容性风险: 即使是微小的字段改动,也可能导致数千个外部 App 崩溃。
  • 性能回归风险: 新代码可能在高并发下产生内存泄漏或死锁。
  • 爆炸半径控制: 灰度可以将故障影响限制在 1% 的流量或特定的非核心租户内。

  • 灰度规则必须存储在分布式配置中心(如 Apollo, Nacos),确保一键回滚。
  • 避免长期灰度,灰度是过程,不是状态。长期并存两个版本会极大增加维护成本和数据库迁移难度。

灰度发布

  • 策略:不直接全量开放,先对特定租户开放。
  • 对象:内测租户、白名单租户、部分合作伙伴。
  • 时间窗口:设定明确的灰度周期(如 x 周),严禁无限期灰度
  • 验证:收集反馈,修复 Bug,确认稳定性后触发全量。

分层灰度策略

需要按照金丝雀发布发布,分配发布、观察后再进入下一步。稳定至关重要。

全量发布

  • 状态:正式对所有开发者开放,文档公开,Scope 可申请。
  • 黄金法则进入稳定期,严禁破坏性变更(Breaking Changes)。
  • 如需变更,必须走新版本号迭代流程

5.5. 下架流程

“废弃”不等于“下线”,废弃是给开发者的缓冲期; 平台必须在废弃前提供足够长的通知期,并通过以下渠道同时触达。并提供迁移支持。

5.6. 版本管理

采用 URL 路径嵌入版本号 方式,最为清晰直观。

  • /v1/orders/query
  • /v2/orders/query

避免使用 Query 参数 (?version=1) 或 Header (Accept-Version: v1),这容易导致缓存失效和调试困难。

变更类型描述处理方式
非破坏性变更新增可选参数、新增枚举值、优化响应性能可在当前版本内更新,无需发版
破坏性变更删除必填参数、修改参数类型、改变返回结构必须升级主版本号 (v1 -> v2),旧版本进入废弃流程

6. 开放平台一些细节

在开放平台中,SaaS的弊端会被放大.

6.1. 多租户架构选型

架构模式描述优点缺点适用场景
独立数据库(物理隔离)每个租户拥有独立的数据库实例数据隔离最强,安全合规最好成本最高,运维复杂大型企业客户、金融/医疗等高合规需求
共享数据库 + 独立Schema(混合隔离)。一般不推荐所有租户共享DB但使用不同Schema平衡了隔离性与成本管理复杂度中等中型企业客户
共享数据库 + 共享表(逻辑隔离)所有租户在同一表中通过tenant_id区分成本低,扩展简单隔离性最差,单点故障影响大中小企业、海量租户场景

实际中还有一些变化。比如针对数据量不同,大数据量使用独立库、小数据量使用独特的表。(按组合方式)。 当数据量较大时, 租户可从共享库迁移到独立库(运维能力)。

从共享表迁移到独立库(或独立 Schema)的标准流程。(注意:在双写期间,一旦出现数据不一致(如网络抖动、代码Bug),修复成本极高,且很难回滚)

6.2. 资源共享导致的"天坑"问题

核心挑战在于如何在共享资源与租户隔离之间取得平衡。

问题类型表现影响解决方案
计算资源某租户大量CPU/内存占用导致其他租户卡顿服务响应变慢甚至不可用配额限制 + 自动限流
存储资源单个租户数据量过大撑爆共享存储空间磁盘I/O阻塞,全系统变慢存储配额监控 + 分级存储
网络带宽某个租户大量下载/上传占满带宽其他租户访问延迟CDN分流 + QoS策略
API调用某租户高频调用接口耗尽配额API网关超时/拒绝速率限制+令牌桶算法
数据库连接数单个租户占满连接池其他租户无法获取连接动态连接池分配 + 超时熔断

6.3. 隔离性-tenant_id 贯穿始终

数据隔离是 SaaS 的生命线。一旦发生租户数据越权访问,将是毁灭性的灾难。

所有的设计都务必要将 tenant_id 贯穿始终,这是隔离的条件。第一行代码开始,就把 tenant_id 视为系统的第一等公民。必须通过框架层强制实现,而非依赖人工自觉。

从 Token 或签名中解析 tenant_id,注入 HTTP Header (X-Tenant-Id)。

  1. 网关层: 在网关层解析 tenant_id 后,通过过滤器(Filter/Interceptor)自动注入到 ThreadLocalContext
  2. 服务层:
    • 框架自动从 Header 提取 tenant_id
    • 存入 ThreadLocal (当前线程上下文)。
    • 业务代码通过 TenantContext.get() 获取,无需手动传参。
  1. 数据层:
    • MyBatis 拦截器自动在所有 SELECT/UPDATE/DELETE 语句中注入 AND tenant_id = ?
    • INSERT 语句自动填充 tenant_id 字段。 (如果业务代码中写了 JOIN 语句或者复杂的 IN 查询,MyBatis 拦截器很难 100% 覆盖所有 SQL 场景,一旦漏掉一个 WHERE 条件,就会导致数据越权泄露。)
  1. 清理:请求结束后,框架自动清理 ThreadLocal,防止线程复用导致的数据污染

多租户隔离是开放平台的“生命线”。工程落地的核心在于自动化纵深防御。通过框架强制、异步补偿、资源隔离和多重校验,才能构建一个既安全又稳定的多租户环境。

6.4. 隔离性-其他中间件

缓存隔离、中间件隔离、资源隔离。在设计时都应该考量。(务必基于业务场景提炼进行选择性设计)

缓存隔离:Redis采用“租户级前缀”(如tenant:{tenantId}:key),避免缓存污染;本地缓存采用“租户级隔离容器”,每个租户的缓存独立存储,防止线程复用导致的数据泄露。

中间件隔离:MQ为每个租户创建独立队列(如tenant:{tenantId}:queue),消息投递、消费独立,避免串流;数据库按租户架构选型(独立库/共享Schema/共享表),并通过框架层强制注入tenant_id,禁止手动拼接SQL

线程池隔离:回调投递时,某个租Webhook端点响应极慢,拖垮整个回调线程池。

6.5. 沙箱技术(有难度)

开放平台沙箱(Sandbox)技术旨在为开发者提供一个隔离的、安全的测试环境,使其能够在不影响生产数据和服务的前提下,验证 API 调用、业务逻辑和系统集成。其核心实现通常涉及环境隔离、数据模拟、流量控制、权限映射等机制。

搞全套沙箱太贵了,一般直接在线上开几个测试租户就行,反正数据是隔离的。但要是涉及到钱,就得加白名单,走专门的测试逻辑。

7. 可观测性&&监控系统

可观测性通过多维数据分析,帮助运维团队实时洞察系统健康状态,快速定位故障根因,实现从被动响应到主动预防的转变。

在落地实践上,如果条件允许,建议直接采用云厂商成熟的PaaS服务以降低自研与维护成本。以阿里云ARMS(应用实时监控服务)为例,它便是一个典型的全栈可观测平台。

www.aliyun.com/product/arm…

SaaS 环境下,仅依赖 CPU、内存等传统指标已无法满足运维需求。还需要构建租户级可观测性,精准识别高流量与高报错租户。平台需具备秒级故障定位能力,快速锁定问题接口与性能瓶颈,并实现故障的自动恢复

7.1. 指标监控

下面是对指标的分层建设。

层级关注点关键指标示例说明
基础设施层资源水位CPU、内存、磁盘 IO、网络带宽云厂商通常已覆盖,重点在于阈值设定。
中间件层性能瓶颈Redis 命中率、MQ 消费延迟、DB 连接池使用率、慢查询数高频故障源,需重点监控。
业务层 (核心)开放平台特有• 总 QPS & 分接口 QPS • 调用成功率 (按租户/接口) • P50/P95/P99 响应时间 • 限流触发次数 (按租户/接口) • 鉴权失败次数 • Webhook 投递成功率租户维度是关键。不能只看全局,必须支持下钻到“哪个租户错误率最高”。全局正常不代表所有租户正常。

重点关注业务层,在这一层,既要有宏观数据,也要有细节数据。通过分析进一步治理。要闭环。

7.2. 日志系统

关键设计规范

  • 唯一标识串联:所有日志必须携带 requestIdtenant_id场景:开发者报障 -> 提供 requestId -> 工程师秒级定位全链路日志。
  • 敏感数据脱敏:手机号、身份证、Token、密码等严禁明文存储。
  • 集中存储:禁止分散在各服务器,统一接入 Elasticsearch 或云日志服务(SLS),支持全文检索与多维聚合。

7.3. Traces(链路追踪)

  • TraceId 贯穿:网关生成 TraceId,通过 Header 透传至所有下游服务。
  • 租户隔离:Trace 上下文中必须包含 tenant_id,便于在海量数据中过滤特定租户的请求。
  • 全链路视图:一个 TraceId 串联起 网关 -> 鉴权 -> 业务A -> 业务B -> DB 的全过程
  • 慢请求分析:P99 延迟高时,精准定位是哪个服务或 SQL 拖慢了响应。
  • 错误定位:请求返回 500 时,快速定位抛出异常的具体代码行和服务。
  • 依赖分析:识别热点服务和瓶颈节点,指导容量规划

链路追踪优化:采用“采样策略”(正常流量采样率10%,异常流量全量采样),避免日志量过大;通过TraceId关联网关、业务服务、数据库的全链路日志,支持一键检索全链路信息;设置链路异常告警(如链路延迟超过500ms、链路中断),触发告警后,自动关联相关日志,便于快速排查。(错误请求全采,健康请求采样)

整体方案可以看看: 阿里云可观测 ARMS

7.4. 告警

惨痛教训:以前有个惨痛教训:告警太多把屏幕都刷爆了,结果没看见有个刚上线的接口配错了。因为这个,把一个重要客户的关键业务搞挂了,最后挨了一顿投诉。

级别定义响应时效通知方式典型场景
****P0 紧急平台整体不可用或严重受损立即电话 + 短信OOM、服务不可用、短时间错误率极高。(错误占比>5%),特定接口响应一直失败。
****P1 重要核心功能受损或特定租户受影响< 30 分钟IM 消息/邮件核心接口错误率 > 1%、某租户被频繁限流、Webhook 异常
****P2 关注性能下降或潜在风险工作时间处理日报汇总P99 延迟上升、磁盘使用率 > 80%

定义好错误问题,避免告警疲劳无效。

8. 高并发架构设计

开放平台不只是 API 接口的简单聚合,它更是一个需要承载高流量、高并发的系统。如何设计这样一个高并发的架构呢,一些经典的设计讨论必不可少。

高并发就是性能和资源之间的博弈。例如,再大的流量都可以通过硬件资源撑起来,但这是不现实的。硬件资源是昂贵的,因此必须要在性能和硬件资源之间寻求平衡。

因此,我将基于上述四个方向构建高并发架构。这一设计思路具有通用性,不仅限于开放平台,亦可作为各类高并发系统的架构设计准则。

警惕 不要过度设计: 早期流量不大时,没必要追求极致的零拷贝优化,稳定性和可观测性更重要。

8.1. 缓存体系设计

缓存为王,做好缓存设计和限流就能很好的支撑大流量。需要设计多层次的缓存架构。

缓存描述
本地缓存Caffeine/Guava/Java HashMap 等
分布式缓存Redis

注意事项:

  • 缓存过度,导致内存消耗
  • 缓存带来的数据不一致性 (博弈)

在网关平台中,我们将租户关系等小数据量、使用频率最高的数据放入 Redis 等缓存中。网关层不进行数据库操作,从而保持高性能。(即便有DB,也是通过事件驱动主动加载更新)

注意:针对 Redis 缓存要保持专职专用。避免业务所有缓存都放入到一个redis 实例里。

在路由部分,所有的 API 信息,全部使用缓存。

极端情况的考虑

  • 缓存穿透。
  • 缓存击穿
  • 缓存雪崩的应对措施。

布隆过滤器、热点Key、缓存降级策略。缓存所有已有租户、APP、不存在则直接跳过。

8.2. 异步体系设计

网关永远不被慢接口拖垮,QPS 上限拉满。网关中最重要的技术之一。现代高并发开放平台 / API 网关,必然采用异步架构,是高性能流量入口的标配,网关异步解决“连接多、QPS 高、转发快”,耗时操作(日志 / 审计)坚决剥离主链路,全量异步化,是架构防崩、稳吞吐的核心手段。

  • 异步调用 (线程调用)。【网关路由采用异步】
  • 耗时操作(如日志落盘、审计)全部异步。

8.3. 数据库吞吐设计

数据库的核心,是支撑更大数据量、实现更高读写性能,选型至关重要。数据库通常是高并发场景下的最大瓶颈:吞吐能力越强,可承载的并发量就越高。因此,数据模型设计与数据库选型尤为关键。

8.3.1. 分布式数据库(优先选择)

分布式数据库核心优势:

  • 自动分片与负载均衡:分布式数据库能够自动将数据分散到多个节点,并智能地进行负载均衡,简化了运维复杂性。
  • 高可用与容灾:通过多副本、多活架构,即使部分节点故障,也能保证服务的持续可用性,并能快速进行故障切换。
  • 弹性伸缩:计算和存储资源可以独立扩展,按需扩容,灵活应对业务增长

8.3.2. 其他技术关键点(更快)

  • 高效的 SQL 查询,对 SQL 语句进行精细化优化,
  • 高性能磁盘(NVMe SSD)配置以及系统内核级别的参数优化
  • 连接池优化
  • 读写分离、和分库分表。(但会增加复杂度)

8.4. 系统弹性伸缩

开放平台基于Kubernetes容器编排系统构建,通过HPA(水平Pod自动伸缩器)与CA(集群自动伸缩器)的协同工作,实现了从“应用实例”到“基础设施”的全链路弹性。所有核心组件均采用无状态化(Stateless)设计,不依赖任何单机内存状态,确保了服务的横向可扩展性。这使得平台能够从容应对各种突发流量冲击,并在业务低峰期自动回收资源,实现成本与效率的最优平衡。

可以看一下云厂商的容器服务:www.aliyun.com/product/ack

  • HPA(水平Pod自动伸缩器)通过持续的控制循环监测应用负载,并动态调整Pod副本数量。其数据依赖Metrics Server组件,该组件默认每15秒从Kubelet采集CPU和内存等核心指标,并通过metrics.k8s.io API暴露供HPA调用

  • 为确保HPA策略生效,必须在Pod配置中明确设置CPU和内存的Requests(资源请求值),这是计算利用率的基准;同时建议设置合理的Limits(资源限制)以保障集群稳定性。

8.5. 压测是关键

通过高并发压力测试验证系统在面对恶意租户或流量洪峰时的韧性,并根据测试评估数据科学配置资源用量。

9. 高可用架构设计

高可用架构(High Availability Architecture)在开放平台的语境下,不仅仅是“不宕机”,更是SLA(服务等级协议)的承诺。对于接入的第三方开发者而言,开放平台的每一次抖动都可能引发他们业务的连锁反应

高可用架构(High Availability Architecture,简称 HA)是指通过系统设计、冗余部署和故障转移机制,确保系统或服务在发生故障时仍能持续运行,从而最大限度地减少停机时间并保证业务连续性的架构设计。

9.1. 关键要素

  • 利用 Kubernetes 的自愈能力,实现秒级故障检测与切换
  • 依赖高效的 CI/CD 流水线(将部署时间从 30 分钟压缩至分钟级)
  • 数据强一致性,确保故障切换期间数据零丢失、零冲突
  • 弹性扩展能力, 支持动态扩容/缩容以应对流量波动
  • 自动故障检测与切换, 健康检查机制实时监控服务状态,故障节点被自动隔离,流量重定向至健康节点。
  • 多节点部署(如主从、集群模式)

9.2. 优雅关闭与健康检查

  • 在微服务架构中,Pod 的频繁启停是常态。如果处理不当,会导致大量的“502 Bad Gateway”错误,直接影响开发者的调用体验
  • 健康检查的“双保险”存活探针,用于检测应用是否死锁或崩溃,决定是否需要重启容器。就绪探针:用于检测应用是否已加载完配置、连接上数据库。
  • 优雅关闭:当 K8s 删除 Pod 时,会同时发送 SIGTERM 信号并更新 Endpoints。如果应用处理请求的时间超过了 K8s 的宽限期,请求会被强制切断。配置 preStop 钩子。在收到终止信号后,先“休眠”一段时间(如 10-20 秒),等待负载均衡器(如 Ingress/Nginx)同步配置并剔除该 Pod,同时处理完存量请求,最后再执行应用关闭逻辑(关闭 JVM、数据库连接池等)。
  • 防御性编程:响应体大小限制,网关层必须充当“保镖”。如果后端某个 API 因为 Bug 返回了 1GB 的异常堆栈或死循环数据,网关必须在 HTTP 响应头或 Body 达到阈值(如 10MB)时直接截断并报错,防止网关自身 OOM(内存溢出)导致整个平台瘫痪。

9.3. 混沌工程

鉴权中心宕机时,网关是拒绝服务(fail-close)还是放行(fail-open,风险高);定期执行故障演练(如随机Kill Pod、模拟AZ级网络隔离),验证韧性设计。

大型开放平台中十分重要。

架构韧性取决于对异常流程的关注度。不仅要确保系统在理想状态下跑通,更要保证在资源耗尽、网络分区等极端场景下能优雅降级或快速自愈。这才是高可用建设中最艰难且最具价值的部分

它具有挑战,藏在每一个细节中。架构稳不稳,全看团队对“意外”有多上心。

10. 安全&&合规设计

安全防护永远重要。别被打挂才是最重要的。开放平台的威胁来自多个方向。

  • 外部攻击者:DDoS、CC 攻击、SQL 注入、爬取数据、重放攻击。
  • 恶意开发者:越权访问其他租户数据、滥用配额薅羊毛、密钥泄露后持续利用。
  • 内部风险:开发人员误操作导致数据越权、运维越权访问生产数据、SDK 供应链被投毒。

分层防御,每一层都假设上一层已经被突破

10.1. DDOS && WAF

Internet → DDoS清洗 → CDN/边缘节点 → WAF → API Gateway

DDoS 防护必须在网关之前,否则流量打到网关层已经晚了。可以推荐阿里云高防、腾讯云 DDoS 防护

WAF(Web Application Firewall,Web应用防火墙)是一种专门用于保护Web应用程序的安全设备或软件。它通过监控、过滤和阻止恶意流量来保护网站免受各种网络攻击,如SQL注入、跨站脚本(XSS)、跨站请求伪造(CSRF)、DDoS攻击等。推荐 WAF 建议用云厂商托管

例如阿里云 WAF

10.2. 安全设计

  • 坚持防御式编程理念:始终假设所有外部调用均存在潜在风险与不稳定性,对所有输入数据进行严格校验与处理。
  • 避免过度数据暴露:严禁将租户ID、用户ID等敏感标识以明文形式作为接口参数直接传递,防止因参数篡改引发越权访问风险。
  • 严格保护核心凭证:禁止在任何日志(包括应用日志、调试日志、审计日志)中打印AppSecret、Token等敏感凭证的明文信息。
  • 落实敏感数据脱敏:审计日志中涉及的用户隐私、业务敏感字段,必须经过脱敏处理后方可存储,确保数据可追溯的同时不泄露敏感信息。

11. 踩坑经验

11.1. 糟糕的设计

后果避坑方法
忽视 API 版本管理老版本不兼容,大客户投诉必须从第一天起就强制要求接口带有版本号(如 /v1/user/get)。
文档和实现不同步开发者流失,口碑崩塌文档用代码生成,强制绑定发布流程
没有 Sandbox开发者线上试错,灾难级必须有完整隔离的测试环境
限流策略太粗暴直接返回 429,开发者体验差优先队列 + 渐进降级 + 提前告知
安全审查缺失数据泄露,监管处罚每个接入方必须经过安全评审
以为技术做好就行平台没人用技术负责人必须参与运营和开发者沟通

警惕看似合理的过度设计,我们常常认为它是重要的,其他客户不这么认为。

11.2. 缺少必要的客户自助

缺失必要的自助系统将导致过度依赖人工介入。高昂的沟通协调成本不仅会拉低产出效率,更会在应对业务峰值时造成人力过载。长此以往,将严重制约整体效能

11.3. 反模式诊断

  • 如果你的API调用方<5个,且都是内部部门,不要做开放平台,直接用VPN+白名单IP

  • 如果你的盈利模式不是按调用量收费,不要做精细计费系统,直接白名单

  • 如果你的数据不敏感,不要做复杂鉴权,用简单的API Key足

  • 如果客户不多、API不多、直接暴露即可,搞个网关纯属过度工程

12. ROI-架构师要考量的优先级

建立全集大图、搞清楚优先级。基于当前的体量、场景、资源等按照优先级进行周期性建设。企业是营收,先完成再逐步完美。

12.1. 成本控制意识

Redis集群、多级缓存、全链路Trace、多可用区部署,这些都要钱。对于99%的公司,够用的稳定性 + 合理的成本远比理论上的“99.999%”重要。

对于CTO/技术负责人而言,没有ROI的技术方案是不合格的

结合技术成本,建立租户生命周期价值(LTV)模型。对于“高调用量、低付费”的长尾租户,应通过技术手段(如降低SLA、限制并发)引导其升级套餐,或进行清理。

每新增一个复杂模块附带人力运维 + 机器资源 + 安全审计三项成本测算。

12.2. 迭代 && 优先级

文档中的“全景图”虽然完美,但初期应遵循 YAGNI(你不会需要它)原则,优先落地网关、鉴权、监控系统等核心模块,再逐步迭代优化非核心模块,遵循 MVP 策略,避免资源浪费。

例如“元数据驱动”和“共享表模式”在初期虽能快速见效,但要时刻警惕它们的性能拐点,设计不当可能成为后期扩展的大坑。

12.3. 商业模式

平台如何实现盈利,是采用按调用量、按功能模块,还是通过增值服务收费?这些商业考量将直接影响计费系统、配额管理、运营策略等核心设计细节。

可以尽早考虑好商业化模式,企业的目标永远是盈利。

12.4. 技术债

方案最大的隐性成本是复杂性带来的技术债。元数据引擎、多级缓存、灰度体系、各种网关组件,都需要高水平的团队来维护。在方案设计时,保持 KISS 原则。

例如:动态脚本是性能杀手,能用配置和编译解决的,绝不用运行时解释。

开放平台的核心竞争力不是技术多先进,而是生态黏性。技术只需做到 "不拖后腿" ,把资源投入到开发者成功上。架构师的最高境界不是设计复杂系统,而是有能力判断哪些复杂设计不需要做

12.5. 团队协作与职责划分优化

明确团队职责:

  • 技术团队(负责网关、接口上架平台、监控系统等开发、迭代、维护)
  • 运营团队(负责开发者分层运营、工单处理、公告发布、社区管理)
  • 安全团队(负责安全审计、漏洞排查、合规检查)。

建立跨团队协作流程:接口上线前,需经过技术团队(开发、测试)、安全团队(安全审核)、运营团队(文档审核)联合审核,审核通过后方可上线

建立周跨例会,同步平台运行情况、问题排查进度、需求迭代计划。

开放平台失败的第一原因往往不是技术,而是内部业务部门不愿暴露API、API质量差、文档常年不更新、没有激励内部服务接入的机制。文档完全聚焦技术,对如何推动组织协作、建立API治理委员会、设计内部SLA等只字未提。这会让技术负责人以为“我搭好平台自然有人用”,现实中大概率是空转。

12.6. 开放平台的价值

这是需要架构师时刻思考的问题,也随时接受灵魂拷问。

13. 综合案例-云厂商 API 网关(短平快)

如果想实现短平快,并且用户量不算太大,可以考虑:阿里云API网关

阿里云 API 网关,快速构建企业开放平台。覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等API各个生命周期阶段,帮助您快速建设以API为核心的系统架构。

具体使用参考:使用方式。使用云厂商产品可以帮你解决大部分的安全较难的问题。让我们专注内部业务。

这里就不过多介绍,如果感兴趣,这个地方有具体落地经验,可以交流。

14. 最后总结

架构的真谛在于权衡(Trade-off)。开放平台的建设没有标准答案,但有明确边界:

生存优先:先让网关跑通、签名验签正确、租户ID贯穿全链路,再考虑灰度发布、全链路追踪等高级特性。

开发者体验即产品竞争力:文档质量与API稳定性比技术先进性更重要。

安全是底线,不是功能:从第一行代码开始将tenant_id视为一等公民,比事后修补代价更低。

组织协同决定成败:技术架构必须与API治理委员会、内部SLA体系、业务方激励机制同步建设,避免平台"空转"。

拒绝架构"镀金",所有的复杂设计都应基于明确的业务价值和ROI测算

参考资料

本文梳理了开放平台的核心组成模块。需说明的是,实际架构可能因业务需求而有所增减或扩展

其他参考资料

文章链接
飞书开放平台open.feishu.cn/document/ho…
如何设计并搭建开放平台www.woshipm.com/pd/5783453.…
云原生数据库 PolarDBwww.alibabacloud.com/zh/product/…
TiDBdocs.pingcap.com/zh/
应用架构antonioshen.gitbooks.io/openapi/con…
阿里云 API 网关阿里云API网关
百亿规模API网关服务Shepherd的设计与实现mp.weixin.qq.com/s/iITqdIiHi…
集群限流sentinelguard.io/zh-cn/docs/…

本文到此结束,感谢阅读。