微服务架构下RESTful风格api实践中,我为何抛弃了路由参数 - 用简单设计来提速

简介: 本文探讨了 RESTful API 设计中的两种路径方案:动态路径和固定路径。动态路径通过路径参数实现资源的 CRUD 操作,而固定路径则通过查询参数和不同的 HTTP 方法实现相同功能。固定路径设计提高了安全性、路由匹配速度和 API 的可维护性,但也可能增加 URL 长度并降低表达灵活性。通过对比测试,固定路径在性能上表现更优,适合微服务架构下的 API 设计。

在如今关于 RESTful API 的实践中,许多设计示例经常遵循类似以下的动态路径方案:

方案一:动态路径

方法 路径 描述
GET /zoos 列出所有的动物园
POST /zoos 新增一个新的动物园
GET /zoos/{zoo} 获取指定动物园详情
PUT /zoos/{zoo} 更新指定动物园
DELETE /zoos/{zoo} 删除指定动物园
GET /zoos/{zoo}/animals 检索指定动物园下的动物列表
GET /animals 列出所有动物

这种设计已经成为许多 RESTful 服务器的主流。然而,仔细研究 RESTful 的核心思想会发现,它并没有强制要求这样的设计,仅仅是建议将服务资源化,并结合 HTTP 方法(而不是仅仅使用 POST)来实现 API 的统一化。比如对于动物园的 API,如果按照以前的设计可能会有 getZooListupdateZoodeleteZoo 等函数,而资源化之后,主路径只有一个 /zoos,利用不同的 HTTP 方法实现 CRUD 操作。

那么这么做的目的是什么呢?

主要目的是利用 HTTP 的语义来简化和统一 API 的设计。然而,动态路径参数的使用却在无形中增加了路由的复杂度,并没有充分利用单个端点的功能。

如果去掉路由参数,上述 API 可以转化为:

方案二:固定路径

方法 路径 描述
GET /zoos 获取动物园索引(批量查询)
GET /zoo?zoo=123&zoo=111 查询指定动物园的信息
POST /zoo 新增一个动物园
PUT /zoo 更新一个动物园(信息在请求体中)
DELETE /zoo 删除某个动物园
GET /zoo/animals?zoo=123 查询某个动物园的动物列表(批量)
GET /animals 列出所有动物

这种改动的优点是什么?

  1. 安全性提高:动态路由参数需要使用正则匹配路径,容易受到正则匹配攻击——利用特殊参数让正则陷入死循环或耗费大量资源。而固定路径只需简单的路径到处理函数的映射,可以有效避免这类问题。

  2. 路由匹配加速:不使用路由参数时路由匹配速度会提升 50%。这种改动降低了路由匹配的复杂度,使请求的解析速度更快,在高并发情况下能够显著提高系统的性能和用户体验。

  3. API 包装和复用:可以更充分地利用固定路径的不同 HTTP 方法。前端不需要拼接复杂的路径,查询参数可以统一封装成 API 工具套件,简化增删改查的调用逻辑。

  4. ID 安全性:路径中的 ID 信息直接暴露存在安全隐患,尤其是用户 ID 等敏感信息。如果将这些信息全部放在请求体中,并通过 HTTPS 传输,至少不会直接暴露在 URL 中。

  5. 与 RPC 的对接更方便:这种设计模式可以更方便地与 RPC(如 WebSocket)等端点对接。固定路径使得 API 的调用方式更加稳定,与长连接的接口集成也更加简便。

  6. 减少错误可能性:去掉路径参数减少了一个出错的维度,降低了 API 设计的复杂性,减少了开发人员在路径匹配和参数处理方面的工作量。

  7. 统一的日志与监控:在固定路径下,所有相同类型的请求路径一致,更便于日志的查询与监控规则的统一配置。统一的路径格式可以更方便地对同类型请求进行聚合统计和异常检测。

  8. 简化权限控制:由于路径固定,权限控制逻辑可以更加简单和集中,减少了基于不同路径的复杂权限校验。统一的路径形式使得权限策略更加清晰和可维护,尤其在涉及到多个服务之间的协作时,权限控制可以统一而不混乱。

  9. 减少文档复杂度:固定路径的设计可以减少 API 文档的复杂度。每个路径的用途更加明确,开发人员可以更快地理解 API 的使用方式,减少了对 API 文档的误解和困惑,从而提高开发效率。

这种改动的缺点是什么?

  1. URL 变长:固定路径可能会增加 URL 的长度,但如果因此超过了限制,可能需要重新审视设计,明确查询参数的含义。例如,将令牌等敏感信息放在查询参数中显然是错误的做法。长路径可能会对某些设备或浏览器产生影响,但可以通过合理设计参数结构来缓解这个问题。

  2. 表达灵活性降低:动态路径有助于直接体现资源之间的层次关系,而固定路径有时会使 URL 看起来不够直观,不便于人类阅读。尤其在涉及到复杂资源关系时,动态路径可以更直观地展示资源的从属和层级关系,而固定路径可能显得过于扁平。

  3. 对部分开发者习惯的改变:许多开发者习惯了动态路径的 RESTful 风格,固定路径可能需要开发团队对现有思维方式进行调整。一些工具和框架也对动态路径有较好支持,这种改变可能需要重新配置和调整工具链。

