我正在运行最新的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 中执行此操作,而不是手动进行所需的更改?
最佳答案
你是对的,指定来自不同微服务的实体之间的关系不起作用,我认为 JDL 解析器应该在这种情况下引发错误(请随意在 github 上报告问题),我没有尝试,但我认为实体子生成器不允许这样做。因此,您可以在实体中定义简单的 id 字段,但它不会是一种关系,因为它不允许您轻松地在数据库中构建 JOIN 查询,因为每个实体驻留在不同的数据库中,并且 JHipster 不会为其生成前端代码也是。
我还建议您重新考虑如何在微服务之间划分业务领域。 构建这种关系是微服务架构中的反模式,每个微服务都应该围绕有界上下文进行定义(有关详细信息,请参阅领域驱动设计)。如果两个实体有很强的关系,通常意味着它们应该属于同一个微服务。可能存在异常(exception)情况,但与一个微服务中的 JOIN 数据库查询相比,使用服务间调用来联接实体非常昂贵且脆弱,因此您应该避免使用它们。
关于JHipster JDL : how to link entities (by ID) among microservices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52461632/