在我们公司,我们使用微服务方法,因为我们希望保持服务小巧,易于理解和可维护。除此之外,我们使用负载均衡器,使我们能够复制重用的服务。如何在微服务全部共享数据和概念时重新组织这些服务?
我们知道,如果需要耦合,微服务应该是松散耦合的。此外,耦合不应该发生在数据库上,但最好通过API(REST)。
那么,我们使用微服务的想法。我们不应用推荐的everthing。在我们的例子中,我们使用通过REST和JMS消息进行通信的松散耦合的Tomcat War。所有的webapp都使用相同的数据库服务器,但他们都有自己的方案(所以没有整合)。
我们有两个问题,这种方法:服务的
- 75%生成报表数据。有一个报告服务负责持久化和提供这些数据。因此,所有生成报告数据的服务都将他们的发现发送到报告服务。实际上,每个 服务都有自己的责任,但我们仍然需要所有这些沟通。这似乎与微服务理念相冲突。它就像一个水平层,将所有垂直微服务绑定在一起。
- 由于上面的“水平”耦合,我们还共享接口对象。报告数据是以某种方式构建的。而且每项服务都需要遵循这一结构。我们强烈地感觉到域/接口对象的共享库违背了一些原则。但是,正如你将会理解的那样,复制所有接口对象似乎很笨拙,并且在接口改变时仍然需要很多工作。
当前体系结构的替代方案是每个服务都会保留自己的报告数据。然后,只有在报告呈现时才需要沟通。在那种情况下,我们没有服务和报告服务之间的定期沟通。缺点是现在每个服务都需要它的数据库层(没有),并且你仍然需要在所有服务之间共享报告结构。
高层次的问题是:当行为可以水平和垂直分离时,是否存在划分服务的模式?
在“产品”通过整套服务扮演中心角色的销售应用程序中可能会出现同样的问题。
我们应该重新设计架构吗?有我们可以使用的模式吗?或者这是一个已知的反模式?
嗯,这是系统是关于一组数据验证程序,它将所有调查结果合并到一个报告中并发回给客户。每个发现都具有类似的属性,如时间戳,严重性,代码等等。所以,它实际上是一种领域模型。 – hsmit
啊,我明白了,所以你没有报告服务,服务是生成报告。所以你有一个通用的报告库,每个库都将流媒体内容传递给它。该服务的接口很常见,并且您甚至可能拥有一个客户端存根库,并将其分发给其他服务,但这并不意味着其他服务将该域模型集成到他们自己的服务器中。他们使用该模型写入外部报告服务,但他们没有将其作为自己的模型。 –
诀窍是接受这些是外部依赖关系,并将它们与域模型隔离。如果你看洋葱的体系结构,端口和适配器等,外部依赖关系在外部,域模型在内部。您的域模型通过您的客户端存根与这些接口进行通信,但它并未将它们集成到它自己的接口中。保持与内部域模型的分离很重要。从这些接口中创建一个库并将它们放入外部层(使用数据访问层等)是完全合适的, –