介绍
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 分钟将轮询 HasChanged
和 IProxyConfig
更改令牌。
当提供程序想要向代理提供一组新的目标时,它应:
- 在后台解析这些目的地。
-
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.AddressFamily
值 AddressFamily.InterNetwork
或 AddressFamily.InterNetworkV6
,以将解析限制为 IPv4 或 IPv6 地址。 默认值 null
,指示解析程序不限制结果的地址系列,并使用接受所有返回的地址。