gRPC Client 启动流程
gRPC 启动初始化的流程,使用 Netty 作为底层的实现
初始化 Channel
Channel 的初始化通过 ChannelBuilder
构建
这里通过 forTarget
设置了要解析的服务名称,会通过 NameResolver
解析,转换为具体的地址
ManagedChannel channel = ManagedChannelBuilder.forTarget("grpc-server")
.usePlaintext()
.build();
- 构建 ManagedChannel 实例
io.grpc.internal.AbstractManagedChannelImplBuilder#build
调用 build 时,会根据 builder 中的属性,创建 ManagedChannelImpl
的实例
public ManagedChannel build() {
return new ManagedChannelOrphanWrapper(new ManagedChannelImpl(
this,
// 构建 Transport 工厂
buildTransportFactory(),
new ExponentialBackoffPolicy.Provider(),
// 线程池
SharedResourcePool.forResource(GrpcUtil.SHARED_CHANNEL_EXECUTOR),
// 计时器
GrpcUtil.STOPWATCH_SUPPLIER,
// 统计和追踪拦截器
getEffectiveInterceptors(),
// 时间提供器
TimeProvider.SYSTEM_TIME_PROVIDER));
}
初始化 Channel 属性
- io.grpc.internal.ManagedChannelImpl#ManagedChannelImpl
为 ManagedChannel
设置属性,初始化服务发现,负载均衡,拦截器等并创建真正的 Channel
ManagedChannelImpl(AbstractManagedChannelImplBuilder<?> builder,
ClientTransportFactory clientTransportFactory,
BackoffPolicy.Provider backoffPolicyProvider,
ObjectPool<? extends Executor> balancerRpcExecutorPool,
Supplier<Stopwatch> stopwatchSupplier,
List