类ManagedChannelBuilder

用于创建 ManagedChannel 实例的 builder.

类定义

package io.grpc;
public abstract class ManagedChannelBuilder<T extends ManagedChannelBuilder<T>> {
}

T 是这个builder的具体类型。

类方法

静态工厂方法

有两个静态方法用来实例。

ManagedChannelProvider 的使用方式和设计实现,不在这里展开,在下一节 Channel Provider 中再详细介绍。

forAddress()

public static ManagedChannelBuilder<?> forAddress(String name, int port) {
    return ManagedChannelProvider.provider().builderForAddress(name, port);
}

forTarget()

@ExperimentalApi
public static ManagedChannelBuilder<?> forTarget(String target) {
    return ManagedChannelProvider.provider().builderForTarget(target);
}

用target字符串创建一个channel, 可以是一个有效的命名解析器兼容(NameResolver-compliant)的URI,或者是一个 authority 字符串。

注: authority 是URI中的术语, URI的标准组成部分如 [scheme:][//authority][path][?query][#fragment], authority代表URI中的 [userinfo@]host[:port],包括host(或者ip)和可选的port和userinfo。

命名解析器兼容(NameResolver-compliant)URI 是被作为URI定义的抽象层次(absolute hierarchical)URI。实例的URI:

  • "dns:///foo.googleapis.com:8080"
  • "dns:///foo.googleapis.com"
  • "dns:///%5B2001:db8:85a3:8d3:1319:8a2e:370:7348%5D:443"
  • "dns://8.8.8.8/foo.googleapis.com:8080"
  • "dns://8.8.8.8/foo.googleapis.com"
  • "zookeeper://zk.example.com:9900/example_service"

authority字符串将被转换为一个命名解析器兼容的URI, 使用"dns"作为scheme,没有authority,而且用合适转义之后的原始authority字符串作为它的path:

  • "localhost"
  • "127.0.0.1"
  • "localhost:8080"
  • "foo.googleapis.com:8080"
  • "127.0.0.1:8080"
  • "[2001:db8:85a3:8d3:1319:8a2e:370:7348]"
  • "[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443"

注: 以上内容来自javadoc上该方法的注释说明。

实例方法

directExecutor()

public abstract T directExecutor();

直接在传输的线程中执行应用代码。

取决于底层传输,使用一个 direct executor 可能引发重大的性能提升。当然,它也要求应用在任何情况下不阻塞。

调用这个方法在语义上等同于调用 executor(Executor) 并传递一个 direct executor。但是,这个方式更合适因为它可以容许传输层执行特别的优化。

注: 考虑实际测试一下,看是否真的可以得到重大的性能提升。

executor()

public abstract T executor(Executor executor);

提供一个自定义executor。

这是一个可选参数。如果在channel构建时没有提供executor,builder将使用一个静态缓存的线程池。

channel不会承担给定 executor 的所有者职责。当需要时,关闭 executor 是调用者的责任。

注: 这意味着我们作为调用者需要自己管理好 executor。

intercept()

public abstract T intercept(List<ClientInterceptor> interceptors);

添加拦截器,被channel执行它的实际工作前被调用。功能上等同于使用 ClientInterceptors.intercept(Channel, List), 但是依然可以访问原始的ManagedChannel。

public abstract T intercept(ClientInterceptor... interceptors);

添加拦截器,被channel执行它的实际工作前被调用。功能上等同于使用 ClientInterceptors.intercept(Channel, ClientInterceptor...), 但是依然可以访问原始的ManagedChannel。

userAgent()

public abstract T userAgent(String userAgent);

为应用提供一个定制的 User-Agent 。

这是一个可选参数。如果提供,给定的agent将使用grpc User-Agent作为前缀.

注: 原文 the given agent will be prepended by the grpc User-Agent. 硬是没有看懂到底哪个作为前缀? 等后面查代码。

overrideAuthority()

@ExperimentalApi(value="primarily for testing")
public abstract T overrideAuthority(String authority)

覆盖和TLS和HTTP 虚拟主机服务一起使用的authority。它不会改变实际连接到的主机。通常是以host:port的形式。

应该仅用于测试。

usePlaintext()

@ExperimentalApi("primarily for testing")
public abstract T usePlaintext(boolean skipNegotiation);

使用 plaintext 连接到服务器。默认将使用加密连接机制如 TLS 。

应该仅用于测试或者用于那些API使用或者数据交换并不敏感的API。

参数 skipNegotiation true,如果预先知道终端支持plaintext; false 如果 plaintext 的使用必须协商。

nameResolverFactory()

@ExperimentalApi
public abstract T nameResolverFactory(NameResolver.Factory resolverFactory);

为channel提供一个定制的 NameResolver.Factory。如果这个方法没有被调用,builder将在全局解析器注册(global resolver registry)中为提供的目标寻找一个工厂。

loadBalancerFactory()

  @ExperimentalApi
  public abstract T loadBalancerFactory(LoadBalancer.Factory loadBalancerFactory);

为channel提供一个定制的 LoadBalancer.Factory 。

如果这个方法没有被调用,builder将为这个 channel 使用 SimpleLoadBalancerFactory 。

decompressorRegistry()

@ExperimentalApi
public abstract T decompressorRegistry(DecompressorRegistry registry);

设置用于在channen中使用的解压缩注册器。这是一个高级API调用,不应该被使用,除非你正在使用定制化的消息编码。默认支持的解压缩在 DecompressorRegistry.getDefaultInstance 中。

compressorRegistry()

@ExperimentalApi
public abstract T compressorRegistry(CompressorRegistry registry);

设置用于在channen中使用的压缩注册器。这是一个高级API调用,不应该被使用,除非你正在使用定制化的消息编码。默认支持的解压缩在 DecompressorRegistry.getDefaultInstance 中。

idleTimeout()

@ExperimentalApi
public abstract T idleTimeout(long value, TimeUnit unit);

设置在进入空闲模式前的没有RPC的期限。

在空闲模式中, channel会关闭所有连接, NameResolver 和 LoadBalancer 。新的RPC将把channel带出空闲模式。channel以空闲模式开始。

默认,在离开初始化空闲模式 channel 将从不会进入空闲模式

build()

使用给定参数来构建一个channel

@ExperimentalApi
public abstract ManagedChannel build();