【问题标题】:JHipster JDL: how to link entities (by ID) among microservices?JHipster JDL:如何在微服务之间链接实体(按 ID)?
【发布时间】:2019-02-26 22:05:31
【问题描述】:

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

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

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

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

有没有办法从 JDL 中做到这一点,而不是手动进行所需的更改?

【问题讨论】:

    标签: jhipster jdl


    【解决方案1】:

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

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

    【讨论】:

    • 如果可以将外部实体替换为它们的 ID,并且可以使用 feign 客户端按需检索实体对象,那就更好了。我知道这不是最好的例子,在不同的微服务中使用书籍和作者,但这只是一个例子。它旨在作为微服务之间连接的弱手段,否则它们将更像是一组单体。
    • 是的,这可能是一个功能请求,尽管我不愿意在 JDL 中实现它,因为它看起来像是在认可错误的模式,而且假客户端代码真的很容易手动编码。无论如何,请随时在 github 上提交请求并与开发团队公开讨论。
    • 我做了,如果你想看看它在github.com/jhipster/generator-jhipster/issues/8390
    【解决方案2】:

    您可以通过在子实体或父实体的组件中维护一个数组来创建仅存在于网关 Web 应用程序中的关系。任何时候查看此类组件时,无论是详细信息还是条目/更新表单,您都可以使用该实体的 http 服务从微服务中提取数据并更新数组,或者映射然后相应地匹配数据。 例如,图书实体可以包含有关作者的详细信息/字段,例如姓名或作者的 ID。因此,当您更新图书时,您使用“ngOnInit”填充“authors”数组,使用“authorService”,然后当您输入图书中的“作者姓名”字段时,您从下拉列表中选择名称,使用“book-update-component”中预填充的“authors”数组。

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 2018-01-02
      • 2017-09-26
      • 2019-04-17
      • 2018-10-04
      • 2016-10-30
      • 2020-04-21
      • 2016-10-06
      • 1970-01-01
      相关资源
      最近更新 更多