我们有一个简单的REST We应用程序,它依赖于多种外部服务,主要是Kafka消息。试图通过将所有外部交互封装在单独的webapp中来隔离外部依赖,并使核心应用程序仅通过内部kafka主题与外部接口应用程序通信。
---------- ---------------
| core app | <---Internal kafka topic ---> | external | <--> external kafka topics
| | | interfaces app|
---------- ---------------现在,我们正在慢慢地遇到越来越多的需求,在这些需求中,我们需要对外部系统、一些REST、一些SOAP进行同步调用。通过外部接口应用程序添加这类请求并通过内部kafka主题标尺读取结果会好吗?在这里,我们还可以使用哪些其他策略来分离外部依赖?
发布于 2016-02-06 11:55:04
就去耦而言,您可能想要的是创建一个仅存在于核心应用程序包中的适配器/抽象层,并使您的核心应用程序依赖于这个新创建的层。
将Kafka的管理转移到不同的项目并不是个坏主意,但是即使这样,核心应用程序也不应该直接依赖于这个新创建的web应用程序,而是为内部应用程序提供抽象层,然后在其代码中使用这个抽象层。
在具有名称空间的语言中,经验法则是,如果一个项目总是有自己的基本名称空间(可以使用它来标识),那么除了包或模块层(或您在代码中称之为层)之外,提供外部依赖关系的抽象层的层,应用程序只应该依赖于来自同一个基础命名空间的类。
所以在使用项目B的项目A中,我会创建一个模块层,将B层抽象成我自己的需求,适合项目A所需要的内容,然后在A代码库中使用这个抽象层。
在使用项目A的项目C中,我将再次创建一个抽象层,通过提供适配器接口来有效地隐藏A依赖项。
通过这样做,您不太关心外部依赖项(方法重命名、方法参数的转移、.)中的小更改,因为它都在一个地方,模块抽象层,因此修复非常简单。
发布于 2016-02-08 09:46:56
如果您对包装程序进行异步调用,它应该可以很好地扩展。如果您正在进行同步调用,则受外部服务和网络的响应时间的限制。你控制不了这件事。
但是,通过调用包装器而不是等待响应,您可以执行其余的处理,或者等待响应,或者在收到响应之前返回。它的工作方式取决于您的需求,但您可以返回主页面数据,并为外部数据保留一些占位符,使用具有相同引用的另一个请求来尝试在数据最终返回时刷新该部分。
https://softwareengineering.stackexchange.com/questions/309426
复制相似问题