加入我们,从10月8日至10日在纽约市,了解关于 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入我们参加2024年纽约市的 GraphQL 大会
文档
免费开始

路由配置

通过环境变量、命令行选项和YAML配置一个路由


了解如何自定义您的行为 使用环境变量、命令行命令和选项以及 YAML 文件配置。

环境变量

如果您使用的是 GraphOS 路由器托管联邦,请在启动命令中设置以下环境变量:

APOLLO_KEY="..." APOLLO_GRAPH_REF="..." ./router
环境变量描述
APOLLO_GRAPH_REF

图和 指定的 ,从其中路由器获取其 (例如,docs-example-graph@staging)。

必须当使用 托管联邦时,除非使用 离线许可证运行路由器。

APOLLO_KEY

路由器用于在获取其 时与 进行身份验证的 graph API 键

必须当使用 托管联邦时,除非使用 离线许可证运行路由器。

命令行选项

在当前工作目录中安装 Apollo Router Core之后,您可以运行以下示例命令来启动router:

./router --config router.yaml --supergraph supergraph-schema.graphql

本参考文档列出了并描述了router二进制支持的选项。在指示的地方,其中一些选项也可以通过环境变量提供。如果以两种方式提供了一个选项,则命令行值具有优先权。

选项 / 环境变量描述
-s / --supergraph

APOLLO_ROUTER_SUPERGRAPH_PATH, APOLLO_ROUTER_SUPERGRAPH_URLS

router的supergraph规范。指定为绝对或相对路径(-s / --supergraph <supergraph_path>, 或 APOLLO_ROUTER_SUPERGRAPH_PATH),或以逗号分隔的URL列表(APOLLO_ROUTER_SUPERGRAPH_URLS).

💡APOLLO_ROUTER_SUPERGRAPH_URLS中避免嵌入令牌,因为URL可能会出现在日志消息中。

设置此选项将禁用Apollo Uplink从获取最新的supergraph规范进行轮询。

有关如何使用 Rover CLI编写你的的信息,请参阅Federation快速入门教程

必需如果您不使用管理联邦。如果使用管理联邦,在遵循高级部署工作流程时可能需要设置此选项。

-c / --config

APOLLO_ROUTER_CONFIG_PATH

到router可选的YAML配置文件的绝对或相对路径。

--dev

⚠️ 不要在生产环境中设置此选项!

如果设置,router以开发模式运行,以帮助进行本地开发。

了解更多关于开发模式的信息。

--hr / --hot-reload

APOLLO_ROUTER_HOT_RELOAD

如果设置,router将监视其配置文件以及通过--supergraph提供的任何文件的变化,并在不中断的情况下自动重新加载它们。此设置仅影响提供给router的本地文件。从GraphOS通过(并通过Uplink提供)提供的和配置始终自动加载,不受此设置的影响。

--log

APOLLO_ROUTER_LOG

日志级别,指示要包含的最严重的日志消息类型。按照详细程度升序排列,可以是以下之一:off, error, warn, info, debug, 或 trace.

默认值是 info.

--license

APOLLO_ROUTER_LICENSE_PATH, APOLLO_ROUTER_LICENSE

离线 GraphOS 。当从 GraphOS 断开连接时,启用企业路由器功能。

离线许可证可以指定为许可证文件的绝对或相对路径( --license <license_path>APOLLO_ROUTER_LICENSE_PATH),或指定为许可证的字符串化内容(APOLLO_ROUTER_LICENSE).

如果不设置,路由器将从 GraphOS 通过 Apollo Uplink 获取企业许可证.

有关获取离线许可证和配置路由器的信息,请参阅 离线企业许可证.

APOLLO_UPLINK_ENDPOINTS

如果使用 托管联合,则路由器应轮询以下 Apollo Uplink URL 以获取最新的配置。几乎所有托管路由器实例应该 省略此选项,以使用默认的 Uplink URLs。

如果您指定了多个 URL,请用逗号(没有空格)分隔。

有关默认行为和可能值的信息,请参阅 Apollo Uplink

APOLLO_UPLINK_POLL_INTERVAL

轮询 Apollo Uplink 之间的时间。

默认值是 10s(十秒),这也是允许的最小值。

APOLLO_UPLINK_TIMEOUT

发送到 Apollo Uplink 的每次轮询的请求超时。

