例如,如果我有一个使用此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这样的内存数据库中)?
答案 0 :(得分:1)
您肯定希望避免共享数据库架构/表。有关说明,请参阅此blog。使用专用接口来实现服务之间的依赖。
任何决定"复制"数据到您的其他服务should be made by the service's team,但他们最好有一个真正的理由,以使其有意义。大多数设计不会需要重复数据,因为服务边界应该是特定于域的且不重叠的。在用户ID的情况下,通常可以将它们视为上下文引用,而无需任何关于用户的附加逻辑。
观察到的一种模式是:如果您拥有经过身份验证的端点,则无论如何都需要调用您的身份验证服务 - 为了安全起见 - 同一个调用应该允许您获取所需的任何用户ID信息。
适用于API依赖关系的所有常规最佳做法,例如:关于稳定性,版本控制,弃用等。
答案 1 :(得分:1)
通常从不需要复制完整数据,大多数情况下为了扩展或使微服务更加独立,人们倾向于复制一些或多或少是静态的信息。
例如:在邮政服务中,我可能会复制作者基本信息,如邮政微服务中的名称,因为当有人向邮政微服务请求获取基于某些过滤器的帖子列表时,我不想得到名字每篇文章的作者。
复制数据的副作用是保持其一致性。因此,请确保您的业务确实需要它。