JHipster JDL: как связать сущности (по идентификатору) между микросервисами? - PullRequest
0 голосов
/ 23 сентября 2018

Я использую последний 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 ошибки нет.Проблема здесь в том, что мне нужен способ связать сущности по их идентификатору среди разных микросервисов.Прямо сейчас ссылка сделана неправильно на другой класс сущности (даже если он находится в другом микросервисе).Очевидно, что это приводит к невозможности запуска приложения из-за отсутствия класса сущности.

В таких случаях единственным логическим решением будет связать сущности между различными микросервисами, используя их идентификаторы, а не класс сущностей.

Есть ли способ сделать это из JDL, вместо того, чтобы вносить необходимые изменения вручную?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вы можете создать связь, которая существует только в веб-приложении шлюза, поддерживая массив в компонентах дочерних или родительских объектов.Каждый раз, когда такой компонент просматривает данные, будь то подробности или форма ввода / обновления, вы извлекаете данные из микросервиса, используя службу http для этого объекта, и обновляете массив, или сопоставляете данные, соответственно сопоставляя данные.Например, сущность книги может содержать сведения / поле об авторе, например, имя или идентификатор автора.Поэтому, когда вы обновляете книгу, вы используете «ngOnInit» для заполнения массива «авторы», используя «authorService», а затем, когда вы вводите поле «Имя автора» в книге, вы выбираете имя из выпадающего списка,с использованием предварительно заполненного массива «авторы» в «book-update-component».

0 голосов
/ 23 сентября 2018

Вы правы, указание отношений между сущностями из разных микросервисов не работает, и я думаю, что парсер JDL должен вызвать ошибку в таком случае (не стесняйтесь сообщать о проблеме на github), я не пробовал, но я думаю, чтоСубгенератор сущности не позволяет этого.Таким образом, вы можете определить простые поля идентификаторов в ваших сущностях, но это не будет взаимосвязь, потому что это не позволит вам легко создавать запросы JOIN в базе данных, поскольку каждая сущность находится в другой базе данных, а JHipster не будет генерировать для нее код внешнего интерфейса.тоже.

Я также советую вам пересмотреть вопрос о том, как вы разделяете свою бизнес-область на микроуслуги.Построение таких взаимосвязей является антишаблоном в архитектуре микросервисов, каждый микросервис должен определяться в ограниченном контексте (подробности см. В разделе «Проектирование на основе домена»).Если у двух организаций сильные отношения, это часто означает, что они должны принадлежать к одному и тому же микросервису.Могут быть исключения, но использование межсервисных вызовов для объединения объектов очень дорого и хрупко по сравнению с запросами к базе данных JOIN в пределах одного микросервиса, поэтому их следует избегать.

...