接受的答案不正确。尽管 John 使用 CRUD 作为反模式示例,但使用 CRUD 对 SOA 来说还不错。正如 John 所描述的,这就是 SOA 的问题:它鼓励增加服务级别的复杂性,最终导致对多个用例的支持减少。我们构建 API 的主要原因之一是提供对多个应用程序的访问,这是构建 API 的主要投资回报率。
例如,假设我们有一个博客 API。假设我们让用户能够在我们的外部应用程序的一个屏幕上写帖子、添加图像和放置 cmets。在 John 的 SOA 愿景中,他可能会建议我们构建我们的 API 以使用一个调用来完成所有这些事情,这样就不会那么啰嗦了……所以:
{
"post_title": "New Post",
"post_content": "Some Stuff....",
"comments": [{
"comment": "This is right on!",
"userId": 101
}, {
"comment": "I agree.",
"userId": 105
}],
"images": [{
"imgURL": "http://some.img.com/1"
}, {
"imgURL": "http://some.img.com/2"
}]
}
现在显然需要在这里分别存储三种不同的数据对象:post、cmets 和 images。从数据存储的角度来看,帖子进入 POSTS 表,cmets 进入 COMMENTS 表,图像进入 IMAGES 表。因此,如果我们按照 John 描述的 SOA 的租户构建我们的服务,我们将使用我们的对象进行一次调用,然后它会尝试创建帖子的服务,例如,它工作得很好,然后它会尝试创建cmets 可以正常工作,但是当我们获取图像时,服务会意识到其中一个图像 URL 有错误是失败的。所以我们的服务返回失败?即使其他 3 个部分现在已成功存储在我们的数据存储中?我们是否返回并撤消所有成功执行的部分?如果数据存储已经提交了更改,而我们无法回滚呢?
再加上这样一个事实,如果我们让它“更健谈”并单独提交它们,我们现在可以在其他应用程序中重复使用这些服务,而无需重新编写服务的任何部分。
整合服务的坏处在于,您被出售的想法是服务永远不会失败……这很荒谬。总会有一个边缘情况,有些事情会失败,通过将所有东西整合到一个服务中,你增加了复杂性,实际上增加了失败的能力。
我会将这个版本的 SOA 与我们在面向对象编程中构建上帝对象时已经意识到的缺点进行比较。 https://en.wikipedia.org/wiki/God_object
我们比这更清楚,所以我们为什么要重新散列它?就像上帝对象一样,合并或上帝服务是一个坏主意。我说构建你的服务是为了做一件事,并为尽可能多的用例做好它,你的服务会很好。