Web 服务和 API:“鸡或蛋”

Posted

技术标签:

【中文标题】Web 服务和 API:“鸡或蛋”【英文标题】:Web service and API: "chicken or egg" 【发布时间】:2013-10-20 15:45:24 【问题描述】:

我们即将开发一个网络服务,它将具有一些“社交”功能。 我们需要为移动设备(至少 ios/android)创建(响应式)网站和应用程序。

我已经开发了具有 API 的网络服务(用于应用访问;通常不公开)。但是,这一次我正在考虑采用一种不同的、还原的方法,我想对此提出一些意见。

我没有开发网站,然后在其上添加 API 以让应用程序与服务进行通信,而是考虑从 API 开始,然后在其上构建所有内容(包括网站)。然后,将有一个与数据库通信的服务(php 或 Node.js 应用程序),并且网站(在服务器端,而不是客户端)和应用程序都将与该服务器通信。

这种方法的优点:

    数据和视图完全分离。该网站将在与 API 后端不同的独立服务器上运行。 可能更具可扩展性

但是,我也知道这种方法需要在网站和数据库之间创建一个额外的层,这可能会对性能产生负面影响。

你怎么看?您是否有过这种设计或案例研究的经验?

【问题讨论】:

【参考方案1】:

这是一种非常合适的方法,并且已被包括我在内的许多公司成功使用。

我们倾向于从允许访问 javascript/html 网络应用程序的 API 套件开始。我们主要使用 AngularJS 来创建 Web 应用程序。

作为一个额外的层(您已经确定),我们有时还会创建更传统的服务器端应用程序作为 Web 服务的客户端。这通常感觉比仅仅创建具有不同(但相似)子系统(例如数据访问、身份验证)的单独应用程序要多得多的工作。但是,一旦您构建了这些层和“主要”应用程序,您就可以免费获得 Web 服务!您可以发布带有一些文档的 API 套件供集成合作伙伴使用,并且您可以在与 Web 应用程序相同的后端构建移动应用程序。

我们发现的主要好处是,随着项目的成熟,测试和维护的工作量减少了,同时保留了异构的连接客户。

祝你好运

【讨论】:

【参考方案2】:

我认为这是完全合理的。任何性能问题都可以通过使用良好的单页 Web 应用程序框架(如 Ember、Angular 等)和/或使用类似 Bacon 的一些函数式反应式编程来缓解。

基本上,尽可能使 Web 组件异步。当您了解这一点时,我认为代码重用和可伸缩性将非常有利于您。

【讨论】:

【参考方案3】:

对于一个严肃的应用程序,您应该始终拥有某种 “服务” 层和/或 “消息总线” 层,但这并不不等于强>“API”。恕我直言,API 是公开的,很少更改,任何新网站都不会如此。此外,您的网站可能会有与您的移动应用不同的要求。

但是您的想法的精神是正确的,您应该争取分离,只是要意识到您需要做到这一点,以便您可以快速做出改变。因此(我不能强调)这一点就足够了:面向服务的架构不需要物理分离。您可以只分离您的代码并遵循SOA 的黄金法则:状态和行为分离(即无状态,您有服务对象和数据对象,没有OOP)。我经常看到需要做出如此大改变的项目,因为一开始就有太多的物理分离(即过度设计)。

你还应该知道什么时候你想做基于RPC的(REST、请求/响应和同步)和基于事件消息的(MQ、发布/订阅和异步) .大多数 Web 应用程序更喜欢 RPC,但移动和 HTML5 应用程序允许异步消息(websockets 或本机)。

【讨论】:

【参考方案4】:

这种方法听起来很有吸引力,但根据我的经验,它在未来可能会受到限制。一旦你(希望)拥有一个使用 API 的良好应用程序社区,就很难改变它。另一方面,您希望保留快速迭代网站的能力,而不必担心破坏第 3 方应用程序。

我觉得从长远来看,您最好拥有一个手工制作的 API 来支持您的 3rd 方开发人员想要的东西,以及一个单独的手工制作的 UI 或 API 来准确提供您网站的用户想要的东西。这些是不同的用户群体,很可能有不同的要求。

例如,您的应用程序可能需要一个能够执行类似 SQL 的查询(例如 OData)并显示实体的大量详细信息的丰富 API。您的第 3 方可能更喜欢更简单的 API,它只允许使用您实体的一小部分属性进行批量请求/更新 - 例如同步用例。

尝试创建一个既支持您的应用程序又支持第 3 方应用程序的 API 可能会让您无法满足。

注意:我并不反对 API 的用户提供分离等。我说的是为您的应用和第 3 方应用使用通用 API。

【讨论】:

我的错:我没有解释 API 将仅供私人使用(至少我们不打算在可预见的将来向第三方开发者开放)。只有我们的应用程序才有 API 密钥。 Ok :o) 事实上,这一点在某种程度上仍然成立。对于移动应用程序,由于电池寿命、数据成本和手机外形尺寸不足,人们通常需要更少的数据(例如更少的属性)。使用与移动设备相同的 API 为大型、高带宽客户端提供服务可能很困难。我会留下我的答案,以防将来与某人有关;o) 另外,@Adam Gents 对服务器推送协议(如 Web 套接字/服务器发送事件)的评论对于移动设备来说是一个不错的选择,这意味着您可能仍需要针对移动设备使用不同的 API。 @Qualcuno Mike 是对的。您将需要根据不同的需求、用户和安全性进行大量转换。制作一个所有东西都会使用的美化 API 是相当困难的。现实是(根据我的经验)无论您的领域驱动设计(即面向对象的程序,即活动记录)还是 SOA,您都需要大量传输对象。关键是不要回到所有代码都在“页面”中的老式 PHP。 @AdamGent 内容非常简单(与每个对象相关的信息非常少),几乎可以肯定,API 将在整个生命周期内保持私有。此外,即使是网站也是以移动为中心的(它是响应式的)

以上是关于Web 服务和 API:“鸡或蛋”的主要内容,如果未能解决你的问题,请参考以下文章

Web API 和 Web 服务有啥区别?

RESTful API 与 Web 服务 API

Web服务器和API接口服务器心跳检查

使用Node.js原生API写一个web服务器

以太坊 Web API 和以太坊 API 即服务之间的区别

Rest API 和 Restful Web 服务之间的区别