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

时间:2018-09-22 23:09:45

标签: jhipster jdl

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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