JHipster JDL:如何在微服务之间链接实体(通过ID)?

JHipster JDL:如何在微服务之间链接实体(通过ID)?,jhipster,jdl,Jhipster,Jdl,我正在运行最新的JHipster生成器 izio@1z10:~$ jhipster --version Using JHipster version installed globally 5.3.4 我通过运行 jhipster import-jdl jhipster-jdl.jh 生成我的微服务和网关项目 application { config { baseName Gateway applicationType gateway packageName com

我正在运行最新的JHipster生成器

izio@1z10:~$ jhipster --version
Using JHipster version installed globally
5.3.4
我通过运行

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命令没有错误。 这里的问题是,我需要一种通过实体ID在不同的微服务之间链接实体的方法。 现在,链接错误地指向了另一个实体类(即使它位于不同的微服务中)。显然,由于缺少实体类,这导致应用程序无法运行

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


有什么方法可以从JDL实现这一点,而不是手工进行所需的更改吗?

您说得对,指定来自不同微服务的实体之间的关系不起作用,我认为JDL解析器在这种情况下应该会出错(可以在github上报告问题),我没有尝试,但我认为实体子生成器不允许这样做。因此,您可以在实体中定义简单的id字段,但它不会是一种关系,因为它不允许您在数据库中轻松构建联接查询,因为每个实体都位于不同的数据库中,JHipster也不会为其生成前端代码

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

您可以通过在子实体或父实体的组件中维护数组来创建仅存在于网关web应用中的关系。无论何时查看此类组件,无论是详细信息还是条目/更新表单,您都可以使用该实体的http服务从微服务中提取数据并更新阵列,或者映射,然后相应地匹配数据。
例如,图书实体可能包含有关作者的详细信息/字段,例如姓名或作者Id。因此,在更新图书时,使用“authorService”使用“ngOnInit”填充“authors”数组,然后在图书中输入“Author’s name”字段时,使用预填充的“书籍更新”组件中的“作者”数组“

如果外部实体可以被它们的ID替换,并且实体对象可以通过使用外部客户端按需检索,那就更好了。我知道这不是最好的例子,在不同的微服务中使用book和author,但这只是一个例子。它的目的是作为微服务之间弱连接的手段,否则它们将更像一组单片。是的,它可能是一个功能请求,尽管我不愿意在JDL中实现它,因为它可能看起来像是认可了错误的模式,而且假客户端代码很容易手动编码。无论如何,您可以在github上提交请求,并与开发团队展开讨论。如果您愿意的话,我已经这样做了