我知道这个问题已经被问过,但我有一个不同的场景,我有以下结构:
如您所见,前端 (UI) 将始终调用 GraphQL API 网关微服务,该微服务将根据所需的功能或数据将请求重定向到不同的微服务。我通过绘制 3 个微服务来简化图形,但我们有 30 多个。
当我开始在这个项目中工作时,我注意到 GraphQL API 网关微服务正在重复许多已经在其他微服务上定义的 DTO。因此,这个 GraphQL API 网关微服务充满了用作 DTO 的 Java 类(具有相同的字段、数据类型且没有修改),所以基本上,开发人员一直在做的是从用户微服务复制和粘贴 DTO 并将它们粘贴在 GraphQL API 网关微服务中。所有 30 个微服务 DTO 都遵循相同的模式。此外,跨微服务的 DTO 正在根据需要进行复制粘贴。你可能会说应该没有问题,但是每当微服务需要更改 DTO 结构时,我们需要更改所有其他微服务中的 DTO。
我和我的团队评估的一些方法是:
这是我一直在与团队讨论的事情,大多数团队都希望采用 JSON Schema 方法。但是,我想知道从您的角度来看是否有更有效的方法,我研究了一些方法,例如公开域对象(https://www.baeldung.com/java-microservices-share-dto ),但我认为这不适用于我在这篇文章中谈论的特定案例。
因此,我们将不胜感激任何建议或反馈。提前致谢。
考虑在网关和微服务之间建立松耦合。网关不应该知道域模型并且表现得像一个真正的代理。它不需要了解 DTO。
考虑到这一原则并假设您的网关实现使用 graphql-java,我建议在您的 graphql 网关中保持数据获取器非常通用,并返回一个 Object 或 DataFetcherResult 或 Map
通用的 ServiceDataFetcher 返回一个对象,它调用一个返回 DatafetcherResult 的批加载器。微服务返回的数据用Map
希望这有帮助。