Rest “微服务”;加入;不同数据库中的表和数据复制

Rest “微服务”;加入;不同数据库中的表和数据复制,rest,microservices,Rest,Microservices,我试图实现实体之间的数据连接 我有两个独立的微服务,它们可以使用事件(rabbitmq)相互通信。所有请求当前都在api网关中加入 假设我的第一个服务是UserService,第二个服务是ProductService 通常,为了获得产品列表,我们会执行一个类似于/products的get请求,当我们想要创建一个产品时,我们会执行一个类似于/products的POST请求 产品架构如下所示: { title: 'ProductTitle`, description: 'ProductDescr

我试图实现实体之间的数据连接

我有两个独立的微服务,它们可以使用事件(rabbitmq)相互通信。所有请求当前都在api网关中加入

假设我的第一个服务是
UserService
,第二个服务是
ProductService

通常,为了获得产品列表,我们会执行一个类似于
/products
get
请求,当我们想要创建一个产品时,我们会执行一个类似于
/products
POST
请求

产品架构如下所示:

{
 title: 'ProductTitle`,
 description: 'ProductDescriptio',
 user: 'userId'
 ...
}
{
 username: 'UserUsername`,
 email: 'UserEmail'
 ...
}
用户架构如下所示:

{
 title: 'ProductTitle`,
 description: 'ProductDescriptio',
 user: 'userId'
 ...
}
{
 username: 'UserUsername`,
 email: 'UserEmail'
 ...
}
因此,在创建产品或获取产品列表时,我们不会有关于用户的一些详细信息,如
电子邮件
用户名

我试图实现的是在创建或查询产品列表时获取用户详细信息以及用户详细信息,如下所示:

[
 {
  title: 'ProductTitle`,
  description: 'ProductDescriptio',
  user: {
   username: 'UserUsername`,
   email: 'UserEmail'
  }
 }
]
我可以通过REST
GET
请求
UserService
,获取每个产品的用户详细信息

但我担心的是,如果
UserService
出现故障,产品将不会有用户详细信息

还有什么方法可以
连接
表?除了调用RESTAPI之外

我已经读过关于
数据复制
,但这里还有另一个问题,我们在创建新产品时,如何在
产品服务
中保留用户详细信息的副本


如果他没有创建产品,我通常不想将用户详细信息的副本保存到
ProductService
。我还可以向其他服务发送事件。

事实上,我们正在使用数据复制,以使每个微服务更具弹性(即使另一个服务关闭,它们也有机会继续工作)

这可以通过多种方式实现,例如,在您的情况下,当用户被创建、删除等时,让ProductService监听UserSevice发送的事件。 或者UserService可能有一个提要,ProductService每隔n分钟读取一次,或者标记提要上最后一次读取的位置。等等

设计服务时有很多事情要考虑,这取决于你的系统任务。例如,您必须始终评估耦合的影响-当另一个服务关闭时,一个服务无法工作是否正常。例如,一项服务有多重要,以及当它无法工作时,对其他服务的影响如何

如果您不想保留不需要的数据副本,您可以读取与产品相关的用户数据。如果使用不在数据集中的用户创建了新产品,那么您将从UserService获得它。这将给您一个更强的耦合,然后复制所有内容,但一个较弱的耦合,然后根本不复制任何数据


同样,这取决于您的系统的设计目的和需要实现的目标。

方法1-数据复制

数据复制是无害的,只要它使您的服务独立且具有弹性。但过多的数据复制也不好。微服务并不适合每种情况,因此我们也必须在某些方面做出妥协

方法2-事件来源和物化视图

通常,如果数据由多个服务组成,则应考虑事件源和物化视图。这些视图是预编译的一次性数据表,可以使用来自不同数据服务的已发布事件进行更新。假设您的“用户”服务发布了事件,那么如果发布了另一个相关事件,您将更新您的视图。您可以添加/更新物化视图等等。这些视图可以保存在缓存中以便快速检索,并且可以查询以获取数据。这种模式增加的复杂性很小,但具有很高的可扩展性

事件源基本上是保存所有事件并重播事件以达到系统特定状态的存储。通常,我们从事件存储创建物化视图

比如说,您有一个事件存储,您可以在其中保存所有已发布的事件。同时,您也在更新物化视图。如果您想要查询数据,那么您将从物化视图中获取数据。因为物化视图是一次性的,所以总是可以从事件存储中生成。假设缓存中的物化视图已损坏,则可以通过重播事件从事件存储中完全重新生成视图。假设如果我错过了缓存命中,我仍然可以通过重播事件从事件存储中获取数据。您可以在以下链接中找到更多信息

,