- gPRC 介绍
- gPRC 介绍 - 资料收集整理
- gPRC 介绍 - Protocol Buffer 3
- gPRC文档
- gPRC文档 - gRPC官方文档(中文版)
- gPRC文档 - gRPC动机和设计原则
- gPRC文档 - 源码导航
- 基础 - NameResolver
- NameResolver - URI术语
- NameResolver - 类NameResolver
- NameResolver - 类DnsNameResolver
- NameResolver - 类DirectAddressNameResolver
- NameResolver - NameResolver的用法
- 基础 - Metadata
- Channel层
- Channel设计与代码实现 - 类Channel
- Channel设计与代码实现 - 类ManagedChannel
- 类ManagedChannelImpl - 空闲模式
- 类ManagedChannelImpl - InUseStateAggregator
- 类ManagedChannelImpl - Name Resolver
- 类ManagedChannelImpl - Load Balancer
- 类ManagedChannelImpl - Transport
- 类ManagedChannelImpl - Executor
- 类ManagedChannelImpl - 关闭
- Channel层 - Channel Builder设计与代码实现
- Channel Builder设计与代码实现 - 类ManagedChannelBuilder
- Channel Builder设计与代码实现 - 类AbstractManagedChannelImplBuilder
- Channel Builder设计与代码实现 - 类NettyChannelBuilder
- Channel层 - Channel Provider设计与代码实现
- Channel Provider设计与代码实现 - 类ManagedChannelProvider
- Channel Provider设计与代码实现 - 类NettyChannelProvider
- Channel层 - 类CallOptions
- Stub层 - 类DemoServiceBlockingStub
- Stub层 - 类AbstractStub
- 客户端流程
- 状态 - 类Status
- 状态 - 状态码详细定义
- 状态 - 类StatusException
- 状态 - 异常处理的流程分析
- 实践 - 集成Spring Boot
- 实践 - 文档生成
- 文档生成 - 支持proto3
- 文档生成 - build插件
- 文档生成 - 使用模板定制输出
- 实践 - 代理
- 实践 - 超时
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
Channel Provider设计与代码实现 - 类NettyChannelProvider
类NettyChannelProvider
用于创建 NettyChannelBuilder 实例的provider。
@Internal
public final class NettyChannelProvider extends ManagedChannelProvider {
@Override
public boolean isAvailable() {
// 总是返回true
return true;
}
@Override
public int priority() {
// 使用默认优先级 5
return 5;
}
@Override
public NettyChannelBuilder builderForAddress(String name, int port) {
// 对接NettyChannelBuilder
return NettyChannelBuilder.forAddress(name, port);
}
@Override
public NettyChannelBuilder builderForTarget(String target) {
// 对接NettyChannelBuilder
return NettyChannelBuilder.forTarget(target);
}
}
类OkHttpChannelProvider
用于创建 OkHttpChannelBuilder 实例的provider。
@Internal
public final class OkHttpChannelProvider extends ManagedChannelProvider {
@Override
public boolean isAvailable() {
return true;
}
@Override
public int priority() {
// 会更加当前环境动态调整优先级
// 如果是 IS_RESTRICTED_APPENGINE 或者 android 环境下,调整为 8, 此时优先级高于 netty(默认为5)
// 其他情况下为 3, 此时优先级低于 netty(默认为5)
return (GrpcUtil.IS_RESTRICTED_APPENGINE || isAndroid()) ? 8 : 3;
}
@Override
public OkHttpChannelBuilder builderForAddress(String name, int port) {
return OkHttpChannelBuilder.forAddress(name, port);
}
@Override
public OkHttpChannelBuilder builderForTarget(String target) {
return OkHttpChannelBuilder.forTarget(target);
}
}
IS_RESTRICTED_APPENGINE的判断逻辑如下(和 google appengine 有关,细节不追究了):
public static final boolean IS_RESTRICTED_APPENGINE =
"Production".equals(System.getProperty("com.google.appengine.runtime.environment"))
&& "1.7".equals(System.getProperty("java.specification.version"));
ServiceProvider 的实现
为了实现jdk的ServiceProvider,以便被load()函数装载,okjava 和 netty 在打包的时候都会按照JDK SPI的要求在他们的jar文件中加入SPI的内容,以netty为例:
上图是 grpc-java 中 netty 子项目的相关文件,在resources下的 META-INF.services
目录,存在一个名为 io.grpc.ManagedChannelProvider
文件,其内容为:
io.grpc.netty.NettyChannelProvider
总结
通过这种标准的SPI的方式,grpc实现了将 channel 的提供者和使用者分离并解藕。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论