当前位置: 首页 > 知识库问答 >
问题:

域对象共享微服务

缪晋
2023-03-14

我试图理解微服务。我想知道如何解决微服务架构中的一对多/多对多关系问题,以及最佳实践是什么。假设我想将学生课程应用程序转换为学生服务,将课程服务和学生服务对话转换为同一数据库中的学生表和课程服务对话课程表。

示例:学生可以注册许多课程,而且许多课程可以有许多学生(多对多关系)。我有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>();
}

我知道学生服务部必须致电课程服务部才能获得课程,但我如何将课程映射到学生?(如学生A已报名参加课程X、Y、Z)

  • 如何获取学生的课程列表或课程的学生列表
  • 我需要在学生服务中复制课程类和在课程服务中复制学生类吗
  • 我是否需要将域类移动到公共项目,然后在微服务之间共享以避免重复

你能帮我回答解决微服务中多对多关系问题的最佳实践吗?

共有2个答案

慕嘉茂
2023-03-14

这是微服务世界中的典型问题。即使在面向服务的微体系结构中,重点也应该放在解决非常特定的业务问题上,然后拥有支持的数据库表。

在这种情况下,“学生注册”服务似乎可能会有所帮助,它可以获取有问题的连接。拥有像“学生注册”这样的第三个服务可能会在服务中引入比明显的网络调用更多的调用,如果正确使用缓存,这些微服务可以响应非常快。

事实上,然后您可以评估您最终是否需要所有三个服务,即学生、课程和学生注册,或者可以根据您的业务流程或用例合并一些组合。如果其中一些组合在不了解彼此的情况下无法回答大多数业务问题,则可以这样做。

最后,在共享数据库上实际实现微服务可能不是完全错误的。请参阅: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.

井翰
2023-03-14

当考虑微服务时,它有助于记住有界上下文的概念

Martin Fowler:有界上下文既有不相关的概念(例如仅存在于客户支持上下文中的支持票据),也有共享的概念(例如产品和客户)。不同的语境可能有完全不同的共同概念模型,这些模型具有在这些多义概念之间映射以进行整合的机制。

在应用程序的每个微服务中,学生和课程的概念可能会非常不同。例如,学生可以定义为在学生信息管理微服务中具有标识符、名字、姓氏和地址的人,并且在CourseAttendance微服务中只有标识符和课程列表。

也就是说,我不会为这些微服务使用共享数据库,而是用所需的实体创建单独的数据库。只有标识符在服务之间“共享”。

在设计数据模型时,试着考虑一下你的过程:当学生注册时,我得到了哪些信息?当他注册一个班级时,是什么?

 类似资料:
  • 我即将开始一个小的个人项目,将公开一个关于我的股票投资组合的API。为了实现这个目标,我必须在一个时间表上从3个API(我的股票经纪人,一个stats API和一个获得股票延长时间价格的API)中获取数据,然后计算某些统计并通过REST服务公开它们,这将是最终的目标。我计划将应用程序分为两个服务。第一个将与外部API通信并将它们的信息存储到数据库中,另一个将计算我需要的统计数据并公开REST服务。

  • 主要内容:1. 使用 Servlet API 向 request 域对象中共享数据,2. 使用 ModelAndView 向 request 域对象中共享数据,3. 使用 Model 向 request 域对象中共享数据,4. 使用 Map 向 request 域对象中共享数据,5. 使用 ModelMap 向 request 对象中共享数据,6. 使用 Servlet API 向 session 域对象中共享数据,7. 使用 Servlet API 向 application 域对象中共享数据

  • 我正在设计一个微服务架构中的评审分析平台。 应用程序如下所示; null null 问题在于,验证服务需要获取site-a的所有评论,应用验证规则并生成错误(如果有的话)。我知道共享数据库模式和实体打破了微服务体系结构。 一个可能的解决方案是 每当验证服务需要对站点进行审查时,它就会请求网关,网关会将请求重定向到审查服务并采取响应。 这种方法的两个可能缺点是 验证服务是否知道网关?是否会带来依赖?

  • 当前体系结构: 问题: 我们在前端和后端层之间有一个两步流程。 null 微服务2(MS2)需要验证I1的完整性,因为它来自前端。如何避免对MS1进行新的查询?最好的办法是什么? 我试图优化的流删除了步骤1.3和2.3 流程1: null 流程2: 2.1用户X已在本地/会话存储中存储了数据(MS2_Data) 2.2用户X在MS1上保留数据(MS2_Data+MS1_Data) 2.3 MS1使

  • 本文向大家介绍微服务中如何实现 session 共享 ?相关面试题,主要包含被问及微服务中如何实现 session 共享 ?时的应答技巧和注意事项,需要的朋友参考一下 在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session ,常见的方案就是 Spring Se

  • 在所有情况下,重要的是,如果允许用户Y访问该公司,微服务本身仍然必须检查是否允许用户Y对该公司进行某种操作。因此,此用户到公司的匹配仅用于确保用户对公司有访问权限。 我并不是真的很喜欢这些方法,因为将消息放入队列(1)意味着每个服务都必须被告知一个更改。使用Zuul验证(2)也不是真正实用的,因为它应该只是一个网关。