默认值是 30s(三十秒)。

--anonymous-telemetry-disabled

APOLLO_TELEMETRY_DISABLED

如果设置,则禁用于向 Apollo 发送匿名使用信息。

--listen

APOLLO_ROUTER_LISTEN_ADDRESS

如果设置,路由器的监听地址。

-V / --version

如果设置,路由器打印其版本号,然后退出。

--schema

已弃用—请使用 ./router config schema 取而代之。

如果设置,路由器将打印其完全支持的配置格式的 JSON 模式表示,然后退出。

开发模式默认值

⚠️ 注意

在生产环境中不要设置 --dev 选项。如果您想在生产环境中复现任何特定开发模式的功能,请修改您的YAML 配置文件中的对应设置。

设置 --dev 标志与以下配置选项运行 ./router --hot-reload 相当:

sandbox:
enabled: true
homepage:
enabled: false
supergraph:
introspection: true
include_subgraph_errors:
all: true
plugins:
# Enable with the header, Apollo-Expose-Query-Plan: true
experimental.expose_query_plan: true

config 子命令

GraphOS 路由器Apollo 路由器核心 提供了一组用于与其配置交互的子命令。您可以使用以下语法运行这些子命令:

./router config schema
./router config upgrade <path-to-config-file.yaml>
子命令描述
schema

打印出路由器支持的完整配置格式的 JSON 模式表示。

使用此模式来为您的文本编辑器的配置意识启用。

upgrade

接受为 上一个版本的路由器创建的配置文件,并将其输出为当前版本的相应配置。

有关详细信息,请参阅更新您的路由器配置

YAML 配置文件

GraphOS 路由器Apollo 路由器核心 通过--config 选项接收一个可选的 YAML 配置文件:

./router --config router.yaml

此文件使您能够自定义路由器行为的多方面,具体内容在下述子章节中介绍。

如果您将--hot-reload 标志传递给router 命令,当其配置文件被修改时,路由器将自动重新启动。

💡 提示

通过使用路由器的配置模式配置文本编辑器,使您的文本编辑器能够验证您的路由器 YAML 配置文件的格式和内容。

监听地址

默认情况下,路由器启动一个监听在127.0.0.1:4000的 HTTP 服务器。您可以通过设置supergraph.listen来指定不同的地址:

IPv4

router.yaml
supergraph:
# The socket address and port to listen on
listen: 127.0.0.1:4000

IPv6

router.yaml
supergraph:
# The socket address and port to listen on.
# Note that this must be quoted to avoid interpretation as an array in YAML.
listen: '[::1]:4000'

Unix socket

注意

在 Windows 上不支持在 Unix socket 上监听。

router_unix.yaml
supergraph:
# Absolute path to a Unix socket
listen: /tmp/router.sock

端点路径

默认情况下,router启动了一个 HTTP 服务器,该服务器在路径 /处暴露了 POST/GET 端点。

您可以通过设置 supergraph.path 来指定不同的路径:)

router.yaml
supergraph:
# The path for GraphQL execution
# (Defaults to /)
path: /graphql

路径必须以 / 为开头。

支持路径参数和通配符。例如

  • /:my_dynamic_prefix/graphql 会匹配 /my_project_a/graphql/my_project_b/graphql
  • /graphql/* 会匹配 /graphql/my_project_a/graphql/my_project_b
  • /g* 会匹配 /graphql, /gateway/graphql/api

注意

router 不支持 在路径中间使用通配符 (例如,/*/graphql)。相反,请使用路径参数 (例如,/:parameter/graphql)。

检查

默认情况下,router 解析 查询。您可以像这样启用 introspection:)

router.yaml
# Do not enable introspection in production!
supergraph:
introspection: true

调试

落地页面

router 可以向访问其 的浏览器提供以下任何一种落地页面:

  • 一个基本的落地页面,显示示例 curl 命令(默认)

    router.yaml
    # This is the default behavior. You don't need to include this config.
    homepage:
    enabled: true
  • 落地页面

    router.yaml
    homepage:
    enabled: false
  • Apollo 沙箱,它使您能够使用探索器探索您的模式并对其执行操作。

    请注意使用沙箱所需的其他配置

    router.yaml
    sandbox:
    enabled: true
    # Sandbox uses introspection to obtain your router's schema.
    supergraph:
    introspection: true
    # Sandbox requires the default landing page to be disabled.
    homepage:
    enabled: false

    ⚠️ 注意

    不要在生产环境中启用沙箱。 沙箱需要启用 introspection,这在生产环境中是强烈不建议的。

