我们有一个基于 SOA 的项目,该项目从一开始就被构建为一个 Web 服务层到一个完善的应用程序。
客户A--> ClientB --> ESB --> 原子服务 --> 已建立的应用程序(DB/NAS 等) 客户C-->
我们有几个场景,其中 ESB 提供的服务由多个按交互顺序调用的原子调用组成,因此从逻辑上讲,它们会执行以下操作:
def compose_service(xmlrequest): output_of_decision_service = 决策服务(xmlrequest) 如果(output_of_decision_service.matches(“foo”)): xmlresult = foo_service(xmlrequest) if (output_of_decision_service.matches("bar")): xmlresult = bar_service(xmlrequest) 返回xml结果
事实上,这个逻辑是使用 XSLT 转换实现的,并且 XPath 查询构建到我们购买的 ESB 实现中。这对我来说似乎有问题,原因如下:
- 开发人员无法在本地测试组合服务(从业务角度来看的简单功能),因为 ESB 实现过于“繁重”而无法在本地部署。整体测试是一项集成活动。
- 用于形成这些和类似控制块的 XSLT 语法不像通用编程语言中的代码那样可读或可访问。(if ... then,else finally 等) XSLT 已经变得很长而且令人生畏。
- 在某些复杂的场景中,更细粒度的控制将是有益的,即通过调用补偿原子服务来回滚较早的操作来补偿失败的调用。
我想在这个项目上工作了一年之后,我觉得将应用程序功能分解为原子服务的想法是一个很好的想法。然而,我经常觉得我更喜欢用 Java 等普通的老式编程语言来实现组合 Web 服务。
我想这看起来像这样:
ClientA --> ComposingServiceA --> ClientB --> ComposingServiceB --> 原子服务 --> App ClientC --> ComposingServiceC -->
但是,在这里阅读我发现了一个未引用的声明,如下所示:
当然,在代码中模拟 ESB 行为是更糟糕的选择
遗憾的是,这只是对事实(意见)的盲目陈述,没有任何支持理由。然而它让我慌了。为什么上面说的是真的?我准备起草一封电子邮件给我们的建筑师,表达上述所有担忧,但这条评论让我想知道我是否应该这样做?
为什么在代码中模拟 ESB 行为肯定是最糟糕的选择?