【问题标题】:How to create cross-service domain model mapping?如何创建跨服务领域模型映射?
【发布时间】:2020-01-31 10:19:16
【问题描述】:

我在 Spring Boot 微服务架构中有两个微服务。比方说……

  • 热点服务
  • 附件服务

这两个服务都包含一个域模型,当然最终在单独的 JAR 中。

HotSpot 域模型(HotSpot 服务)

@Entity
public class HotSpot {

    @Id
    private Long id;
}

附件域模型(附件服务)

@Entity
public class Attachment {

    @Id
    private Long id;
}

如果您创建一个新的热点,应该可以添加一个额外的附件,例如描述图像。因此,热点实体与其附件之间应该存在某种关联/映射。在单体应用程序中,这将通过使用 JPA 注释 @OneToOne 或类似的东西进行注释来实现。

如何在微服务架构中实现这一点?这两个类都在单独的 JAR/项目中!我考虑将标识符存储为Long,独立于JPA。 有什么“更好的”/其他想法吗?

【问题讨论】:

  • 你可以存储附件的URI
  • 作为实体类的一部分?只存储标识符有什么好处?
  • REST 中的资源有一个 URI。如果您只存储 id,则必须在任何地方配置 URI。但正如@Didier 所说,将这两个密切相关的微服务分开可能没有意义。微服务应尽可能独立

标签: java spring spring-boot jpa microservices


【解决方案1】:

我们有一个用于标记的半通用服务(如您示例中的附件服务)。您可以使用与我们使用的类似的结构,如下所示:

// Contains types of "things" that can accept attachments
// Probably unnecessary if you aren't multi-tenant
public class EntityType
{
   public int Id;
   public Guid TenantId;
   public string Name;
}

// Contains a list of Entities available to Attach to
public class Entity
{
   public int Id;
   public int EntityTypeId;
   public string EntityId; // The unique Identifier for this Instance of Entity
}

// Contains actual attachment values (URI's) assigned to an Entity instance
public class EntityAttachment
{
   public int Id;
   public int EntityId;
   public string Attachment;
}

尽管具体需求略有不同,但类似这样的方法可能适合您构建一个通用的 Attachments 服务,该服务可让您附加到几乎任何东西,但仍保持数据良好规范化和快速查询。

我们即时构建 EntityTypeEntity 数据集 - 如果有人想为我们没有的类型或 ID 添加标签,我们会静默添加。

【讨论】:

    【解决方案2】:

    首先我要问你是如何划分你的微服务的?将相互依赖的资源分开是没有意义的。在您的示例中,我不确定附件是否可以在没有 HotSpot 的情况下存在。如果不可能,那么将这两个实体放在两个独立的微服务中肯定是没有意义的。

    假设你的资源应该在两个微服务中分开,你需要为每个资源一个 URI。如果资源 A 与资源 B 相关,您可以只将 B 的 URI 存储在 A 中,如果您的微服务应该是 RESTful 的,则提供 A 到 B 中正确关系的链接。任何像 OneToOne JPA 关系这样的自动系统都不存在。

    【讨论】:

    • 附件可以独立于热点存在,比如说作为用户的个人资料图片...为什么建议存储 URI 而不是标识符?
    • URI是标识符
    • 是的,我说的和你一样……我只是在谈论数据的类型。但从战略的角度来看,这并不重要
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2015-11-12
    • 2012-02-04
    • 2011-07-03
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多