首页 > 解决方案 > 如何将与数据库关联的一个后端服务解耦为两个独立的服务?

问题描述

我有一个大的 MySQL 数据库 D_Big,里面有一堆数据。我还有一个服务 S1,它带有从这个数据库读取或写入的 API。例如,一个 API 可能会从数据库中获取一些东西。另一个可能会向数据库写入一行。等等

我还有一个小型辅助数据库 D_Small,S1(并且只有 S1)正在读取和写入该数据库。我想不理会小型辅助数据库,但我想更改从大型 MySQL 数据库 D_Big 访问数据的方式。

我想让它访问大型 MySQL 数据库的唯一方法是通过 API 调用第二个服务 S2,它也可以访问大型数据库。当 S1 想要 D_big 中的数据时,它必须调用 S2 中的 API,这将返回 D_Big 中的数据。因此,我想删除 S1 对 D_Big 的直接依赖。

有什么好的方法可以做到这一点?有哪些提示/建议?最直接的方法似乎是将 S1 中直接访问 D_Big 的每个 API 调用替换为 S2 中相应 API 的 API,该 API 只执行与 S1 直接执行的数据库访问完全相同的数据库访问。例如,假设我们在 S1 中有这些 API:

我只是将这些替换为:

但是,理想映射不是一对一的情况呢?就像您应该组合 API 时一样(例如,S1 中的一个 API 调用 S2 中的两个不同 API 以获取所需的数据,或者 S1 中的两个不同 API 调用 S2 中的相同 API 但具有不同的参数)?

您如何制作一个良好的接口,将两个服务与过去的共享数据源 (D_Big) 分离?假设 S1 和 S2 都使用基于 Java/XML/Spring 的系统通过 API 调用传输数据。

标签: architecturemicroservicesapi-designdecouplingdecouple

解决方案


如果时间允许,这似乎是转向 CQRS 的绝佳机会。使用 CQRS,您将拥有两个 API——一个用于写入,一个用于读取。您不会遇到多个 API 调用的问题,因为 API 代表的是业务理念(即用例),而不是离散的实体访问。您的前端一次只能提交一个用例,因此只有一个 API 调用。在服务器端,您的端点控制器将进行尽可能多的数据库读取或写入,以实现业务理念。

CQRS 是一种出色的架构模式,可以根据需要增长。为了在这里总结,我不得​​不省略很多重要的细节。在开始重构之前,努力了解该模式是值得的。


推荐阅读