Subgraph 路由 URL

默认情况下,router 从您提供的组合 supergraph 模式 获得每个 subgraph 的路由 URL。在大多数情况下,不需要额外的配置。URL 可以用于通过 HTTP 和 HTTPS 网络访问 subgraph,或者具有以下形状用于 Unix socket 使用:unix:///path/to/subgraph.sock

然而,如果您需要重写特定子图的路由URL(例如,处理网络拓扑的变化),您可以使用override_subgraph_url选项来做到这一点:

override_subgraph_url:
organizations: http://127.0.0.1:8080
accounts: "${env.ACCOUNTS_SUBGRAPH_HOST_URL}"

在这个例子中,organizations 子图URL被重写,指向 https://127.0.0.1:8080,而 accounts 子图URL被重写,以使用变量展开指向一个新URL。超级图模式中指定的URL将被忽略。

任何在override_subgraph_url 中省略的子图将继续使用在超级图模式中指定的路由URL。

如果您需要在运行时根据每个请求重写子图URL,您可以使用请求自定义层级中的 SubgraphService

缓存

默认情况下,路由器将以下数据存储在内存缓存中以提高性能:

  • 生成的查询计划
  • 响应

您可以为生成的 (但不是响应)配置某些缓存行为。有关详情,请参阅路由器的内存缓存

如果您有GraphOS企业计划:

  • 您可以为使用Redis作为后端的多实例路由器配置一个分布式缓存,以便这些路由器实例可以共享缓存值。有关详情,请参阅GraphOS路由器的分布式缓存
  • 您可以为使用Redis作为后端的实体缓存进行配置,以便客户端查询能够检索分散在子图响应中的缓存的数据。有关详情,请参阅GraphOS路由器中的子图实体缓存

查询计划池
自从1.44.0

此功能是 实验性的. 您的问题和反馈备受重视 不要犹豫,随时与您的阿波罗联系人取得联系. 加入 GitHub 上关于查询计划池的讨论

您可以通过配置并行查询计划来提高 router's 的性能。

默认情况下,查询计划 一次计划一个操作。它在一个操作完成之前不会计划下一个操作。当操作需要很长时间才能计划,从而妨碍查询计划处理其他操作时,这种串行计划可能导致问题。

为了解决此类阻塞场景,您可以选择启用并行 查询计划。在 router.yaml 中进行配置,使用supergraph.query_planning.experimental_parallelism

router.yaml
supergraph:
query_planning:
experimental_parallelism: auto # number of available cpus

实验并行性的值是 query_planner_pool 中的查询计划器的数量。 query_planner_pool 是预分配的查询计划器集合, router 可以从中使用来计划操作。 池的总数是并行运行的最大查询计划器数量,因此也是可以同时处理的最大操作数量。

实验并行性的有效值:

  • 1
  • 特殊值 auto,设置查询计划器的数量等于 router 主机上的可用 CPU 数量

实验并行性的默认值是1

在实践中,您应该根据从 router 收集的指标和基准来调整 experimental_parallelism

内省响应缓存
自从1.51.0

内省响应目前由查询计划生成,因此它们执行成本很高,并且 router 将它们存储在其查询计划器缓存中。不幸的是,它们可能会充满缓存,因此在我们将内省执行移出之前,有一个选项可以停用响应缓存。

router.yaml
supergraph:
query_planning:
legacy_introspection_caching: false

此功能是 实验性。您的疑问和反馈非常受欢迎。不要犹豫,随时与您的阿波罗联系人取得联系.

从v1.49.0版本开始,路由器支持增强的操作签名标准化。 。Apollo的旧操作签名算法删除了关于某些的信息,例如输入对象和。这种删除意味着一些操作可能有相同的标准化签名,尽管它们是不同的操作。

增强的标准化结合输入类型别名来生成签名。它还包括其他改进,这些改进使得两个仅在细微之处有所不同的操作具有相同签名的可能性更大。

router.yaml中使用telemetry.apollo.experimental_apollo_signature_normalization_algorithm选项配置增强的操作签名标准化:

router.yaml
telemetry:
apollo:
experimental_apollo_signature_normalization_algorithm: enhanced # Default is legacy

一旦启用此配置,带有增强签名的操作可能会在GraphOS Studio中出现与之前不同的操作ID。

输入类型

增强签名包括输入结构体,同时仍会掩盖任何实际值。旧签名将输入对象类型替换为{}

以下是一个示例操作:

query InlineInputTypeQuery {
inputTypeQuery(
input: {
inputString: "foo",
inputInt: 42,
inputBoolean: null,
nestedType: { someFloat: 4.2 },
enumInput: SOME_VALUE_1,
nestedTypeList: [ { someFloat: 4.2, someNullableFloat: null } ],
listInput: [1, 2, 3]
}
) {
enumResponse
}
}

标准化算法生成的以下签名:

query InlineInputTypeQuery {
inputTypeQuery(input: {}) {
enumResponse
}
}

增强标准化算法生成的以下签名:

query InlineInputTypeQuery {
inputTypeQuery(
input: {
inputString: "",
inputInt: 0,
inputBoolean: null,
nestedType: {someFloat: 0},
enumInput: SOME_VALUE_1,
nestedTypeList: [{someFloat: 0, someNullableFloat: null}],
listInput: []
}
) {
enumResponse
}
}

别名

增强签名包括在操作中使用到的任何别名。旧签名完全删除别名,这意味着如果同一个字段使用了多个别名,签名可能无效。

以下是一个示例操作:

query AliasedQuery {
noInputQuery {
interfaceAlias1: interfaceResponse {
sharedField
}
interfaceAlias2: interfaceResponse {
... on InterfaceImplementation1 {
implementation1Field
}
... on InterfaceImplementation2 {
implementation2Field
}
}
inputFieldAlias1: objectTypeWithInputField(boolInput: true) {
stringField
}
inputFieldAlias2: objectTypeWithInputField(boolInput: false) {
intField
}
}
}

标准化算法生成的以下签名:

query AliasedQuery {
noInputQuery {
interfaceResponse {
sharedField
}
interfaceResponse {
... on InterfaceImplementation1 {
implementation1Field
}
... on InterfaceImplementation2 {
implementation2Field
}
}
objectTypeWithInputField(boolInput: true) {
stringField
}
objectTypeWithInputField(boolInput: false) {
intField
}
}
}

增强标准化算法生成的以下签名:

query AliasedQuery {
noInputQuery {
interfaceAlias1: interfaceResponse {
sharedField
}
interfaceAlias2: interfaceResponse {
... on InterfaceImplementation1 {
implementation1Field
}
... on InterfaceImplementation2 {
implementation2Field
}
}
inputFieldAlias1: objectTypeWithInputField(boolInput: true) {
stringField
}
inputFieldAlias2: objectTypeWithInputField(boolInput: false) {
intField
}
}
}

扩展引用报告
自从1.50.0

此功能是 实验性。您的疑问和反馈非常受欢迎。不要犹豫,随时与您的阿波罗联系人取得联系.

此功能仅在以下计划中可用:  GraphOS企业版计划.
您可以通过注册免费 企业试用.

从 v1.50.0 版本开始,您可以配置路由器来报告枚举和输入对象引用,以实现增强的洞察和操作检查。Apollo 的传统引用报告不包括枚举值和输入对象字段的数据,这意味着您无法在GraphOS Studio中查看枚举和输入对象字段的使用情况。传统的报告也可能导致操作检查不准确

router.yaml中配置扩展引用报告,使用telemetry.apollo.experimental_apollo_metrics_reference_mode选项,如下所示:

router.yaml
telemetry:
apollo:
experimental_apollo_metrics_reference_mode: extended # Default is legacy

配置效果时间

一旦您配置了扩展引用报告,您就可以在后续的所有操作中,在 GraphOS Studio 中查看枚举值和输入 字段的使用情况,以及对象 字段使用情况

配置扩展引用报告会自动启用增强操作检查,尽管您不会立即看到操作检查行为的变化。

这种延迟是因为操作检查依赖于历史操作数据。为了区分真正未使用的数据和只是未在传统数据中报告的数据,增强检查需要一些启用扩展引用报告的操作。

增强操作检查

得益于扩展引用报告,操作检查可以更准确地标记枚举值和输入对象字段的变化问题。以下表显示了基于传统引用报告的标准操作检查与基于扩展引用报告的增强检查之间的差异。

标准检查行为
(传统引用报告)
增强检查行为
(扩展引用报告)
枚举值删除
删除任何枚举值被认为是破坏性更改,如果任何操作使用了该枚举。仅在历史操作使用了被删除的特定枚举值下,删除枚举值才会被认为是破坏性更改。
输入对象字段默认参数更改
更改或删除默认参数通常被认为是破坏性更改,但更改或删除输入对象字段的默认值则不是。

更改或删除输入对象字段的默认值被认为是破坏性更改。您可以通过配置检查以忽略默认值更改

可空输入对象字段删除
删除可空输入对象字段始终被认为是破坏性更改。在历史操作中存在可空字段的情况下,删除可空输入对象字段才会被认为是破坏性更改。如果历史操作中始终省略该字段,其删除不会被认为是破坏性更改。
更改可空输入对象字段为非可空
将可空输入对象字段更改为非可空被认为是破坏性更改。在历史操作中有空值的情况下,将可空输入对象字段更改为非可空被认为是破坏性更改。如果历史操作中该字段始终是非空的,则更改它为非可空不会被认定为破坏性更改。

注意

首次开启扩展引用报告时,您不会立即看到检查行为的变化。了解更多。

使用持久查询进行白名单管理

您可以通过保持 的安全,通过 GraphOS Router 维护一个 (PQL),这是一个由您的一方应用程序创建的操作白名单。与 (APQ)相反,其中操作会自动被缓存,操作必须在 PQL 中预先注册。一旦配置完成,路由器就会检查传入请求是否与 PQL 相匹配。

有关更多信息,请参阅 使用持久查询进行白名单管理

HTTP头部规则

有关如何向子图发送HTTP头部的信息,请参阅 发送HTTP头部到子图

流量整形

要配置客户端、和子图之间的流量形状,请参阅 路由器的流量整形

CORS(跨源资源共享)

有关在路由器中配置CORS的信息,请参阅 路由器中的CORS配置

延迟支持

有关在路由器中支持 @defer 的信息,请参阅 路由器的@defer支持

查询批处理支持

有关 GraphOS Router 对查询批处理的支持信息,请参阅 GraphOS Router 对查询批处理的支持

订阅支持

有关在 GraphOS Router 中实现 GraphQL 订阅的信息,请参阅 GraphOS Router 中的 GraphQL 订阅

授权支持

JWT身份验证

要启用和配置JWT身份验证,请参阅 GraphOS Router 中的 JWT 身份验证

CORS(跨站请求伪造)预防

要配置CORS防止,请参阅 路由器中的CORS防止

子图身份验证

要配置使用 AWS SigV4 的子图身份验证,请参阅 配置示例

外部协同处理

参见GraphOS Router中的外部协处理器

遥测和监控

路由器支持标准自定义仪器,从其请求和响应处理管道收集遥测数据以生成日志、指标和跟踪以导出。

参见路由器遥测概述

TLS

路由器支持TLS进行客户端和子图端的认证加密通信。如果子图URL以https://开头,将在子图端自动工作。

TLS支持在tls部分配置,对于客户端端是位于supergraph键下,对于子图端位于subgraph键下,可以针对所有子图进行配置,并覆盖单个子图设置。

支持的TLS版本和算法列表是静态的,无法配置。

支持的TLS版本

  • TLS 1.2
  • TLS 1.3

支持的密码套件

  • TLS13_AES_256_GCM_SHA384
  • TLS13_AES_128_GCM_SHA256
  • TLS13_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256

支持密钥交换组

  • X25519
  • SECP256R1
  • SECP384R1

TLS终止

客户端可以直接通过HTTPS连接到路由器,无需在任何中介中终止TLS。您可以在tls配置部分中配置此操作:

tls:
supergraph:
certificate: ${file./path/to/certificate.pem}
certificate_chain: ${file./path/to/certificate_chain.pem}
key: ${file./path/to/key.pem}

要在配置中将文件路径以Unix风格进行扩展,您可以参考变量扩展指南中的示例。

路由器期望在certificate_chain值中引用的文件是几个PEM证书的连接,形成一个单一的文件(与Apache TLS配置中常见的情况一样)。

覆盖子图的证书颁发机构

路由器使用系统提供的证书颁发机构列表来验证与子图的TLS连接。您可以使用全球和每个子图设置的组合覆盖此列表:

tls:
subgraph:
# Use these certificate authorities unless overridden per-subgraph
all:
certificate_authorities: "${file./path/to/ca.crt}"
# Override global setting for individual subgraphs
subgraphs:
products:
certificate_authorities: "${file./path/to/product_ca.crt}"

路由器期望在certificate_chain值中引用的文件是几个PEM证书的连接,形成一个单一的文件(与Apache TLS配置中常见的情况一样)。

您只能通过路由器的配置来配置这些证书,因为使用SSL_CERT_FILE也覆盖了发送遥测和与Apollo Uplink通信的证书。

如果子图正在显示自签名证书,则必须使用适当的文件扩展名并禁用basicConstraints来生成它。您可以从证书签名请求使用以下命令行命令生成它,在此示例中,为server.csr

openssl x509 -req -in server.csr -signkey server.key -out server.crt -extfile v3.ext

您可以生成一个v3.ext扩展文件,如下所示:

subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
# this has to be disabled
# basicConstraints = CA:TRUE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign
subjectAltName = DNS:local.apollo.dev
issuerAltName = issuer:copy

注意

请确保将subjectAltName字段更改为您子图的名称。

这将生成名为server.crt的文件,该文件可在certificate_authorities中使用。

TLS客户端身份验证用于子图请求

router支持与子图的相互TLS身份验证(mTLS)。这意味着它可以使用证书链和加密密钥来验证自身。配置如下:

tls:
subgraph:
# Use these certificates and key unless overridden per-subgraph
all:
client_authentication:
certificate_chain: ${file./path/to/certificate_chain.pem}
key: ${file./path/to/key.pem}
# Override global setting for individual subgraphs
subgraphs:
products:
client_authentication:
certificate_chain: ${file./path/to/certificate_chain.pem}
key: ${file./path/to/key.pem}

Redis TLS配置

对于Redis TLS连接,您可以通过配置tls在您的router's YAML配置文件来设置客户端证书或覆盖根证书颁发机构。例如:

apq:
router:
cache:
redis:
urls: [ "rediss://redis.example.com:6379" ]
tls:
certificate_authorities: ${file./path/to/ca.crt}
client_authentication:
certificate_chain: ${file./path/to/certificate_chain.pem}
key: ${file./path/to/key.pem}

请求限制

GraphOS Router支持强制执行以下三种类型的请求限制,以增强安全性:

  • 网络限制
  • 基于词法、解析器的限制
  • 基于语义和操作的限制(这是一个企业功能))

router会拒绝任何违反这些限制之一的所有请求。

router.yaml
limits:
# Network-based limits
http_max_request_bytes: 2000000 # Default value: 2 MB
# Parser-based limits
parser_max_tokens: 15000 # Default value
parser_max_recursion: 500 # Default value
# Operation-based limits (Enterprise only)
max_depth: 100
max_height: 200
max_aliases: 30
max_root_fields: 20

基于操作的限制(仅限企业版)

此文章

网络限制

http_max_request_bytes

限制从网络读取HTTP请求正文中的数据量,以保护免受无界内存消耗的影响。此限制在JSON解析之前进行检查。包括 及其相关的的数量都在此限制内。

默认值为2000000字节,2 MB。

在显著提高此限制之前,请考虑在一个与您的生产环境相似的环境中测试性能,尤其是如果一些客户端不可信。大量并发的大请求可能导致router耗尽内存。

基于解析器的限制

parser_max_tokens

限制查询文档可以包含的标记数量。这包括所有标记,包括词法和忽略的标记。

默认值为15000

parser_max_recursion

限制router的GraphQL解析器允许的最大递归深度,以防止栈溢出。这对应于查询文档中定义的任何单个GraphQL 的最大嵌套级别。

默认值为500

以下示例中,GetProducts 操作有三级递归,而ProductVariation 片段有二级递归。因此,查询文档的最大递归深度是三级。

query GetProducts {
allProducts { #1
...productVariation
delivery { #2
fastestDelivery #3
}
}
}
fragment ProductVariation on Product {
variation { #1
name #2
}
}