具体例子对比

  • 动态路径方案

    • 获取某个动物园下的动物:GET /zoos/123/animals
    • 优点:路径层次清晰,表达资源关系。开发人员可以很容易理解资源之间的关系,尤其在浏览器中查看时更加直观。
  • 固定路径方案

    • 获取某个动物园下的动物:GET /zoo/animals?zoo=123
    • 优点:统一路径结构,减少正则匹配的风险。通过统一的路径模式,降低了后端对请求的复杂处理需求,同时简化了前后端的协作。

关于缓存的担忧

浏览器端缓存通常是基于完整路径匹配,因此对这种改动几乎没有影响。对于其他资源的缓存,可以根据需要进行相应设置。例如,可以根据请求的参数配置缓存策略,避免缓存冲突。对于固定路径的请求,缓存策略也可以更加稳定和一致,因为路径形式不会频繁变化,这使得缓存管理变得更加可预测和可靠。

简单的benchmark测试

通过一个路由表+Nodejs的http库实现了一个简单的restful框架

  private routes: Map<string, {
    [method: string]: RequestHandler }>;
  private server: http.Server | null = null;
  register(path: string, method: string, handler: RequestHandler): void
  listen(port: number):void
  private async handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>

并与express进行了对比,可以看到速度提升不少,而且传输的数据也少很多
SimpleAPI Results:
Requests/sec: 2827.9
Latency: 375.42 ms
Throughput: 455116.8 bytes/sec

Express Results:
Requests/sec: 2365.34
Latency: 471.91 ms
Throughput: 565120 bytes/sec

总结

抛弃动态路由参数,改为固定路径的设计,可以简化微服务 API 的实现,提高安全性和可维护性,并更好地与其他系统进行对接。在微服务架构下,API 的清晰简洁显得尤为重要,而固定路径的设计理念则提供了一种更加一致和直观的方式来构建 RESTful API。这种设计不仅提高了系统的安全性,还使得 API 的管理和维护变得更加高效。

另外如果和fastify的预定义jsonschema加速json数据解析,速度能够更快吧,非常适合serverless场景应用。

相关文章
|
8月前
|
数据采集 监控 API
移动端性能监控探索:iOS RUM SDK 技术架构与实践
阿里云 RUM SDK 作为一款性能体验监控采集工具,可以作为辅助 App 运维的强有力助手,提升您的问题排查效率。
451 70
|
8月前
|
存储 SQL 消息中间件
从 ClickHouse 到 StarRocks 存算分离: 携程 UBT 架构升级实践
查询性能实现从秒级到毫秒级的跨越式提升
|
8月前
|
存储 运维 分布式计算
零售数据湖的进化之路:滔搏从Lambda架构到阿里云Flink+Paimon统一架构的实战实践
在数字化浪潮席卷全球的今天,传统零售企业面临着前所未有的技术挑战和转型压力。本文整理自 Flink Forward Asia 2025 城市巡回上海站,滔搏技术负责人分享了滔搏从传统 Lambda 架构向阿里云实时计算 Flink 版+Paimon 统一架构转型的完整实战历程。这不仅是一次技术架构的重大升级,更是中国零售企业拥抱实时数据湖仓一体化的典型案例。
584 0
|
8月前
|
API 微服务
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态。
864 72
|
8月前
|
存储 监控 安全
132_API部署:FastAPI与现代安全架构深度解析与LLM服务化最佳实践
在大语言模型(LLM)部署的最后一公里,API接口的设计与安全性直接决定了模型服务的可用性、稳定性与用户信任度。随着2025年LLM应用的爆炸式增长,如何构建高性能、高安全性的REST API成为开发者面临的核心挑战。FastAPI作为Python生态中最受青睐的Web框架之一,凭借其卓越的性能、强大的类型安全支持和完善的文档生成能力,已成为LLM服务化部署的首选方案。
1300 3
|
9月前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2025 年 9 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
614 142
|
9月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
边缘计算 Kubernetes 物联网
Kubernetes 赋能边缘计算:架构解析、挑战突破与实践方案
在物联网和工业互联网快速发展的背景下,边缘计算凭借就近处理数据的优势,成为解决云计算延迟高、带宽成本高的关键技术。而 Kubernetes 凭借统一管理、容器化适配和强大生态扩展性,正逐步成为边缘计算的核心编排平台。本文系统解析 Kubernetes 适配边缘环境的架构分层、核心挑战与新兴解决方案,为企业落地边缘项目提供实践参考。
782 0
|
9月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的&quot;神经网络&quot;,强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
API 微服务
224 0

热门文章

最新文章