我是微服务新手,但我理解的一件事(至少作为原则)是每个微服务应该是独立的。
微服务之间的交互只能通过定义良好的接口进行,最好是 API,而不是共享数据库。
假设我有一个简单的网络应用程序,它向公共用户显示一些内容。内部用户(管理员)访问内部 Web 界面并将内容写入数据库表。如果他们“批准”,表格的全部内容就可以公开。
现在,如果没有微服务,我可以做很多事情。
例如,我可以让两个服务都指向同一个表并添加“公共”标志。
或者我可以设置两张表,一张“公共”,一张“私有”,并确保审批过程将私有表复制到公共表中。
但所有这些解决方案都意味着这两个服务访问相同的数据库,或者至少它们通过 SQL 查询而不是 REST API 进行交互。
我很想将所有内容捆绑在一个微服务中。
但感觉不对:公共服务在可扩展性等方面可能有不同的要求。如果“内部”网站停止工作,也不一定会破坏现有的公共应用程序。那么为什么要耦合这些组件呢?
这个示例可能过于具体,但我怀疑潜在的问题适用于许多用例。
单一服务解决方案
实现管理数据的服务。数据有一个字段
boolean public
。只有具有给定角色的用户才能调用创建/更新/删除数据的端点。查询数据的端点对任何人开放,但只有具有给定角色的用户才能看到不公开的数据。如果用户没有该角色,只需添加 AND public=true
即可实现此目的。
具有两种服务和消息传递的解决方案
实施管理数据的私有服务。数据有一个字段
boolean public
。只有具有给定角色的用户才能调用该服务来查询/创建/更新/删除数据。每次修改数据时,服务都会发出一条消息。
实现一个公共服务,该服务使用私有服务发出的消息,以便将所有标记为公共的数据写入其数据库。如果公共数据可以再次变为私有,请不要忘记也实施该案例。这项公共服务只有查询数据的端点,对所有人开放。