假设我有2个微服务:Service1和Service2。他们每个人都有自己的数据库。 Service1具有EntityA,Service2具有EntityB
EntityA {
Long id;
//other fields
EntityB entity;
}
EntityB{
//other fields
}
我正在使用Spring的RestTemplate来检索和保存数据。问题是:从Service1的数据库中检索EntityA时,我没有EntityB的数据,因为它们保存在Service2的db中,我知道我应该通过RestTemplate进行rest调用以从Service2的数据库中检索EntityB,但是两者之间的关系又如何呢?实体-即使EntityA的字段大多数时候都为null(id除外),但EntityA是否仍应具有整个EntityB对象?我想念什么? 先感谢您。
答案 0 :(得分:2)
从技术角度来看,可以通过API Gateway解决问题。
简而言之,您应该定义一个新的微服务,例如gateway service
,它将由您的API客户端调用。 gateway service
将会:
Service1
以获得Entity1
的{{1}}和id
Entity2
以获取Service2
。Entity2
内设置Entity2
值)。设计时要记住的两件事:
Entity1
和Service1
之间的数据模型依赖性,从而允许这两个服务独立发展)。请参见以下代码段:
Service2
天气// In Service1
EntityA {
Long bId;
}
// In Service2
EntityB{
}
// In Gateway
Response {
EntityA a;
EntityB b;
}
的引用应参考Entity1
,这并不取决于数据的分发方式,而取决于业务需求。如果您将使用一个整体应用程序,并且在这种情况下,Entity2
可以引用Entity1
,那么在微服务环境中这样做仍然有意义。
答案 1 :(得分:0)
我想到的两个解决方案既简单又复杂。
重复数据
在MS之间,通常有一个高度可用的pub-sub或消息队列集群系统。将EntityB
保存在Service2
中后,您会将事件发送到队列或pub-sub系统中。 Service1
可以订阅该特定事件,并将有关EntityB
的信息存储在其自己的数据库中。
组域逻辑
也许Service1
和Service2
的域之间的相关性太大。
在这种情况下,您可能希望将服务分组到一个服务中。
答案 2 :(得分:0)
我遇到了这种模式,我认为它对您的情况很有用。
该模式称为CQRS(命令查询责任隔离,一口气)
该模式假设您已经建立了一个事件源系统,由于您正在使用微服务,因此具有很大的变化。
更改 Service1 中的任何 EntityA 时, Service1 会发布事件。 Service2 也是如此,当任何 EntityB 更改时,它也会发布事件。
然后,我们有 Service3 ,它订阅了来自 Service1 和 Service2 的事件,将数据汇总并存储在其本地数据库中。现在,您只需调用 Service3 即可从 Service1 和 Service2 中获取汇总数据。
当然,这种模式还具有最终一致性的缺点,但在某些情况下实际上可能是最合适的。
这个想法主要来自这里:https://microservices.io/patterns/data/cqrs.html。 我还将至少从这里阅读“何时使用此模式”部分:https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs