服务配置 (Service Config)

概述

服务配置(Service Config)指定了 gRPC 客户端与 gRPC 服务器交互时应遵循的行为。服务所有者可以提供一个服务配置,定义所有服务客户端的期望行为。服务配置中的设置始终应用于特定的目标字符串(例如,“api.myapp.com”),而不是全局应用。

服务配置控制的行为

服务配置中的设置影响客户端的负载均衡、调用行为和健康检查。

本页概述了服务配置中的选项,但完整的服务配置数据结构已通过 Protobuf 定义进行文档化。

负载均衡 (Load Balancing)

一个服务可以由多个服务器组成,负载均衡配置指定了客户端应如何在这些服务器之间分配请求。默认情况下,使用 pick_first 负载均衡策略,但可以在服务配置中指定其他策略。例如,指定 round_robin 策略将使客户端轮流使用服务器,而不是重复使用第一个服务器。

调用行为 (Call Behavior)

RPC 调用可以以多种方式进行配置:

  • 启用 wait-for-ready:如果客户端无法连接到后端,RPC 将延迟,而不是立即失败。

  • 可以提供调用超时,指定客户端在放弃 RPC 之前应等待的最长时间。

  • 可以配置以下内容之一:

  • 重试策略(最大尝试次数、退避设置、可重试状态码)

  • 抢先策略(最大尝试次数、延迟、非致命状态码)

注意:这些调用行为设置可以限于特定服务或方法。

重试和抢先策略可以通过设置重试限流策略进一步调整,但它会在所有服务和方法之间应用。

健康检查 (Health Checking)

客户端可以通过提供健康检查名称来配置健康检查。然后,客户端将使用标准的 gRPC 健康检查服务。

获取服务配置

服务配置可以通过名称解析或程序化方式提供给客户端。

名称解析 (Name Resolution)

gRPC 的名称解析机制允许可插拔的名称解析器实现。这些实现返回与名称关联的地址以及相关联的服务配置。这是服务所有者将服务配置分发到 gRPC 客户端集群的机制。

  • xDS 名称解析器将其从控制平面接收到的 xDS 配置转换为相应的服务配置。

  • Go 实现中的标准 DNS 名称解析器支持将服务配置存储为名称服务器上的 TXT 记录。

注意:尽管服务配置结构通过 Protobuf 定义进行了文档化,但客户端中的内部表示是 JSON 格式的。名称解析器实现可以以任何它们喜欢的方式存储服务配置信息,只要在名称解析时以 JSON 格式提供即可。

程序化方式 (Programmatically)

gRPC 客户端 API 提供了一种以 JSON 格式指定服务配置的方式。这用于提供默认的服务配置,适用于名称解析器未提供服务配置的情况。在某些测试情况下,这也很有用。

示例服务配置

以下示例执行了以下操作:

  • 启用了 round_robin 负载均衡策略。

  • 设置了所有服务中所有方法的默认调用超时为 1 秒。

  • foo 服务中的 bar 方法以及 baz 服务中的所有方法的超时覆盖为 2 秒。

{
  "loadBalancingConfig": [ { "round_robin": {} } ],
  "methodConfig": [
    {
      "name": [{}],
      "timeout": "1s"
    },
    {
      "name": [
        { "service": "foo", "method": "bar" },
        { "service": "baz" }
      ],
      "timeout": "2s"
    }
  ]
}