Web 应用程序架构:1 个或 n 个 API

2024-03-13

背景:我正在考虑网络应用程序组织。我将前端(浏览器网站)与后端(API)分开:2 个应用程序、2 个存储库、2 个托管。 Front 几乎会调用 API 来完成所有事情。

因此,如果我的 API 有两个独立的域服务(例如:学习上下文和预订上下文),并且它们之间没有直接链接,我是否应该构建 2 个 API(具有 2 个存储库、2 个构建过程等)?这是一个好的实践吗?nAPI 用于n需要还是一个“大”API?我说的是一个具有流量的大量网络应用程序。

(我希望这个问题不会因为没有建设性而被关闭......我认为这是针对具体案例的真正问题,如果没有,抱歉。这个问题 https://stackoverflow.com/questions/7546927/web-app-using-api-for-everything和其他一些关于建筑的事情还没有结束,所以我的还有希望)


这完全取决于您正在处理的应用程序、其业务需求、您的优先级等等。一般来说,您有几种选择:

  • 继续使用单一应用程序
  • 保留一个整体应用程序,但跨单独的模块/捆绑包/库解耦域模型
  • 创建分布式架构(例如面向服务的架构(SOA)或事件驱动架构(EDA))

一个单一应用程序

这是在初始阶段开发应用程序的最简单且最便宜的方法。您不必担心复杂的架构、复杂的部署和开发流程。如果周围没有很多开发人员,它的效果也会更好。

一旦应用程序长大,这个模型就开始出现问题。您无法单独部署模块,应用程序更容易受到反模式、意大利面条式代码/设计的影响(尤其是当很多人在开发它时)。 QA 过程需要越来越多的时间,这可能使其无法在 CI 基础上使用。引入持续集成/交付/部署等方法也要困难得多。

在这种方法中,您的所有 API 都有一个存储库/构建流程,

一个整体应用程序,但解耦域模型

在这种方法中,您仍然拥有一个大平台,但您可以在第三方的基础上连接逻辑上独立的模块。例如,您可以提取一个模块并从中创建一个库。

因此,您可以为不同的库引入单独的流程(QA、开发),但您仍然必须立即部署整个应用程序。它还可以帮助您避免反模式,但可能很难在应用程序生命周期内保持跨库的向后兼容性。

关于您的问题,通过这种方式,只要您将其域逻辑移动到单独的库,您就可以为每种“操作类型”提供单独的 API、开发流程和存储库。

分布式架构(SOA/EDA)

SOA有很多利润。您可以为每个服务引入完全不同的流程:开发、QA、部署。您一次只能部署一项服务。您还可以将不同的技术用于不同的目的。由于涉及较小的项目,质量保证流程变得更加可靠。您可以对服务之间的通信 (API) 进行版本控制,从而使它们更加独立。此外,您还具有更好的水平扩展能力。

另一方面,高层架构的复杂性不断增加。您必须注意更多不同的组件:服务之间的身份验证/授权、安全性、服务发现、分布式事务等。如果您的应用程序是数据驱动的(使用 API 来消费数据的单独前端)并且不需要特定的服务相互沟通 - 它可能没有那么复杂(但这样的假设在我看来是相当危险的,您将需要尽快或信函进行沟通)。

在这种方法中,你有单独的API,每个“操作类型”都有单独的存储库和单独的流程(我理解是单独的域模型/服务)。


正如我在开头所写的,您选择的方式取决于应用程序及其需求。不管怎样,回到你原来的问题,我的建议是尽可能将 API 分开。即使您有一个整体应用程序,您也应该能够单独对 API 进行版本控制并保持其域逻辑分离。分离存储库和/或进程取决于您选择的方法(例如我之前提到的方法)。

如果我没有理解您的观点,请更详细地描述您期望的答案。

Best!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web 应用程序架构:1 个或 n 个 API 的相关文章

  • 使用 PHP 发布到 Blogger

    我在使用 PHP 的 Blogger API 时遇到问题 我需要的是能够将新的博客文章发布到我的博客帐户 我使用的代码取自 Google API 页面 http code google com intl nl apis blogger do
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Jekyll 在子网站上生成静态网站?

    是否可以将 Jekyll 放在 GitHub 上托管的网站的单个部分上 即是否可以让 example github io 成为常规站点 而 example github io blog 由 Jekyll 静态生成 我相信可以通过创建另一个名
  • 用于分享帖子的 Yammers REST API

    我想使用 REST API 从我的业务应用程序共享帖子 不是发布新消息 而是共享现有帖子 有谁知道要使用哪个端点以及如何实现它 当您使用 Yammer API 创建新帖子时 请将参数 shared message id 与要共享的消息的 m
  • useState 由于某种原因没有更新?

    当我尝试使用 axios 从后端 API 获取一些数据 并在由于某种原因获得结果后设置状态时 状态不会更新 当我尝试使用状态时 它只会向我显示一个空数组 但有趣的是当我console log res data 它会毫无问题地向我显示我的列表
  • 如何按城市过滤 WikiVoyage API 结果?

    我目前正在尝试使用 wikivoyage API 我当前的 API 调用如下所示 en wikivoyage org w api php action query list search srwhat text srsearch Pari
  • 使用 Bloomberg .Net API 的每小时数据

    我正在努力解决使用 Net API 3 0 从 Bloomberg 获取每小时开盘价 最高价 最低价和最后价格快照的逻辑 我已经用谷歌搜索了很多次 但没有运气 对此的任何帮助将不胜感激 我试图在 Bloomberg Net API C 中找
  • 如何在S3中存储数据并允许用户使用rails API / iOS客户端以安全的方式访问?

    我是编写 Rails 和 API 的新手 我需要一些有关 S3 存储解决方案的帮助 这是我的问题 我正在为 iOS 应用程序编写一个 API 用户在 iOS 上使用 Facebook API 登录 服务器根据 Facebook 向 iOS
  • 在react.js中调用API渲染数组图片

    我有 API 其中包括 pictures http storage web source images 2016 10 28 edac054f88fd16aee7bc144545fea4b2 jpg http storage web sou
  • HTML if 语句在 CDN 失败时加载本地 JS/CSS

    当从 CDN 或任何外部服务器加载 CSS JS 文件时 有可能 即使概率很低 由于外部故障而丢失该文件 在这种情况下 html 页面将因缺乏适当的 CSS 和 JS 而被损坏 有没有一种实用的方法可以在 CDN 故障时加载本地版本 IF
  • “if”在 ASP.NET MVC View (.aspx) 文件中被认为有害?

    我记得看到一个博客 或其他内容 说你不应该在 ASP NET MVC 的 aspx 文件中使用 但我不记得它说的替代方案是什么 有人记得看过这个并指出我吗 基本上 这意味着您的视图中不应该有大量的 if 语句 您的控制器和视图模型应该能够处
  • asp.NET 2.0网站无法访问App_Code中的类

    将我的网站部署到服务器后 我在访问课程时遇到问题 请注意 这是一个网络Site不是网络应用 错误是 编译器错误消息 CS0246 找不到类型或命名空间名称 Order 是否缺少 using 指令或程序集引用 版本信息 Microsoft N
  • List、IList、IEnumerable、IQueryable、ICollection,哪个返回类型最灵活?

    我之前已经在这里看到过这个问题 但我不满意我理解的完整后果 问题是使用 linq to sql 返回的数据层应该使用什么返回类型以获得最大的灵活性和查询能力 这是我读过 发现的 IEnumerable 是有限的 只允许向前读操作 IEnum
  • 如何将 Live API for Contacts 的响应中的哈希值转换为文本

    我集成了 Live JS api 来获取用户的实时联系人 它以哈希格式 email hash 返回电子邮件 我如何使用 javascript 或 c net 转换为可读文本 非常感谢 我遇到了同样的问题 并且找到了解决方案 您所需要做的就是
  • Trello API - 未经授权的权限请求

    我正在尝试编写一个小脚本来更新卡的当前列表中的时间量 以便我们可以优化吞吐量 我在 jsfiddle 上写了一个小脚本 几乎可以工作 但我得到了一个 请求未经授权的卡许可 当尝试使用时 Trello post cards card id a
  • 微服务、amqp 和服务注册/发现

    我正在研究微服务架构 实际上我想知道一些事情 我非常同意使用 返回 服务发现来在基于 REST 的微服务上发出请求 我需要知道发出请求的服务 或至少是服务器集群的前端 在哪里 因此在这种情况下能够发现 ip port 是有意义的 但我想知道
  • 使用 PRAW 帮助获取 Reddit 帖子链接到的 URL

    我正在尝试使用 Praw 获取 Reddit 提交标题中链接的帖子 例如提交 http www reddit com r AdviceAnimals comments 1adu71 apparently people still need
  • PHP 版本如何匹配“API=yyyymmdd”签名/标签?

    是否有明确且可靠的来源来找出哪个 PHP 发行版本 x y z 携带 使用哪个 API yyyymmdd 签名 标签 PHP 的版本控制存储库是 PHP 版本与其 API 日期版本之间相关性的权威来源 请记住 仅主要版本PHP 的版本 例如
  • Twitter Streaming API 使用的官方编码?是UTF-8吗?

    Twitter 流 API 的官方编码是什么 根据我所看到的 我最好的猜测是 UTF 8 但我想避免做出假设 我见过的 Twitter 网站上唯一暗示他们使用什么作为官方编码的部分是在这里 Twitter 不想因为我们使用 UTF 8 或相
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login

随机推荐