请注意,路由器会分别计算每个操作片段的递归深度。even如果片段包含在操作中,该片段的递归深度也不会贡献到操作的递归深度。

需求控制

了解如何分析操作的需求控制以了解如何分析成本并拒绝超出可定制成本限制的请求。

提前取消

直到Apollo Router Core v1.43.1,客户端在等待响应之前关闭了连接,整个请求被取消,并且没有通过整个管道。由于这会导致请求监控问题,路由器在1.43.1中引入了新的行为。现在,如果检测到请求被取消,将执行整个管道,但subgraph请求实际上并未执行。响应将以499状态码报告,但不会实际发送到客户端。要返回立即取消请求的以前行为,可以使用以下配置:

supergraph:
early_cancel: true

此外,自v1.43.1以来,路由器在检测到客户端取消请求时可以显示日志。此日志可以通过以下方式激活:

router.yaml
supergraph:
experimental_log_on_broken_pipe: true

插件

您可以使用插件自定义路由器的行为。每个插件都可以在配置文件中有自己的部分,包含任意值:

example-plugin-router.yaml
plugins:
example.plugin:
var1: "hello"
var2: 1

变量扩展

您可以直接在您 YAML 配置文件中引用变量。这有助于引用秘密而无需将其包含在文件中。

目前,路由器支持环境变量和文件路径的扩展。对应的变量分别以前缀env.file.开头。

路由器使用Unix风格的扩展。以下是几个示例:

  • ${env.ENV_VAR_NAME}展开为环境变量ENV_VAR_NAME的值。
  • ${env.ENV_VAR_NAME:-some_default}展开为环境变量ENV_VAR_NAME的值,如果环境变量未定义则回退为some_default的值。
  • ${file.a.txt}展开为文件a.txt的内容。
  • ${file.a.txt:-some_default} 展开为文件 a.txt 的内容,如果文件不存在,则回退到值 some_default

扩展仅对 YAML 有效,而不是键:

supergraph:
listen: "${env.MY_LISTEN_ADDRESS}"
example:
password: "${env.MY_PASSWORD}"

片段重用和生成

默认情况下,路由器 将尝试在形成 请求时重用原始 查询。可以通过设置为 false 来禁用此行为:

supergraph:
experimental_reuse_query_fragments: false

或者,可以配置 路由器 为子图请求生成 片段。当设置为 true 时,路由器 将在发送查询到子图之前,仅提取 内联片段 到片段定义中。这可以显着减少发送到子图的查询大小,但可能会增加规划所需的时间。请注意,此选项与 experimental_reuse_query_fragments 是互斥的;如果都明确设置为 truegenerate_query_fragments 将具有优先权。

supergraph:
generate_query_fragments: true

配置重用

您可以使用标准 YAML 语法在多个位置重用配置文件的部分:

router.yaml
headers:
subgraphs:
products:
request:
- insert: &insert_custom_header
name: "custom-header"
value: "something"
reviews:
request:
- insert: *insert_custom_header

在此,namevalue 条目在 &insert_custom_header 下被重用于 *insert_custom_header

文本编辑器中的配置感知

路由器可以为您在文本编辑器中生成 JSON 模式以进行配置验证。此模式可以帮助您正确格式化 YAML 文件,同时也提供内容辅助。

使用以下命令生成模式:

./router config schema > configuration_schema.json

生成模式后,请配置您的文本编辑器。以下是常用编辑器的说明:

升级路由器配置

路由器的全新发布可能会对YAML配置文件的预期格式造成破坏性更改,通常是为了扩展现有功能或提高可用性。

如果您运行的路由器版本带有一个该版本不再支持的配置文件

  1. 路由器在启动时发出警告。
  2. 路由器尝试将您提供的配置转换为新的预期格式。
    • 如果转换成功且无错误,路由器将正常启动。
    • 如果转换失败,路由器将终止。

如果您遇到此警告,可以使用router config upgrade指令查看现有配置文件的新预期格式:

./router config upgrade <path_to_config.yaml>

您还可以查看升级现有配置文件所需的确切更改差异

./router config upgrade --diff <path_to_config.yaml>
上一页
企业功能
下一页
内存中缓存
评分文章评分在GitHub上编辑Edit论坛Discord

©2024Apollo Graph Inc.,也称为Apollo GraphQL。

隐私政策

公司