自定义名称解析

解释了标准名称解析、自定义名称解析器接口以及如何编写实现。

自定义名称解析

解释了标准名称解析、自定义名称解析器接口以及如何编写实现。

概览

名称解析本质上是关于服务发现的。当发送 gRPC 请求时,客户端必须确定服务名称的 IP 地址。人们通常认为名称解析与 DNS 相同。然而,在实践中,通常通过扩展或完全替换 DNS 来实现名称解析。

在使用 gRPC 客户端发送请求时,默认使用 DNS 名称解析。但是,也可以使用各种其他名称解析机制

解析器示例备注
DNSgrpc.io:50051默认情况下,假定使用 DNS。
DNSdns:///grpc.org.cn:50051额外的斜杠用于提供权限
Unix 域套接字unix:///run/containerd/containerd.sock
xDSxds:///wallet.grpcwallet.io
IPv4ipv4:198.51.100.123:50051仅部分语言支持

有几种语言支持一个接口,允许用户定义自己的名称解析器,以便您可以定义如何解析任何给定的名称。注册后,当目标字符串以 my-resolver: 开头时,将使用方案为 my-resolver 的名称解析器。例如,对 my-resolver:///my-service 的请求现在将使用 my-resolver 名称解析器实现。

自定义名称解析器

每当您想增强或替换 DNS 进行服务发现时,都可以考虑使用自定义名称解析器。例如,过去曾使用此接口来使用 Apache Zookeeper 查找服务名称。它也曾用于直接与 Kubernetes API 服务器对接,以基于无头服务资源进行服务查找。

使用自定义名称解析器而非标准 DNS 可能特别有用的一个原因是,此接口是反应式的。在标准 DNS 中,客户端在连接开始时查找特定服务的地址,并在连接生命周期内维护与该地址的连接。然而,自定义名称解析器可以是基于监视的。也就是说,它们可以随时间接收来自名称服务器的更新,从而智能地响应后端故障以及后端的扩容和缩容。

此外,自定义名称解析器可以为客户端连接提供服务配置。服务配置是一个 JSON 对象,它定义了任意配置,指定了流量应如何路由到特定服务以及如何在特定服务之间进行负载均衡。最基本地,这可以用来指定某些事项,例如特定服务应使用轮询负载均衡策略而不是优先选择策略。然而,当自定义名称解析器与任意服务配置和自定义负载均衡策略结合使用时,可以构建非常复杂的流量管理系统,例如 xDS。

目标字符串的生命周期

虽然自定义名称解析器的具体接口因语言而异,但总体结构是相同的。客户端在进程启动时将名称解析器提供程序的实现注册到进程全局注册表中。gRPC 库将使用为自定义名称解析器指定的目标字符串调用名称解析器提供程序。给定该目标字符串,名称解析器提供程序将返回一个名称解析器实例,该实例将与客户端连接交互,以根据目标字符串导向请求。

sequenceDiagram
  Client ->> gRPC: Request to my-resolver:///my-service
  gRPC ->> NameResolverProvider: requests NameResolver
  NameResolverProvider -->> gRPC: returns NameResolver
  gRPC ->> NameResolver: delegates resolution
  NameResolver -->> gRPC: addresses

语言支持

语言示例
Java示例
Go示例
C++不支持
Python不支持