【发布时间】:2021-06-08 22:27:17
【问题描述】:
我们正在为我们的 SaaS 多租户服务探索 GraphQL 服务器,我们在单个多租户 GraphQL 服务器后面有多个微服务/服务。现在我们有一种情况,客户可以通过我们首选的机制扩展他们的 GQL 模式;
那么有什么方法可以让我们仍然拥有一个 GQL 服务器,通过多个端点为多个 GQL 模式提供服务?
或者我们必须将每个客户端的 GQL 服务器 + 架构部署在完全独立的服务器中?
【问题讨论】:
我们正在为我们的 SaaS 多租户服务探索 GraphQL 服务器,我们在单个多租户 GraphQL 服务器后面有多个微服务/服务。现在我们有一种情况,客户可以通过我们首选的机制扩展他们的 GQL 模式;
那么有什么方法可以让我们仍然拥有一个 GQL 服务器,通过多个端点为多个 GQL 模式提供服务?
或者我们必须将每个客户端的 GQL 服务器 + 架构部署在完全独立的服务器中?
【问题讨论】:
您可以让多个模式由同一个应用程序提供服务。 GraphQL Schema 甚至可以在运行时构建。也许你甚至可以使用 fastify GraphQL 中间件。对于更复杂的事情,您可能必须构建自己的中间件,但这完全有可能。
创建具有不同架构的多个端点很容易。你可以简单地挂载更多的 GraphQL 中间件:
for (const customer of customers) {
app.register(graphqlFastify, {
prefix: '/' + customer.name + '/graphql',
graphql: {
schema: customer.schema,
},
});
}
但这可能不能很好地扩展。您可能希望使用带参数的路由,然后自己执行 GraphQL 函数。也许,你可以把它和graphql-helix结合起来:
import { graphql } from 'graphql';
fastify.get('/:username/graphql', (request, reply) => {
const { queryString, variables, operationName } = getGraphQLParams(request);
const schema = getUserSchema(request.username);
return graphql(schema, queryString, rootVal, context, variables, operationName);
});
上面的所有代码都没有经过测试,我对 fastify 的了解不足以创建工作代码。但我希望这表明了可能性。
【讨论】: