多租户 GraphQL 服务器

问题描述

我们正在为我们的 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 几乎足以创建工作代码。但我希望这显示了可能性。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...