spring microservices как связывать модели из разных микросервисов

У меня есть два микросервиса AuthService и CoursesService В AuthService есть модель User для авторизаций, регистраций и прочей spring security конфигураций

@Entity
@Table( name = "users",
    uniqueConstraints = {
        @UniqueConstraint(columnNames = "username"),
        @UniqueConstraint(columnNames = "email")
    })
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotBlank
@Size(max = 20)
private String username;

@NotBlank
@Size(max = 50)
@Email
private String email;

@NotBlank
@Size(max = 120)
private String password;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "user_roles",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles = new HashSet<>();

А также CoursesService в которм есть модель Course и мне нужно связать User и Course

@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String course_name;

private String course_desc;

private String course_pic;

@ManyToOne
@JoinColumn(name = "user_id")
private User author; // Я не могу так написать, User не в CoursesService 

Так как User и Course в разные сервисах я не могу использывать @JoinColumn подскажите как тут быть, спасибо заранее


Ответы (1 шт):

Автор решения: petrovich

Если вы действительно хотите построить микросервисную архитектуру, то связывать нужно не модели, с которыми работают микросервисы, а api микросервисов.

Вот несколько вариантов (хороших и плохих):

  1. Слить модель данных в один из сервисов, авторизацию построить с помощью Spring Security (самый простой и правильный)
  2. Создать общую для всех компонентов библиотеку с описанием всех сущностей dao-слоя и импортировать ее в конкретные модули, попутно настраивая датасорсы (плохой вариант но иногда этот подход работает лучше микросервисного)
  3. Не выстраивать в dao-сущностях явных зависимостей в виде JoinColumn (рекомендуемый). Поля, которые задуманы как внешние ключи будут в этом случае обычными числами/строками и т.п., а также появятся связующие таблицы с типом связи many-to-many. Например в CoursesService появится таблица user_course, в которой вы будете через обращение по api искать по user_id доступные пользователю курсы.

P.S.: Возоможно вам стоит посмотреть на слияние этих сервисов, так как нужды аторизации и аутентификации прекрасно покрывает Spring Security без необходимости написания отдельного микросервиса.

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

→ Ссылка