所以让我们说这些是我的表:
users
id(pk) | username
channels
id(pk) | title
members
user_id(pk, fk) | channel_id(pk, fk)
messages
id(pk) | channel_id(fk) | sender_id(fk) | text | created_at
从我读到的关于微服务的内容来看,它们应该能够自己部署,并拥有自己的数据库。
我认为这意味着我会让这些微服务各自运行自己的SQL实例:
用户微服务
users
id(pk) | username
Messaging Microservice
channels
id(pk) | title
members
user_id(pk, fk) | channel_id(pk, fk)
messages
id(pk) | channel_id(fk) | sender_id(fk) | text | created_at
我读到这是为了公开这些微服务,我应该为每一个提供某种REST / GraphQL API,因此Messaging Microservice会有getChannel()
,createMessage()
等等。
所以我的问题是,当我需要访问另一个微服务中的数据时,我应该怎么做,基本上他们应该如何相互交谈?例如,在我的前端说我输入聊天频道并想要显示其消息。如果我执行getChannelMessages()
,则会返回
{
id: 1,
channel_id: 32,
sender_id: 48,
text: 'hello world',
created_at: some unix time
}
此时,我不知道我需要显示谁sender_id: 48
。从那里开始,我是否应该使用getUser(sender_id)
为每条消息或其他内容调用用户微服务的API?
如果用户被删除怎么办?感觉我必须做一些额外的工作才能进入其他微服务,删除所有消息并将其从频道中删除。事情不会失去同步吗?
最后,如果我只有一个前端,这似乎有点矫枉过正吗?我是否应该有一个与每个微服务交谈的前端,或者我的微服务是否也应该拥有自己的前端?也许如果这是一个网络应用程序,我可以为每个前端或其他东西拆分URL,但多个前端对我来说在移动应用程序的上下文中没有意义。
无法将所有这些放在一起,并希望得到任何建议和澄清。