如何设计 API?

在前后端分离的设计中,不管使用什么语言,后端都需要提供 WebAPI 给前端使用。如果是一个平台级的产品,还有可能需要将平台的公共 API 提供给第三方系统使用,这些都要考虑到 API 的设计。

本文聊下 API 设计可能遇到的问题以及处理方式。

问题

1、客户端种类比较多,不容易实现差异化。

以我们现在正在做的低代码平台来说,存在的客户端有下面这些:

  • Web 端应用程序

  • 移动端的应用程序

  • 第三方开发人员编写的应用程序

  • 自定义组件(符合规范的 Vue 前端组件,可以无缝和平台进行整合)

  • 平台配置的脚本(直接配置在平台中,可以调用接口、处理界面元素)

不同的客户端在调用接口时,输入输出会存在差异,比如:移动端的数据列表功能和结构上比 PC 端要简单很多,如果调用统一的接口,会造成浪费。

2、客户端直接对 API 进行调用。

  • API 如果拆分的比较细,一次操作会发出多个请求才能拿到想要的数据,效率比较低

  • 当需要多个请求时,还需要在客户端进行逻辑的组合,这样每个客户端可能都有一套自己的逻辑,不容易维护

  • 服务如果进行拆分和合并,客户端代码需要同步进行修改

  • 如果 API 进行了修改,第三方调用方需要配合修改,但这中间的沟通成本会很高,有时甚至不可行

要解决这些问题,就应该单独提供一个独立的公共 API,而不是直接让第三方开发人员或其他客户端直接访问平台公开的 API ,涉及到独立的公共 API,API 网关就要出场了。

API  网关

API 网关是一种服务,是外部进入到应用程序内部的入口点。负责请求路由、身份验证、限流、熔断、流量监控等各种功能。

路由请求

路由请求是 API 网关的核心功能,当网关收到请求时,会去查询路由映射关系,将请求指定到相应的服务。跟 Nginx 的反向代理有点类似。

路由的配置可以是静态的,也可以是动态的,比如在 Ocelot 中,可以在 json 文件中进行路由映射的配置,也可以使用代码的方式按照需求进行动态路由修改。

组合多个服务

在使用我们平台搭建的业务系统中,打开数据列表的详情,会做下面几件事情:

  • 获取按钮配置

  • 获取表单模型

  • 获取表单字段权限(根据不同的人员,获取的是不同流程节点的权限)

  • 获取表单数据

在 API 网关中可以对客户端提供统一入口调用,将这些来自不同服务的接口进行整合,统一输出,因为网关和服务都在内网,传输速度比较快,和客户端需要同时获取多个 API 请求相比,提升了效率。

图片

image-20231016161047257

专属 API

作为一个平台,对外提供的公共 API 颗粒度往往不会很细,否则就不具备通用性了。如果针对不同的移动端(安卓、iOS)、或者特定的第三方平台,有一些细节上的区别。

网关可以为不同类型的客户端提供独立的 API。

一些扩展能力

  • 身份认证

  • 访问授权

  • 限流

  • 熔断

  • 缓存

  • 指标收集

  • 日志记录

这些扩展能力并非只有在 API 网关中才能实现,在后端服务中一样可以。但有些能力放到 API 网关中会更合适。

例如:身份认证、限流、熔断等,就是在请求还为触及服务时就已经处理了,会更加安全,也会让后端服务更稳固。

网关的选择

在 .NET Core 中可以选择的开源网关产品有:Ocelot、Kong、Envoy 等。

Ocelot:是一个基于.NET Core的轻量级 API 网关,用于构建和管理微服务架构中的 API 网关。作为一个开源项目,Ocelot 提供了一种灵活、可扩展的方式来集中处理请求路由、认证授权、请求转发、负载均衡和缓存等功能。

Kong:是在 Nginx 中运行的 Lua 程序。得益于 Nginx 的性能优势,Kong 相比于其它的开源 API 网关来说,性能方面是最好的。由于大中型公司对于 Nginx 运维能力都比较强,所以选择 Kong 作为 API 网关,无论是在性能还是在运维的把控力上,都是比较好的选择。

Envoy:是一个开源的高性能代理和通信中间件,专为云原生应用程序设计。它由 Lyft 开发并于 2017年成为 Cloud Native Computing Foundation(CNCF)的毕业项目之一。虽然 Envoy 本身是用 C++ 编写的,但它可以与任何语言和框架进行集成,包括 .NET Core。

网关的选择需要能解决当前面临的问题。关于各种网关的使用方式,以及优缺点的对比,后面再进行详细介绍。

最后

不管是 API 的设计还是代码架构的设计,原则其实都差不多,要能够松耦合、易扩展、在满足现有需求的基础上,再多往前想一步,避免过度设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/164236.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】利用VR开展建筑塔吊安全操作学习的好处?

随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为人们的生活带来了前所未有的便利。在工程教育领域,VR建筑塔吊安全操作学习作为一种新型的教学手段,正逐渐成为提高教学质量和培养高素质工程…

【自动化测试入门】用Airtest - Selenium对Firefox进行自动化测试(0基础也能学会)

1. 前言 本文将详细介绍如何使用AirtestIDE驱动Firefox测试,以及脱离AirtestIDE怎么驱动Firefox(VScode为例)。看完本文零基础小白也能学会Firefox浏览器自动化测试!!! 2. 如何使用AirtestIDE驱动Firefox…

hive一行多列合并为一行一列

SELECT named_struct(name, John, age, 30, city, New York) AS person;

R语言:因子分析 factor analysis

文章目录 因子分析数据集处理步骤主成分法做因子分析最大似然法做因子分析 因子分析 因子分析的用途与主成分分析类似,它也是一种降维方法。由于因子往往比主成分更易得到解释,故因子分析比主成分分析更容易成功,从而有更广泛的应用。 从方法…

