类 NameResolver

类定义

NameResolver 定义为一个 abstract 类,而不是 interface :

public abstract class NameResolver {}

类方法

getServiceAuthority()

返回用于验证与服务器的连接的权限(authority)。 必须来自受信任的来源,因为如果权限被篡改,RPC可能被发送到攻击者,泄露敏感用户数据。

实现必须以不阻塞的方式生成它,通常在一行中(in line),必须保持不变。使用同样的参数从同一个的 factory 中创建出来的 NameResolver 必须返回相同的 authority 。

public abstract String getServiceAuthority();

start()

开始解析。listener 用于接收目标的更新。

public abstract void start(Listener listener);

shutdown()

停止解析。listener 的更新将会停止。

public abstract void shutdown();

refresh()

重新解析名字。

只能在 start() 方法被调用之后调用。

这里仅仅是一个暗示。实现类将它作为一个信号,但是可能不会立即开始解析。它绝不抛出异常。

默认实现是什么都不做。

public void refresh() {}

内部类 Factory

创建 NameResolver 实例的工厂类。

public abstract static class Factory {
    /**
     * 端口号,用于当目标或者底层命名系统没有提供端口号的情况
     */
    public static final Attributes.Key<Integer> PARAMS_DEFAULT_PORT =
        Attributes.Key.of("params-default-port");
}

newNameResolver()

创建 NameResolver 用于给定的目标URI,或者在给定URI无法被这个 factory 解析时返回 null。决定应该仅仅基于 URI 的 scheme。

参数 targetUri 表示要解析的目标 URI,而这个 URI 的 scheme 必须不能为 null。

参数 params 是可选参数。权威key在 Factory 中以 PARAMS_* 字段定义。

public abstract NameResolver newNameResolver(URI targetUri, Attributes params);

getDefaultScheme()

返回默认 scheme, 当 ManagedChannelBuilder.forTarget(String) 方法被给到 authority 字符串而不是符合的 URI时,用于构建 URI 。

public abstract String getDefaultScheme();

内部接口 Listener

接收地址更新。

所有的方法都要求快速返回。

public interface Listener {}

onUpdate()

注意: 已经被废弃,改用 onAddresses() 方法。

@Deprecated
void onUpdate(List<ResolvedServerInfoGroup> servers, Attributes attributes);

onAddresses()

处理被解析的地址和配置的更新。

实现不可以修改给定的参数 servers 。

参数 servers 指被解析的服务器地址。空列表将触发 onError() 方法。

void onAddresses(List<EquivalentAddressGroup> servers, Attributes attributes);

onError()

处理从 resolver 而来的错误。

参数 error 为非正常的状态

void onError(Status error);