gRPC Channel
Channel 是用于执行 RPC 请求的概念上的端点连接,基于负载和配置,一个 Channel 可以有 0 或多个真实连接
Subchannel 代表逻辑连接,最多维护一个物理连接发送 RPC,对应多个 Transport

Channel 有多个子类:
ManagedChannel: 实现了生命周期管理能力的抽象子类ManagedChannelImpl:ManagedChannel的实现类,Channel的主要实现ManagedChannelOrphanWrapper:ManagedChannel的包装类,用于引用ManagedChannel
RealChannel:真正执行创建ClientCallImpl实例SubchannelAsChannel: 将Subchannel转为Channel
Subchannel 的子类:
SubchannelImpl:Subchannel 的实现类
方法
Channel
- 发起调用
1 | public abstract <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(MethodDescriptor<RequestT, ResponseT> methodDescriptor, CallOptions callOptions); |
- 目标地址
1 | public abstract String authority(); |
ManagedChannel
ManagedChannel 是 Channel 的子类,提供生命周期管理的 Channel;由 ManagedChannelImpl 实现功能
关闭
- shutdown
初始化一个顺序关闭,既有的调用会继续执行,但是新的调用会被立即取消
1 | public abstract ManagedChannel shutdown(); |
- shutdownNow
强制关闭 Channel,会取消所有的调用;即使是强制关闭也不会瞬间停止
1 | public abstract ManagedChannel shutdownNow(); |
- isShutdown
返回 Channel 是否终止,终止的 Channel 没有执行中的调用,相关的资源被释放
1 | public abstract boolean isShutdown(); |
- awiatTermination
等待 Channel 变为终止,如果超时则放弃等待
1 | public abstract boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException; |
状态
- getState
获取当前连接的状态,当参数为 true 是,如果 Channel 处于 IDLE 模式,则会退出 IDLE 模式,尝试建立连接
1 | public ConnectivityState getState(boolean requestConnection) { |
- notifyWhenStateChanged
当 Channel 的状态和给定的状态不同时触发,用于执行状态变化的回调
1 | public void notifyWhenStateChanged(ConnectivityState source, Runnable callback) { |
- enterIdle
进入空闲模式,Channel 的状态将变为 IDLE,触发 Channel 的名称解析和负载均衡关闭,Channel 上执行中的请求会继续执行,新的 RPC 请求会触发建立新的连接
1 | public void enterIdle() { |
- resetConnectBackoff
对于 TRANSIENT_FAILURE 状态的 Subchannel,使退避计时器短路,并立即重新连接,也会尝试 NameResovler#refresh;主要用于 Android 平台
1 | public void resetConnectBackoff() { |
Subchannel
生命周期
- start
开始 Subchannel,只能调用一次,同时会启动监听器
1 | public void start(SubchannelStateListener listener) { |
- requestConnection
如果没有活跃的连接,在要求建立活跃的连接
1 | public abstract void requestConnection() |
- shutdown
关闭 Subchannel,当调用这个方法后,SubchannelPicker 不会再返回这个 Subchannel
1 | public abstract void shutdown(); |
操作地址
- getAddresses
获取第一个地址集合
1 | public final EquivalentAddressGroup getAddresses() { |
- getAllAddresses
返回 Subchannel 绑定的所有地址
1 | public List<EquivalentAddressGroup> getAllAddresses() { |
- updateAddresses
更新 Subchannel 的地址
1 | public void updateAddresses(List<EquivalentAddressGroup> addrs) { |
其他方法
- asChannel
使用当前的 Subchannel 创建 Channel,用于健康检查等内部操作
1 | public Channel asChannel() { |
- getInternalSubchannel
获取 Subchannel 的内部的 Subchannel,表示用于发送 RPC 的基础的 Subchannel
1 | public Object getInternalSubchannel() { |
- getAttributes
获取 `Subchannel 的属性
1 | public abstract Attributes getAttributes(); |