Pre*_*ham 5 java architecture database-design microservices spring-cloud
我正在尝试了解微服务。我想知道如何解决微服务架构中一对多/多对多关系的问题以及最佳实践是什么。假设我想将学生课程应用程序转换为学生服务,课程服务和学生服务对话转换为同一数据库中的学生表和课程服务对话课程表。
示例:学生可以注册许多课程,并且许多课程可以有许多学生(多对多关系)。我有 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>();
}
Run Code Online (Sandbox Code Playgroud)
课程服务有课程对象
@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>();
}
Run Code Online (Sandbox Code Playgroud)
我了解学生服务必须致电课程服务才能获取课程,但如何将课程映射到学生?(例如学生 A 已注册课程 X、Y、Z)
您能帮助我回答解决微服务中多对多关系问题的最佳实践吗?
这是微服务领域的典型陷阱。即使在面向微服务的架构中,重点也应该放在解决非常具体的业务问题上,然后有支持的数据库表。
在这种情况下,“StudentRegistration”服务似乎可能会有所帮助,它可以获取有问题的连接。拥有像“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-commerce.html。