Spring 如何整合不同的“;微服务&x201D;进入交易?

Spring 如何整合不同的“;微服务&x201D;进入交易?,spring,spring-boot,spring-integration,microservices,spring-cloud,Spring,Spring Boot,Spring Integration,Microservices,Spring Cloud,我们正在构建一个新的基于web的工业应用程序,在过去几天里,我们一直在思考的一个问题是如何在这种体系结构上集成不同的“微服务” 我对微服务的使用只是小题大做,因为我们并没有完全接受定义真正微服务的概念。一个(我认为最大的)区别在于我们在不同的模块上使用相同的共享数据库(我称之为“微服务”)。我们系统的逻辑视图可以绘制为: ╔══════════════╗ ║ Client ║ ══╗

我们正在构建一个新的基于web的工业应用程序,在过去几天里,我们一直在思考的一个问题是如何在这种体系结构上集成不同的“微服务”

我对微服务的使用只是小题大做,因为我们并没有完全接受定义真正微服务的概念。一个(我认为最大的)区别在于我们在不同的模块上使用相同的共享数据库(我称之为“微服务”)。我们系统的逻辑视图可以绘制为:

                  ╔══════════════╗
                  ║    Client    ║ ══╗
                  ╚══════════════╝   ║ (2)
                                     ║
                                     ▼        
        ╔══════════════╗  (1) ╔══════════════╗
        ║  Serv. Reg.  ║ <==> ║  API Gatew.  ║
        ╚══════════════╝      ╚══════════════╝
            █       █   █████████████     (4)
           █         █              ████
╔══════════════╗  ╔══════════════╗  ╔══════════════╗
║   Module A   ║  ║   Module B   ║  ║   Module C   ║  <===== "Microservices"
╚══════════════╝  ╚══════════════╝  ╚══════════════╝
        ║║ (3)           ║║ (3)            ║║ (3)
        ║║               ║║                ║║
╔══════════════════════════════════════════════════╗
║                Database Server                   ║
╚══════════════════════════════════════════════════╝
╔══════════════╗
║    客户║ ══╗
╚══════════════╝   ║ (2)
║
▼        
╔══════════════╗  (1) ╔══════════════╗
║  服务。规则。║  ║  API网关。║
╚══════════════╝      ╚══════════════╝
█       █   █████████████     (4)
█         █              ████
╔══════════════╗  ╔══════════════╗  ╔══════════════╗

║ 模块A║ ║ 模块B║ ║ 模块C║ 通常情况下,微服务方法假定数据不在同一数据库/模式级别的这些服务之间共享

这意味着微服务是作为业务逻辑中某个领域概念的“专家”实现的,该领域非常广泛/复杂,足以“获得”微服务

否则,微服务体系结构的许多优势就会消失:

  • 独立性。嗯,我们可以按照自己的速度部署新版本的微服务,甚至不共享技术堆栈,等等。现在,如果我更改了一个模式(即使是很小的更改),比如说添加或在更极端的情况下更改或删除列,那么其他微服务如何知道发生了这种情况。我可以单独部署每个服务商吗?现在我必须同时部署所有服务商吗?不幸的是,第二种选择是唯一可行的方法。所以没有真正的独立

  • 可伸缩性。每个微服务都可以独立扩展,听起来很棒。但是现在,由于它们都共享相同的存储,所有操作都将针对该存储执行,因此在规模上,它将很快成为一个真正的瓶颈,因此没有应用真正的可伸缩性

  • 你看它去哪里了

    现在,事务问题,或者从更一般的意义上说,数据完整性问题,确实是转向微服务方法时需要解决的最大挑战之一

    通常(同样根据我的经验),人们调整用例的方式是最终的一致性也足够好,然后就没有问题了。无论如何,像分布式事务这样的事情应该更好地避免,因为它们使代码极其复杂,维护起来真是一场噩梦


    因此,归根结底,您应该首先考虑微服务方法是否适合您的应用程序,如果是,如何以满足所有主要用例的方式真正分解数据。

    您可以研究领域驱动的设计,以考虑服务的上下文。聚合应该是事务的边界

    要考虑服务之间的通信,您可以尝试识别
    事件
    ,并使用这些事件协调多个服务中的状态更改。 如果您确实需要来自多个外部服务的大量数据来执行事务,则可以在需要数据的服务中保留外部数据的副本<代码>预测
    这些通常被调用,并且可以通过外部服务发布的事件保持最新


    一般来说,在服务之间共享一个表被视为一种不好的做法,只有一个服务应该是所有者。

    当您进行域驱动设计时,这种方法会出现问题。首先,您应该对应用程序的域寻址有深入的了解。并且应该能够识别应用程序模块的类型。如果您已经确定了这种粒度模块,那么您可以轻松地将它们转换为微服务。每个有界上下文都应该高度独立,这意味着单个事务必须在微服务中处理。因为您使用的是公共数据库,所以我假设它是一个严格遵循RDBMS属性的数据库。如果您必须在使用DB的事务中获得ACID属性,那么您将要创建的每个微服务都必须独立处理事务管理。换句话说,如果您可以将事务概念化为事件的顺序,并且每个事件本身可以自我维护其状态,那么您可以将您的微服务发展为处理这些事件的引擎。如果最终的设计是,微服务必须相互依赖,并且在大多数用例中,它们无法单独处理状态/事件/事务,那么您必须重新考虑您的方法。你想要达到的目标被称为。有些人认为这是一个问题。

    您是否对每个微服务使用相同的数据库服务器,但模式不同?或者您真的在多个微服务之间使用相同的模式和相同的表吗?对我来说,考虑到这些模块之间的强大绑定,微服务体系结构似乎并不真正适合您的需求。@dunni是的,我还认为微服务体系结构不是描述我们试图实现的目标的最佳方式。所有不同的服务(模块)使用相同的数据库和