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 шт):
Если вы действительно хотите построить микросервисную архитектуру, то связывать нужно не модели, с которыми работают микросервисы, а api микросервисов.
Вот несколько вариантов (хороших и плохих):
- Слить модель данных в один из сервисов, авторизацию построить с помощью Spring Security (самый простой и правильный)
- Создать общую для всех компонентов библиотеку с описанием всех сущностей dao-слоя и импортировать ее в конкретные модули, попутно настраивая датасорсы (плохой вариант но иногда этот подход работает лучше микросервисного)
- Не выстраивать в dao-сущностях явных зависимостей в виде JoinColumn (рекомендуемый). Поля, которые задуманы как внешние ключи будут в этом случае обычными числами/строками и т.п., а также появятся связующие таблицы с типом связи many-to-many. Например в CoursesService появится таблица user_course, в которой вы будете через обращение по api искать по user_id доступные пользователю курсы.
P.S.: Возоможно вам стоит посмотреть на слияние этих сервисов, так как нужды аторизации и аутентификации прекрасно покрывает Spring Security без необходимости написания отдельного микросервиса.
Отдельный миросервис, выполняющий роль сервера авторизации, нужен только если вы хотите сделать единую точку входа в ваш контур микросервисов и в одном месте контролировать доступы как для общения микросервисов друг с другом, так и для внешнего мира.