前端在微服务1(MS1)
前端将 I1 和更多信息提交给微服务2
微服务2(MS2)需要验证 I1 的完整性,因为它来自前端。如何避免对MS1的新查询?最好的方法是什么?
我正在尝试优化的流程除去了步骤1.3和2.3
流程1:
流程2:
方法
一种可能的方法是在MS2和MS1之间使用B2B HTTP请求,但是我们将在第一步中复制验证。
另一种方法是将数据从MS1复制到MS2。但是,由于数据量及其易变性,这是禁止的。复制似乎不是一个可行的选择。
我认为一个更合适的解决方案是前端将负责在微服务2上获取微服务1所需的所有信息,并将其传递给微服务2。这将避免所有此类B2B HTTP请求。
问题是微服务1如何信任前端发送的信息。也许使用JWT以某种方式签署来自微服务1和微服务2的数据将能够验证该消息。
注意
每当微服务2需要来自微服务1的信息时,都会执行B2B http请求。 (HTTP请求使用ETAG和Cache Control: max-age)。如何避免这种情况?
体系结构目标
微服务1需要按需来自微服务2的数据,以便能够将MS1_Data和MS2_Data持久存储在MS1数据库上,因此,使用代理的ASYNC方法不适用于此处。
我的问题是是否存在一种设计模式,最佳实践或框架来实现这种推力沟通。
当前体系结构的缺点是每个微服务之间执行的B2B HTTP请求数。即使我使用缓存控制机制,每个微服务的响应时间也会受到影响。每个微服务的响应时间至关重要。此处的目标是归档更好的性能,以及一些如何使用前端作为网关在多个微服务之间分发数据的方法,但使用推力通信。
MS2_Data只是实体SID,例如产品SID或供应商SID,MS1必须使用它来维护数据完整性。
可能的解决方案
这个想法是将网关用作api网关请求处理,该请求将缓存来自MS1和MS2的一些HTTP响应,并将它们用作对MS2 SDK和MS1 SDK的响应。这样,在MS1和MS2之间不直接进行通信(SYNC或ASYNC),也避免了数据重复。
当然,以上解决方案仅适用于跨微服务的共享UUID / GUID。对于完整数据,事件总线用于以异步方式(事件源模式)在微服务之间分发事件和数据。
灵感:https://aws.amazon.com/api-gateway/和https://getkong.org/
相关问题和文档:
最佳答案
从问题和评论中,我了解到您正在尝试重新排列这些块以增强系统性能。如示意图所示,您建议网关先查询microservice2,再查询microservice1,而不是查询microservice2,然后再向microservice1提供来自microservice2的信息。
因此,我没有看到这将如何显着提高系统性能,但是这种改变似乎只是在改变逻辑。
为了解决这种情况,应提高关键微服务2的性能。可以通过分析和优化microservice2软件(垂直扩展)来完成此操作,并且/或者可以引入负载平衡(水平扩展)并在多台服务器上执行microservice2。在这种情况下要使用的设计模式是Service Load Balancing pattern。
关于design-patterns - 微服务之间的数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41640621/