YARP 可扩展性目标解析器

介绍

YARP 使用目标解析程序来扩展已配置的目标地址集。 目标解析程序可用作与服务发现系统的集成点。

结构

IDestinationResolver 具有单个方法 ResolveDestinationsAsync(IReadOnlyDictionary<string, DestinationConfig> destinations, CancellationToken cancellationToken),该方法返回 ResolvedDestinationCollection 实例。 ResolvedDestinationCollection 包含 DestinationConfig 实例的集合,以及一个用于通知代理此信息何时过期并应重新加载的 IChangeToken,这将导致再次调用 ResolveDestinationsAsync

DestinationConfig

DestinationConfig 具有 Host 属性,可用于指定代理在与该目标通信时应使用的默认 Host 标头值。 例如,这允许 IDestinationResolver 将目的地解析为一组 IP 地址,而不会导致 SNI 或基于主机的路由失败。

生命周期

初创公司

IDestinationResolver 作为单一实例在 DI 容器中注册。 启动时,代理将解析此实例,并使用从解析的 ResolveDestinationsAsync(...) 中检索到的配置目标调用 IProxyConfigProviders。 在此首次调用时,服务提供商可以选择:

  • 如果提供程序因任何原因无法生成有效的代理配置,则引发异常。 这会阻止应用程序启动。
  • 异步解析目标地址。 这将阻止应用程序启动,直到解析的目标可用。
  • 或者,在后台解析目标的同时,它可以选择返回一个空的 ResolvedDestinationCollection 实例。 当配置可用时,提供程序需要触发 IChangeToken

原子性

提供给代理的目标对象和集合应是只读的,一旦通过 GetConfig() 将其传递给代理,就不能修改。

重新加载

如果 IChangeToken 支持 ActiveChangeCallbacks,则代理处理初始目标集后,它将使用此令牌注册一个回调。 如果提供程序不支持回调,则每 5 分钟将轮询 HasChangedIProxyConfig 更改令牌。

当提供程序想要向代理提供一组新的目标时,它应:

  • 在后台解析这些目的地。
    • ResolvedDestinationCollection 是不可变的,因此必须为任何新数据创建新实例。
    • 未更改目标的对象可以重复使用,也可以创建新实例。
  • 使之前 IChangeToken 调用所返回的 ResolveDestinationsAsync 失效。

一旦应用了新的目标,代理将向新的 IChangeToken 注册一个回调。 请注意,如果多个重载信号在短时间内发出,代理可能会跳过某些重载,并在准备就绪时立即解析目标。

DNS 目标地址解析程序

YARP 包括 IDestinationResolver 实现,它通过使用 DNS 将每个主机名解析为一个或多个 IP 地址,为每个解析的 IP 创建一个目标,从而扩展了配置的目标集。 可以使用 IReverseProxyBuilder.AddDnsDestinationResolver(Action<DnsDestinationResolverOptions>) 方法将 DNS 目标解析程序添加到反向代理。 该方法接受可选委托来配置解析程序的选项 DnsDestinationResolverOptions

示例

// Add the DNS destination resolver, restricting results to IPv4 addresses
reverseProxyBuilder.AddDnsDestinationResolver(o => o.AddressFamily = AddressFamily.InterNetwork);

配置

DNS 目标解析程序的选项 DnsDestinationResolverOptions 具有以下属性:

刷新周期

请求刷新已解析名称之间的时间间隔。 此默认值为 5 分钟。

AddressFamily

(可选)指定 System.Net.Sockets.AddressFamilyAddressFamily.InterNetworkAddressFamily.InterNetworkV6,以将解析限制为 IPv4 或 IPv6 地址。 默认值 null,指示解析程序不限制结果的地址系列,并使用接受所有返回的地址。