我们应该如何使用微服务构建模型?

时间:2018-02-16 19:42:19

标签: database microservices

例如,如果我有一个使用此API的微服务:

service User {
    rpc GetUser(GetUserRequest) returns (GetUserResponse) {}
}

message GetUserRequest {
    int32 user_id = 1; 
}

message GetUserResponse {
    int32 user_id = 1;
    string first_name = 2;
    string last_name = 3;
}

我认为对于需要用户的其他服务,我将不得不将此user_id存储在具有与该用户ID相关联的数据的所有行中。例如,如果我有一个单独的帖子服务,我会为每个帖子作者存储user_id信息。然后,只要我希望该用户信息在端点中返回数据,我就需要对用户服务进行网络调用。

我会一直想这样做吗?或者在某些时候我想将用户服务中的信息复制到我当前的服务中(不包括保存到像Redis这样的内存数据库中)?

2 个答案:

答案 0 :(得分:1)

您肯定希望避免共享数据库架构/表。有关说明,请参阅此blog。使用专用接口来实现服务之间的依赖。

任何决定"复制"数据到您的其他服务should be made by the service's team,但他们最好有一个真正的理由,以使其有意义。大多数设计不会需要重复数据,因为服务边界应该是特定于域的且不重叠的。在用户ID的情况下,通常可以将它们视为上下文引用,而无需任何关于用户的附加逻辑。

观察到的一种模式是:如果您拥有经过身份验证的端点,则无论如何都需要调用您的身份验证服务 - 为了安全起见 - 同一个调用应该允许您获取所需的任何用户ID信息。

适用于API依赖关系的所有常规最佳做法,例如:关于稳定性,版本控制,弃用等。

答案 1 :(得分:1)

通常从不需要复制完整数据,大多数情况下为了扩展或使微服务更加独立,人们倾向于复制一些或多或少是静态的信息。

例如:在邮政服务中,我可能会复制作者基本信息,如邮政微服务中的名称,因为当有人向邮政微服务请求获取基于某些过滤器的帖子列表时,我不想得到名字每篇文章的作者。

复制数据的副作用是保持其一致性。因此,请确保您的业务确实需要它。