实践笔记 - 微服务架构下RESTful风格api之我为何抛弃了路由参数

devtools/2024/10/19 15:24:41/

在如今关于 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
    • 优点:统一路径结构,减少正则匹配的风险。通过统一的路径模式,降低了后端对请求的复杂处理需求,同时简化了前后端的协作。

关于缓存的担忧

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

总结

抛弃动态路由参数,改为固定路径的设计,可以简化微服务 API 的实现,提高安全性和可维护性,并更好地与其他系统进行对接。在微服务架构下,API 的清晰简洁显得尤为重要,而固定路径的设计理念则提供了一种更加一致和直观的方式来构建 RESTful API。这种设计不仅提高了系统的安全性,还使得 API 的管理和维护变得更加高效。同时,固定路径的结构使得开发者能够更加专注于业务逻辑的实现,而不是在复杂的路径匹配和解析上浪费精力。因此,在考虑到微服务架构的扩展性和可维护性时,固定路径的设计显得尤为合适。通过这种方式,可以实现更加稳定、可扩展且易于维护的 API 体系,为未来的扩展和集成打下坚实的基础。


http://www.ppmy.cn/devtools/127040.html

相关文章

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)

目录 前言阅读前必看 第七章 面向对象技术(下)7.3 设计模式(固定4分)7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory(抽象工厂)7.3.2.2 Builder(生成器)7.3.2.3…

两道算法题- bingo棋盘和水库抽样算法

一、水库抽样算法 给你一个未知长度的单链表,请你设计一个算法,只能遍历一次,随机地返回连表中的一个节点,这里的随机是要求每个节点被返回的概率是1/n。 下面给出一个示例: import randomclass ListNode:def __ini…

Jupyter Notebook汉化(中文版)

原版jupyter notebook是英文的,想要将其改为中文 在jupyter notebook所在环境输入以下命令 pip install jupyterlab-language-pack-zh-CN打开jupyter notebook,在设置语言中将其设置为中文

从opencv-python入门opencv--GUI功能之绘图鼠标与图像界面的交互

从opencv-python入门opencv--GUI功能之绘图和鼠标操作 一、文章介绍二、opencv绘制直线、矩形、圆形1、cv.line()2、cv.circle()3、cv.rectangle()4、在图像上绘制直线、矩形和圆形5、cv.ellipse()(在空白画布上绘制椭圆)(1)img …

[Raspberry Pi]如何在Ubuntu的python venv虛擬環境中,運行YOLOv5 物件辨識功能?

[YOLOv5 I Raspberry pi 4B]Object Detection test with Image and Video by yolov5s. 延續<[Python]如何在Ubuntu中建置python venv虛擬環境&#xff0c;並安裝TensorFlow和OpenCV函式庫?>文章&#xff0c;當建置 TensorFlow (2.10.0) 和 OpenCV (4.9.0) 的 Python 虛擬…

Python 数值计算与数值分析基础

Python 数值计算与数值分析基础 示例演示 当涉及到Python数值计算和数值分析时&#xff0c;下面是20个示例&#xff0c;涵盖了一些常见的用法&#xff1a; 1.数值积分&#xff1a; 在 Python 中&#xff0c;你可以使用 scipy.integrate 模块中的 quad 函数来进行数值积分 …

cartographer在ros和vscode上进行debug

一、概述 因为在对代码进行了解之后&#xff0c;需要运行过程中对代码进行调试&#xff0c;因而需要配置cartographer的Debug配置。 二、具体实现 &#xff08;一&#xff09;版本 使用Ubuntu20.04&#xff0c;vscode&#xff0c;ros-noetic&#xff0c;cartographer &#…

第21~22周Java主流框架入门-Spring 3.SpringJDBC事务管理

Spring JDBC模块与事务管理课程总结 1. 课程介绍 本课程主要讲解Spring框架中的JDBC模块及其事务管理的相关内容&#xff0c;重点包括以下三个方面&#xff1a; Spring JDBC模块及核心对象JDBC Template的使用 通过学习如何使用Spring JDBC模块&#xff0c;了解JDBC Template…