何时使用面向服务的架构(SOA)?

16

最近我和我们的一位架构师进行了一次交谈,他总结了自己对SOA的应用:“只有在需要异步操作时我们才会使用服务,否则我们直接访问数据存储。”

我思考了这个陈述,它似乎相当合理,因为服务在发布-订阅模型中工作得很好,但我想知道在什么其他情况下你应该考虑使用SOA?

10个回答

24
我们向客户公开服务,因为他们不应该直接连接到数据源。
我们向自己公开服务,因为使用WCF将它们分散到不同的技术上更容易。
我们公开服务是因为对于相同的数据源,我们有不同的用户界面。当我们使用服务时,可以节省三分之一的工作量。
这并不仅仅是因为异步操作。

在同一数据源具有不同用户界面的情况下,你是否可以发布一个DLL供所有UI组件使用? - lomaxx
2
当然有可能出现这种情况。我们大多数都有Web-UI和桌面UI,这些都无法使用DLL。 - albertjan
5
如果您的Web UI环境非常异构化,包括Java、.Net、PHP、RoR等,则发送DLL文件并不是很有帮助。使用服务来克服这种异构环境也是SOA的常见用法。 - Colin Desmond
很多人将Web端点与SOA服务混淆,它们并不是同一个东西。而且,你为使用服务描述的原因缺少了一些重要的要点。但是再说一遍,你可能只是使用了一些WCF端点,而不是SOA服务。 - MeTitus

9

另一个使用服务的情况是当您想要集成异构技术堆栈时。

换句话说,如果您的数据库是postgres,但您的代码是Java、Perl、Python和C++,您可以编写存储过程,并让每种编程语言调用这些存储过程。如果您正在使用没有存储过程的数据库,或者您想要切换这些功能,或者您只想在端口80上运行,您可以将SQL调用包装在面向服务的层中(思考websphere),现在任何人都可以调用它 - 此外,您还可以将身份验证和授权逻辑(连接到LDAP等)放在SOA层中。

您还可以使用该SOA层来构建逻辑例程,以便对那个管理发票或为客户创建报表的旧COBOL框进行“操作”。

因此,如果您有多个遗留系统要互连-例如将销售系统与仓储系统连接到订单预测系统-SOA可能是实现该目标的一种方式。(您还可以使用“服务总线”创建事件驱动系统作为更好的编排变更的方式。)

只是我在说话。


你能向我解释一下服务总线与面向服务架构(SOA)的关系吗?我正在尝试理解这两者之间的关系。谢谢。 - DoodleKana

6

有许多场景可以从使用服务中受益,其中一些场景已被行业大师(如SOA的Thomas Erl)所规范。

SOAPatterns

我认为你应该寻找以下内容:

  • 遗留应用程序重用
  • 业务流程重用(同一流程的多个用例)
  • 实现抽象(平台、语言、持久性抽象)

你的同事对谨慎持保留态度是正确的。采用Web服务会引入许多部署和支持变量。


3

另一个场景可能是集成场景,您希望许多单独的组件或系统彼此通信。


1
我同意。如果您需要让各种不同的系统相互通信,尤其是在公司内部解决集成问题,我会寻求SOA的帮助。 - Daryl

2
另外还有一种相关思想流派被称为SOAD(面向服务的应用程序设计),其中系统的每个组件都是一个服务。这是为了利用它们所建立的环境(EJB,WCF)提供的优势,即您可以获得大量免费的管道。

关于此的更多资源,请参见:

构建SOA

SOA设计模式

实现SOA的完整性

实现SOA中的灵活性/可维护性

2

SOA可以作为一种隐藏子系统实现细节的方式。例如,如果您的客户需要产品信息,将产品数据库或库存子系统封装成通用服务,并仅公开客户所需的功能和数据子集可能是一个好主意。然后,如果您需要替换或升级该子系统,您将能够对用户和客户面向软件界面进行透明更改。


3
换句话说,将其用于解耦集成与实现。 - Martin Spamer

2
SOA的关键在于,电信公司(我个人认为)正在把它当作救命稻草。SOA使得你能够将传统的技术与根深蒂固的技术结合起来,并将它们呈现为一个一致、可控的API,让你的业务用户开发新的、以前未曾想到的想法,而无需重新设计公司中的所有内容。
通过拥有一个统一的语言(WSDL)作为接口,你可以为互操作性准备好你的技术孤岛。通过现在实施SOA,而不是直接连接数据源,你自动使你的数据源可供尚未考虑过的各方和业务需求使用。
WSDL最终成为了可用的Corba。

2
WSDL和SOAP通常遇到与CORBA和DCOM相同的问题:合同版本控制是一场噩梦。在您完全控制所有客户端和服务器的退化情况下,这不是很大的问题,但当您开始联邦系统时,问题就变得棘手了,尤其是在企业间交互时更是如此。
在这一点上,您几乎被迫采取某种事件驱动的架构方法,而不是典型的基于SOAP的RPC模型交互方式。这并不意味着必须使用ESB,但将企业之间的连接视为ESB之间的连接非常有用。
即使如此,仍然依赖SOAP作为传输方式也会变得棘手。您不仅需要使用对立的Web服务来适应双向交互,还需要解决版本控制问题。通常,SOAP方法会退化为围绕其他方式(例如单独的XML模式)定义的“块”的微不足道的包装器。
有答案,但它们从来都不是简单的。 Web服务版本控制的最佳实践讨论了其中的一些。
但是SOA并不意味着异步。这只是实现SOA的聪明方式。SOA是关于松耦合的。SOA的EDA子集是关于更进一步的解耦。

1

整合不同的技术来访问相同的资源;在这些不同的技术上实现一定程度的事务隔离;将一个业务逻辑写在一个地方以保持一致(这样当需要更改该逻辑时就不会出现噩梦)...


0

如果要在组织内部以及可能扩展到其他组织的系统中使用SOA。

对于可能会发生变化的产品,这也是不错的选择,您可以替换其中的一些小部分。

最终,您将拥有许多乐高积木,可以将它们组合在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接