创建QDialog工程

创建QDialog工程 换掉图标 添加一个组件 水平布局 所有原件横向布局完成后,选中外框,点击Dialog,进行纵向布局 调整文本字体的大小 清空按钮的槽函数 下划线的槽函数 斜体的槽函数 加粗的槽函数 或者使用快剪辑:…

广告牌安全传感器怎么用?为城市能起到什么效果?

随着城市的迅速发展和经济的快速增长,广告牌在城市中扮演着越来越重要的角色。但是近年来广告牌缺乏修缮和维护,广告牌所带来的安全隐患逐年增加。 广告牌作为城市的明信片,出现损坏,且具有一定的安全隐患之后,给城市带…

家装、家居两不误,VR全景打造沉浸式家装体验

当下,用户对生活品质要求日益提升,越来越多的用户对多功能家装用品需求较大,由此造就了VR全景家装开始盛行。VR全景家装打破传统二维空间模式,通过视觉、交互等功能让用户更加真实、直观的体验和感受家居布置的效果。 一般来说&am…

图详解第五篇:单源最短路径--Bellman-Ford算法

文章目录 单源最短路径--Bellman-Ford算法1. 算法思想2. 图解3. 代码实现4. 测试5. 优化循环的提前跳出队列优化 6. 负权回路(负权环)判定7. 源码 Dijkstra算法只能用来解决正权图的单源最短路径问题,但有些题目会出现负权图。这时这个算法就…

服务器中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

最近一段时间内,相信很多使用金蝶或用友的办公软件的企业,有很多都经历了locked勒索病毒的攻击,导致企业服务器被加密无法正常使用,严重影响了企业的正常工作。通过云天数据恢复中心的解密恢复发现,在今年locked勒索病…

页面查询多项数据组合的线程池设计 | 京东云技术团队

背景 我们应对并发场景时一般会采用下面方式去预估线程池的线程数量,比如QPS需求是1000,平均每个任务需要执行的时间是t秒,那么我们需要的线程数是t * 1000。 但是在一些情况下,这个t是不好估算的,即便是估算出来了&…

解决 sharp: Installation error: unable to verify the first certificate

使用 plasmo 时报错如下: E:\chromeplugins>pnpm create plasmo ../.pnpm-store/v3/tmp/dlx-46852 | 2 ../.pnpm-store/v3/tmp/dlx-46852 | Progress: resolved 2, reused 2, downloaded 0, added 2, done 🟣 Plasmo v0.83.0 &…

华为---企业WLAN组网基本配置示例---AC+AP组网

ACAP组网所需的物理条件 1、无线AP---收发无线信号; 2、无线控制器(AC)---用来控制管理多个AP; 3、PoE交换机---能给AP实现网络连接和供电的交换机; 4、授权:默认AC管理的AP数量有限,买授权才能管控更多AP。 WLAN创建…

苹果开发者 Xcode发布TestFlight全流程

打包前注意事项 使用Xcode导出安装包之前,必须先确认账户的所有合约是否全部同意,如果有不同意的,在出包的时候会弹出报错 这是什么意思 这意味着您有一些需要在应用商店连接上验证的协议(protocol)/契约(Contract)。解决方案 连接到应用商店…

百度的新想象力在哪?

理解中国大模型,百度是一个窗口。这个窗口的特殊性不仅在于变化本身,而是在于百度本身就是那个窗口。 作者|皮爷 出品|产业家 沿着首钢园北区向西北步行10分钟,就能看到一个高约90米的大跳台,在工业园钢铁痕迹的印衬下&#…

Vue-vue项目Element-UI 表单组件内容要求判断

整体添加判断 <el-formref"ruleFormRef":model"formModel"class"demo-ruleForm"label-position"top"status-icon:rules"rules"><el-form-item label"姓名" prop"applyUsers" class"form-…

[云原生1.]Docker数据管理与Cgroups资源控制管理

文章目录 1. Docker的数据管理1.1 数据卷1.1.1 示例 1.2 数据卷容器 2. 容器互联3. Cgroups资源控制管理3.1 简介3.2 cgroups的主要功能3.3 cpu时间片的简单介绍3.4 对CPU使用的限制3.4.1 对CPU使用的限制&#xff08;基于单个容器&#xff09;3.4.2 对CPU使用的限制&#xff0…

vue3中computed的用法

一、完整代码 <template><div class"about"><h1>Computed的用法</h1><h3>姓:{{ person.firstName }}</h3><input type"text" v-model"person.firstName"><h3>名:{{ person.lastName }}</h3…

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台

板卡概述 PXIE301-211A是一款基于PXIE总线架构的16路高速LVDS、4路低速LVDS采集、2路隔离RS422数据处理平台&#xff0c;该平台板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡…

【UE】纯蓝图实现:在游戏运行时设置关键点,然后让actor沿着关键点移动

前言 在上一篇博客(【UE】两步实现“从UI中拖出Actor放置到场景中”)中我们已经实现了如何从UI拖拽生成Actor ,本篇博客在此基础上要实现的是:从UI中拖出车,再从UI中拖出关键点,点击“开始移动”按钮后,车会沿着关键点移动,具体效果如下所示。 效果 步骤 1. 首先创建…

Flink学习之旅:(三)Flink源算子(数据源)

1.Flink数据源 Flink可以从各种数据源获取数据&#xff0c;然后构建DataStream 进行处理转换。source就是整个数据处理程序的输入端。 数据集合数据文件Socket数据kafka数据自定义Source 2.案例 2.1.从集合中获取数据 创建 FlinkSource_List 类&#xff0c;再创建个 Student 类…