如何使用 Java + Springboot + GraphQL 处理不同微服务之间的 DTO 定义

问题描述 投票:0回答:1

我知道这个问题已经被问过,但我有一个不同的场景,我有以下结构:

如您所见,前端 (UI) 将始终调用 GraphQL API 网关微服务,该微服务将根据所需的功能或数据将请求重定向到不同的微服务。我通过绘制 3 个微服务来简化图形,但我们有 30 多个。

当我开始在这个项目中工作时,我注意到 GraphQL API 网关微服务正在重复许多已经在其他微服务上定义的 DTO。因此,这个 GraphQL API 网关微服务充满了用作 DTO 的 Java 类(具有相同的字段、数据类型且没有修改),所以基本上,开发人员一直在做的是从用户微服务复制和粘贴 DTO 并将它们粘贴在 GraphQL API 网关微服务中。所有 30 个微服务 DTO 都遵循相同的模式。此外,跨微服务的 DTO 正在根据需要进行复制粘贴。你可能会说应该没有问题,但是每当微服务需要更改 DTO 结构时,我们需要更改所有其他微服务中的 DTO。

我和我的团队评估的一些方法是:

  1. 要么创建一个专门用于 DTO 的公共库,可以被许多项目重用。唯一担心的是这会增加一些“依赖性”并打破“微服务”的想法。此外,我认为这不会完全解决我们遇到的问题,因为我们需要在每个微服务中保持这种依赖关系是最新的。
  2. 使用某种实用程序,如 JSON 模式,将根据需要生成所需的 DTO。

这是我一直在与团队讨论的事情,大多数团队都希望采用 JSON Schema 方法。但是,我想知道从您的角度来看是否有更有效的方法,我研究了一些方法,例如公开域对象(https://www.baeldung.com/java-microservices-share-dto ),但我认为这不适用于我在这篇文章中谈论的特定案例。

因此,我们将不胜感激任何建议或反馈。提前致谢。

java spring-boot graphql microservices dto
1个回答
0
投票

考虑在网关和微服务之间建立松耦合。网关不应该知道域模型并且表现得像一个真正的代理。它不需要了解 DTO。

考虑到这一原则并假设您的网关实现使用 graphql-java,我建议在您的 graphql 网关中保持数据获取器非常通用,并返回一个 Object 或 DataFetcherResult 或 Map 而不是 DTO 或 POJO。例如,您可以查看使用此模式的GraphQuilt Gateway

通用的 ServiceDataFetcher 返回一个对象,它调用一个返回 DatafetcherResult 的批加载器。微服务返回的数据用Map

表示

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.