问题描述
我们正在为我们的 SaaS 多租户服务探索 GraphQL 服务器,我们在单个多租户 GraphQL 服务器后面有多个微服务/服务。现在我们的情况是客户可以通过我们首选的机制扩展他们的 GQL 模式;
那么有什么方法可以让我们仍然拥有一个 GQL 服务器,该服务器将通过多个端点为多个 GQL 模式提供服务?
或者我们必须在完全独立的服务器中部署每个客户端的 GQL 服务器 + 模式?
解决方法
您可以拥有由同一个应用程序提供的多个架构。 GraphQL 模式甚至可以在运行时构建。也许你甚至可以使用 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,operationName);
});
上面的所有代码都没有经过测试,我不知道 fastify 几乎足以创建工作代码。但我希望这显示了可能性。