gpt4 book ai didi

java - 将多模块项目迁移到微服务?

转载 作者:行者123 更新时间:2023-12-02 09:14:43 24 4
gpt4 key购买 nike

我有多模块应用程序。更明确地说,这些是 Maven 模块,其中高级模块依赖于低级模块。以下是一些模块:-

    user-management
common-services
utils
emails

例如:-如果用户管理模块想要使用utils模块中的任何服务,它可以调用其服务,因为utils的依赖项已经在用户管理下注入(inject)。为了真正遵循微服务架构转换/调用我的项目,我相信我需要将每个模块转换为可独立部署的服务,其中每个模块都是一个 war 模块并通过http提供服务(主要作为resful web服务)。这是正确的还是还有其他需要注意的地方?

现在可能每个模块和身份验证层都必须受到保护?

如果这就是微服务的关键,当有人问你是否像我一样从事过微服务工作时,我真的不明白它不是工具/平台/框架,而是一个简单的将整体应用程序划分为较小的一组可部署模块的概念,这些模块的服务可通过 HTTP 获得。不是吗?可能是另一个流行词。

更新:-显然,微服务方式有很多优点,比如独立的单元可测试模块、可扩展性,因为它可以部署在单独的机器上、松散耦合等,但我发现我还需要处理两个复杂的问题

  1. 身份验证:- 对于每个模块,我需要确保它对请求进行身份验证,但现在情况并非如此
  2. 事务:- 我无法维护跨不同服务的事务原子性,而我目前可以很容易地做到这一点

最佳答案

您所理解的非常好,并且您已经找到了微服务比单体应用(分布式事务)变得复杂的正确领域,但让我澄清有关微服务的一些要点。

  1. 微服务并不意味着通过 HTTP 公开的独立服务:微服务可以通过同步或异步方式与其他服务通信,因此 REST 是解决方案之一,并且适用用于同步通信,但您也可以使用 Kafka 或 hornetq 等执行异步通信,例如消息驱动。在同步通信中,底层服务也可以通过 Thrift 协议(protocol)进行调用。

  2. 遵循 SRP 的微服务:微服务的优点在于,每项服务仅集中于一个业务域用例,因此它仅处理一个域对象的功能。但 utils 模块用于通用方法,因此每个微服务都依赖于它。因此,即使对 utils 模块进行很小的更改,也需要构建所有其他微服务,因此违反了微服务 12 原则,因此解散 utils 服务并将其与每个服务本地化。

  3. 处理身份验证:具体而言,微服务可以是以下三种类型之一:
    A。 核心服务:只需执行域操作(例如帐户创建/更新/删除)
    b. 聚合服务:调用一个或多个核心服务,收集结果并对其执行一些操作。
    C。 边缘服务:暴露给客户端(例如移动设备/浏览器等)。我们有时将其称为网关服务;该服务的关键是接受用户请求并根据 URL 将其转发到实际的微服务。因此,如果身份验证对于所有微服务都是通用的,那么它是放置身份验证的理想位置。

  4. 处理分布式事务:是的,这是微服务中最难的部分,但您可以通过事件驱动/消息驱动的方式来实现它。每个 Action 都会弹出一个事件;该事件的订阅者接收相同的事件并执行一些操作并生成另一个事件。如果发生故障,它会生成一个反向事件来补偿创建的第一个事件。

    例如,假设我们从 micoservice A 借记了 100 卢比,因此创建一个 AccountDebited 事件。现在,在微服务 B 中,我们尝试向该帐户存入贷方。如果成功,我们将创建 AccountCredited,A 会接收该事件并创建另一个事件 AmountTransfered。如果发生失败,我们会生成一个 AccountCreditedFailed 事件,该事件由 A 接收并生成一个反向事件 - AccountSpecialCredit - 维持原子性。

关于java - 将多模块项目迁移到微服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45400096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com