问题标签 [apollo-federation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
apollo - Apollo Federation 上的两个微服务之间的突变
我正在使用 Apollo Federation 来处理大量 GraphQL 微服务。我想在关注用户时创建一个通知,所以我需要将一个突变从 UserService 发送到 NotificationService。我怎样才能做到这一点?
先感谢您!
graphql - Apollo federation 可以 2 个服务为相同的方法返回不同的模型
我扩展了一个实体并向其添加了一个字段,例如返回类型 interfaceA 的 fieldA。是否可以让不同的服务返回该类型的不同实现。就像服务一返回 implA 和服务 2 返回 implB 所以当我运行查询时要求类似
联邦可以做这样的事情吗?
apollo - 如何使托管联合脱机工作?
我想按照本指南为 Apollo Federation API 设置 Apollo Studio 。在那里,我偶然发现了以下关于serviceList
网关的句子:
使用托管联合,此信息不再在网关的构造函数中硬编码!相反,网关会定期轮询 Apollo 以获取此信息。
虽然我确实知道这确实有它的好处,但我想知道serviceList
当我没有互联网连接时我是否仍然可以离开那里并测试我的 API。当然,如果没有互联网连接,我将无法使用 Apollo Studio(至少我是这么认为的),但我希望能够在离线时使用我的 API。如果没有,我怎么能使用 Apollo Studio 呢?我想使用性能指标功能。
谢谢你的帮助!
-莫里茨
graphql - 带有批量查询的模式拼接 postgraphile 服务
我有两个目标:
- 在任何有趣的数据库上启动 postgraphile 服务
- 创建一个网关,将这些服务组合成一个仍然高性能的图形(具体来说,我对批量查询感兴趣)
从我所做的阅读来看,似乎有两种主要方法:
我已经尝试过每一个,但我目前正在使用模式拼接方法。假设我有一个服务公开的用户和另一项服务公开的帖子:
现在假设我要查询所有用户并获取每个用户的帖子列表。如果这两者都是由同一个服务实现的,Postgraphile 将足够聪明地将请求批处理在一起。但由于他们在不同的服务中,我需要做一些工作来实现这一点:
- 在网关中,我需要将我的更新
delegateToSchema
为batchDelegateBySchema
- 在 postgraphile 服务上,我需要添加一个
favoritesByUserIds
解析器,它接收用户 ID 列表并返回每个用户的收藏夹
这很好用,但是对于我想要有效查询的类型之间的每一种关系,似乎需要做很多工作——我错过了什么吗?有没有更自然的方法来配置网关/postgraphile 子模式以自动处理查询批处理?
注意:我已经batch: true
为网关和enableQueryBatching: true
postgraphile 服务上的每个子模式进行了配置。
graphql - 在 Apollo GraphQl Federation 中,如何在没有 @external 指令的情况下应用 @requires 逻辑?
我在 Apollo GraphQl Federation 中有三个微服务:服务 A、服务 B 和服务 C。所有服务都有数据库模型,即模型 A、模型 B、模型 C。每个服务都有自己的数据库。
模型 A 有一个字段 bIds 保存 B 模型的 ID 数组。模型 B 有一个字段 cIds 保存 C 模型的 ID 数组。
我编写了一个返回 A 列表的查询。在每个 A 中都有 B 的列表,并且 B 的每个元素都有 C 的列表。
服务 A 的模式(typeDef):
服务 B 的架构:
服务 C 的架构:
很简单。我的问题是我想要模型 A 中的一个字段,它返回模型 C 的列表,其中包含 bList 的所有 cList 元素,如下所示:
derivedCList 的解析器必须从 A 中获取 bList frield。我该如何实现它?@requires 的字段必须是@external。bList 不是外部的。它在服务 B 中有解析器。如果我在服务 B 中使用具有 @external declerative 的 bList 字段扩展类型 A,Apollo 会抛出关于它的异常。
gateway - 联合 JVM 作为网关
我想使用 DGS Federation 示例https://github.com/Netflix/dgs-federation-example ,但我想使用 JVM/Java 作为网关,而不是 Node.js 中的 Apollo 网关。
我在这里看到了 JVM 支持的联合示例:https ://github.com/apollographql/federation-jvm 这是否充当网关?我可以使用它代替 dgs 示例中提到的 Node Apollo 网关吗?我的要求是对这个网关使用 Java,而不是 Node。
请指教。
谢谢你。
apollo-server - Apollo federation:从实现接口的两个独立服务返回实体的字段/解析器
概括
在 GraphQL Apollo 托管联合中,我试图弄清楚一个服务是否可能有一个聚合字段,它返回一个实体数组,两个独立的服务。如,我试图支持这个用例:
两者都在哪里
和
在底层,解析器aggregateField
(位于服务 2 上)向下调用服务 1 到Service1Entity
s。所以这个字段聚合了两个数据集。
示例问题
在我当前的 GraphQL 设置中,我将所有这些都定义在一个服务中:
当我查询我的服务时,它会遇到一个animals
解析器,看起来像:
现在我正在创建一个Dogs
服务。我想Dogs
来自 Dog 服务,而 Cats 来自 Cats 服务。此外,我仍然想支持我的animals
聚合字段,并且我想将它移到Dogs
服务中。
为了支持这一点,我创建了Cat
一个实体,并在两个服务之间复制了接口。为了让 Dog 服务解析Cat
类型,我使用了“引用”来告诉 Dog 服务Cat
住在其他地方。
Cat 服务(用 标记 Cat 为实体@key
):
狗服务:
这个设置的问题是 Dog 服务无法启动,因为这个 GraphQL 错误:
错误:接口字段 Animal.name 应为预期,但 Cat 未提供。
在我的 Dog 服务中,如果我添加一个外部name
字段,如下所示:
然后这两个服务无法组成托管联合:
此数据图缺少有效配置。[dog] Cat.name -> 被标记为@external,但未被@requires、@key 或@provides 指令使用。
我有点觉得我在这里走错了路。是否有可能有一个像这样的聚合字段,其中一个服务可以返回它自己的实体,以及另一个服务的实体?
我们已经有很多客户查询该animals
字段,因此我们试图在不要求客户更改的情况下支持此更改,也就是不重新调整接口的使用。
graphql - 如何在 NestJS 中热重载联邦网关
问题
在联邦嵌套应用程序中,网关收集来自其他服务的所有模式并形成完整的图。问题是,如何在子模式更改后重新运行模式集合?
当前的解决方法
重启网关解决了这个问题,但它似乎不是一个优雅的解决方案。
其他资源
- Apollo 服务器支持托管联合,这基本上恢复了网关和服务之间的依赖关系。可悲的是,我找不到任何与 NestJS 相关的东西。
node.js - GraphQL Federation Nodemon 在重启时中断网关
我正在努力设置我的 GraphQL Federation 开发环境。我有一些服务,我希望服务器在文件更改时自动重新启动。我正在使用 Typescript,因此 Typescript 必须首先转换到 dist 文件夹,然后 nodemon 应该重新启动发生更改的服务。
我在 package.json 文件中创建了以下设置:
这在我运行时开始工作npm run dev
- 帐户和配置文件服务启动,一旦它们运行,网关就会启动。但是,一旦 Typescript 完成转译,nodemon 就会重新启动所有服务和网关,因为 dist 文件夹中的文件已更改。
这是问题所在。nodemon独立重启服务和网关,网关重启速度较快,说明网关先于服务运行,导致如下错误:
每当 nodemon 执行重启时,我不知道如何告诉 nodemon 等到每个服务都重启!
因为现在等待仅适用于npm run dev
. 之后,对于每次更改,nodemon 负责重新启动并且不关心等待。
这是整个火车残骸:
$ npm 运行开发
我希望这是可以理解的,我期待有关如何解决此问题的任何建议。
谢谢,马库斯
apollo-server - 需要多个 ApolloServer 来实现连接到 REST API 的网关?
我正在构建一个 graphql 网关服务,它将多个服务合并到一个图中,使用 Apollo/Node/Express 并遵循 Apollo Federation 模型。最初,我要连接的大部分服务都是 REST 服务。
在我找到的所有示例中(例如此处),我看到网关项目运行多个 ApolloServer 实例,每个 REST 服务一个,另外一个用于网关本身,并使用像concurrent一样的包运行它们。基本上网关项目运行 n+1 ApolloServers。让所有这些服务器运行对我来说似乎很奇怪,但我对整个生态系统还是很陌生。
我不清楚这是否只是为了演示目的,还是这也是它在现实世界中的实施和部署方式?