JHipster JDL:如何在微服务中 link 个实体(按 ID)?

JHipster JDL: how to link entities (by ID) among microservices?

我是 运行 最新的 JHipster 生成器

izio@1z10:~$ jhipster --version
Using JHipster version installed globally
5.3.4

我正在使用 运行ning

的以下 JDL
jhipster import-jdl jhipster-jdl.jh

生成我的微服务和网关项目。

application {
  config {
    baseName Gateway
    applicationType gateway
    packageName com.app.gateway
    databaseType postgresql
    devDatabaseType postgresql
    prodDatabaseType postgresql
    serverPort 8080
    languages [en,it,de,fr,es,pt-pt]
    serviceDiscoveryType eureka
  }
  entities *
}
application {
  config {
    baseName authorMS
    applicationType microservice
    packageName com.app.ams
    databaseType postgresql
    devDatabaseType postgresql
    prodDatabaseType postgresql
    serverPort 8081
    serviceDiscoveryType eureka
  }
  entities Author
}

application {
  config {
    baseName bookMS
    applicationType microservice
    packageName com.app.bms
    databaseType postgresql
    devDatabaseType postgresql
    prodDatabaseType postgresql
    serverPort 8082
    serviceDiscoveryType eureka
  }
  entities Book
}

entity Author{
    Name String required
}
entity Book{
    Name String required
}

relationship ManyToMany{
    Book{authors(name)} to Author
}

dto * with mapstruct
service * with serviceImpl
paginate * with pagination

microservice Author with authorMS
microservice Book with bookMS

一切似乎都很好,至少生成部分是这样,因为 jhipster import-jdl 命令没有错误。 这里的问题是我需要一种方法来 link 通过不同微服务中的 ID 实体。 现在 link 被错误地设置为另一个实体 class (即使它驻留在不同的微服务中)。显然,由于缺少实体 class.

,这导致无法 运行 应用程序

在这种情况下,唯一合乎逻辑的解决方案是 link 不同微服务之间的实体,使用它们的 ID 而不是实体 class。

有没有什么方法可以从 JDL 执行此操作,而不是手动进行所需的更改?

你是对的,指定来自不同微服务的实体之间的关系是行不通的,我认为 JDL 解析器应该在这种情况下引发错误(请随时在 github 上报告问题),我做到了不尝试,但我认为实体子生成器不允许它。因此,您可以在您的实体中定义简单的 id 字段,但它不会是一种关系,因为它不允许您轻松地在数据库中构建 JOIN 查询,因为每个实体都驻留在不同的数据库中,并且 JHipster 不会为其生成前端代码也是。

我还建议您重新考虑如何在微服务之间拆分您的业务领域。 建立这样的关系是微服务架构中的一种反模式,每个微服务都应该围绕有界上下文进行定义(详情请参阅领域驱动设计)。如果 2 个实体有很强的关系,这通常意味着它们应该属于同一个微服务。可能会有例外,但与在一个微服务中加入数据库查询相比,使用服务间调用来加入实体非常昂贵且脆弱,因此您应该避免使用它们。

您可以创建仅存在于网关 Web 应用程序中的关系,方法是在子实体或父实体的组件中维护一个数组。每当要查看此类组件时,无论是详细信息还是 entry/update 表单,您都可以使用该实体的 http 服务从微服务中提取数据并更新数组,或者映射,然后相应地匹配数据。 例如,书籍实体可以包含有关作者的详细信息/字段,例如姓名或作者的 ID。因此,当您更新书籍时,您使用 "ngOnInit" 填充 "authors" 数组,使用 "authorService" 然后当您在书中输入 Äuthor's Name" 字段时,您选择使用 "book-update-component".

中预先填充的 "authors" 数组从下拉列表中取名