2

我正在运行最新的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 做到这一点,而不是手动进行所需的更改?

4

2 回答 2

4

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

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

于 2018-09-23T08:07:13.473 回答
0

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

于 2019-04-30T05:18:31.163 回答