микросервисы общего доступа к объектам - PullRequest
0 голосов
/ 10 мая 2018

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

Пример: студенты могут записаться на многие курсы, а также на многиеКурсы могут иметь много студентов (отношения многие ко многим).У меня есть 2 микросервиса Микросервисы 1: Студенческий сервис Микросервисы 2: Курс-сервис

Студент Сервис имеет студенческий объект

@Entity
@Table(name = "STUDENT")
public class Student {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "NAME")
private String name;


//@ManyToMany(fetch = FetchType.LAZY)
//@JoinTable(name = "STUDENT_COURSE", joinColumns = @JoinColumn(name = //"STUDENT_ID"), inverseJoinColumns = @JoinColumn(name = "COURSE_ID"))
//  private List<Course> courses = new ArrayList<Course>();
}

Курс Сервис имеет объект курса

@Entity
@Table(name = "COURSE")
public class Course {

@Id
@Column(name = "ID")
private long id;

@Column(name = "COURSE_NAME")
private String name;

//@ManyToMany(mappedBy = "courses", fetch = FetchType.LAZY)
//private List<Student> students = new ArrayList<Student>();
}

Я понимаю, что студенческие службы должны звонить в службу курсов, чтобы получить курсы, но как мне назначить курс студенту (например, студент А записался на курсы X, Y, Z)

  • Как получить список курсов для студента или список студентов для курса?
  • Нужно ли мне дублировать Курс Класс в Студенческое обслуживание и Студент Класс в Курс Сервис ?
  • Нужно ли перемещать классы домена в общий проект, а затем делиться между микросервисами, чтобы избежать дублирования?

Не могли бы вы мне помочь, ответив на передовой опыт решения многих для многихпроблема взаимоотношений в микросервисе?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Размышляя о микросервисах, он помогает вспомнить понятия Ограниченный контекст

Мартин Фаулер : Ограниченные контексты имеют как не связанные понятия (например, билет поддержки, существующий только в контексте поддержки клиентов), так и общие понятия (такие как продукты и клиенты). В разных контекстах могут быть совершенно разные модели общих понятий с механизмами для сопоставления этих многозначных понятий для интеграции.

Понятия Студент и Курс могут сильно различаться в каждой микросервисе вашего приложения. Например, Студент может быть определен как человек с идентификатором, именем, фамилией и адресом в микросервисе StudentInformationManagement и может иметь только идентификатор и список курсов в микросервисе CourseAttendance.

То есть я бы не использовал общую базу данных для этих микросервисов, вместо этого я бы создал отдельные базы данных с необходимыми объектами. Только идентификатор «разделяется» между службами.

Попробуйте подумать о своем процессе при разработке моделей данных: какую информацию я получу, когда студент зарегистрируется? Который, когда он записывается в класс?

0 голосов
/ 10 мая 2018

Это типичная хитрость в мире микросервисов. Даже в микросервисных архитектурах основное внимание следует уделять решению весьма специфических бизнес-задач, а затем иметь вспомогательные таблицы базы данных.

Похоже, что в этом случае может помочь служба StudentRegistration, которая может получить данные объединения. Наличие третьей службы, такой как «StudentRegistration», может привести к более чем очевидным сетевым вызовам внутри служб, если кеширование используется правильно, эти микросервисы могут реагировать очень быстро.

Фактически, тогда вы можете оценить, нужны ли вам в конце концов все три услуги, т. Е. Student, Course и StudentRegistration ИЛИ некоторые комбинации могут быть объединены в соответствии с вашими бизнес-процессами или вариантами использования. Это можно сделать, если комбинация некоторых из них не в состоянии ответить на большинство деловых вопросов, не зная друг о друге.

Наконец, может быть не совсем неправильно внедрять микросервисы через общую БД. Смотри: http://microservices.io/patterns/data/shared-database.html

Обратите внимание, что наличие полностью отдельных баз данных для таких тесно связанных микросервисов и постоянная синхронизация этих таблиц с помощью модели событий не так просты, поэтому будьте осторожны. Это не невозможно, однако. Существуют документированные шаблоны проектирования для обслуживания бизнес-транзакций, охватывающих несколько микросервисов, а именно: шаблон CQRS (https://martinfowler.com/bliki/CQRS.html), шаблон SAGA (http://microservices.io/patterns/data/saga.html)) и источник событий: http://microservices.io/patterns/data/event-sourcing.html.

...