当前位置: 首页 > news >正文

对gRPC中常见的 grpc::CreateChannel()这个类所创建的对象所包含的属性做详细介绍

简介

在 gRPC 中,grpc::CreateChannel 函数用于创建一个 grpc::Channel 对象,这个对象代表了与 gRPC 服务端的连接。这个函数是客户端用来初始化与服务器通信的起点。

grpc::Channel 对象的一些常见属性和功能:

  1. Channel State (grpc_connectivity_state): grpc::Channel 对象维护着一个状态,表示当前与服务端的连接状态。状态可以是 IDLE, CONNECTING, READY, TRANSIENT_FAILURE, SHUTDOWN 等。

  2. Channel Credentials: 当创建 grpc::Channel 对象时,需要指定认证凭证(credentials)。gRPC 提供了多种类型的认证方式,如 grpc::InsecureChannelCredentials(不安全的连接,不推荐在生产环境中使用)和 grpc::SslCredentials(安全的 SSL/TLS 连接)。

  3. Target Address (host): 这是服务端的地址,包括主机名和端口号。客户端通过这个地址来连接到服务端。

  4. Load Balancing Policy: grpc::Channel 可以配置负载均衡策略,以优化请求的分发。

  5. Interceptors: 拦截器允许开发者拦截和修改 gRPC 调用,这在需要添加额外的逻辑(如日志记录、认证、监控等)时非常有用。

  6. Service Config: 服务配置(Service Config)是一个 JSON 格式的配置,它可以用来控制服务的行为,如设置超时、重试策略等。

  7. Completion Queue (grpc::CompletionQueue): 用于异步操作的回调。每个 grpc::Channel 对象可以关联一个或多个 grpc::CompletionQueue 对象。

  8. Calls: grpc::Channel 对象可以创建 grpc::Call 对象,这些对象代表了单个 RPC 调用。

  9. Interceptor Creators: 用于创建拦截器的工厂接口,可以通过这些接口创建自定义的拦截器。

  10. Channel Arguments: 这些是用于配置 grpc::Channel 的参数,如设置最大消息大小、启用或禁用压缩等。

  11. Error Handling: grpc::Channel 提供了错误处理机制,可以捕获和处理与服务端通信过程中出现的错误。

  12. Watchers: 可以注册状态变化的观察者,当通道状态发生变化时,观察者会被通知。

  13. Liveness Probes: 用于健康检查的接口,可以定期检查服务端是否存活。

  14. Resource Quotas: 可以为 grpc::Channel 设置资源配额,以限制其使用的资源。

  15. Security: 提供了安全相关的属性,如 SSL/TLS 配置,用于保护传输的数据。

grpc::Channel 对象是 gRPC 客户端的核心,它封装了与服务端通信所需的所有细节。通过配置和使用 grpc::Channel,开发者可以灵活地控制 gRPC 客户端的行为,以满足不同的应用场景需求。

深入了解 grpc::Channel 对象的属性和功能

在这一章节,我提供一些 C++ 伪代码示例来展示如何使用它们。

1. Channel State

属性:grpc_connectivity_state
用途:获取当前通道的状态。
伪代码:

grpc::ChannelArguments args;
grpc::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("server_address", grpc::InsecureChannelCredentials());
grpc_connectivity_state state = channel->GetState(true); // 尝试连接

2. Channel Credentials

用途:设置通道的安全凭证。
伪代码:

grpc::SslCredentialsOptions ssl_opts;
grpc::shared_ptr<grpc::Channel> secure_channel = grpc::CreateChannel("server_address", grpc::SslCredentials(ssl_opts));

3. Target Address

用途:指定服务端的地址。
伪代码:

const std::string server_address = "192.168.1.1:50051";
grpc::shared_ptr<grpc::Channel> channel = grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials());

4. Load Balancing Policy

用途:配置负载均衡策略。
伪代码:

grpc::ChannelArguments args;
args.SetLoadBalancingPolicyName("round_robin"); // 设置为轮询策略
grpc::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("server_address", grpc::InsecureChannelCredentials(), args);

5. Interceptors

用途:拦截和修改 gRPC 调用。
伪代码:

class MyInterceptor : public grpc::ClientInterceptor {
public:grpc::ClientInterceptor::InterceptionHookResult Intercept(grpc::ClientInterceptor::InterceptionHookPoints points,grpc::ChannelInterface* channel,const grpc::ChannelArgs& args,grpc::ClientContext* context,const grpc::ByteBuffer* request,grpc::CompletionQueue* cq,void** tag) override {// 自定义拦截逻辑}
};grpc::ChannelArguments args;
args.SetInterceptorCreator([]() { return new MyInterceptor; });
grpc::shared_ptr<grpc::Channel> channel_with_interceptor = grpc::CreateChannel("server_address", grpc::InsecureChannelCredentials(), args);

6. Service Config

用途:获取服务配置的 JSON 字符串。
伪代码:

std::string service_config_json = channel->GetServiceConfigJSON();

7. Completion Queue

用途:用于异步 RPC 调用的回调。
伪代码:

grpc::CompletionQueue cq;
grpc::ClientContext context;
// 创建异步调用
auto reader = stub_->PrepareAsyncSomeCall(&context, request, &cq);
// 从 completion queue 中获取结果
void* tag; bool ok;
cq.Next(&tag, &ok);

8. Calls

用途:创建和发起 RPC 调用。
伪代码:

grpc::ClientContext context;
SomeRequest request;
SomeResponse response;
// 同步调用
stub_->SomeCall(&context, request, &response);
// 或者异步调用

9. Channel Arguments

用途:设置通道参数,如最大消息大小。
伪代码:

grpc::ChannelArguments args;
args.SetMaxReceiveMessageSize(1024 * 1024); // 设置最大接收消息大小为1MB
grpc::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("server_address", grpc::InsecureChannelCredentials(), args);

10. Error Handling

用途:处理通道错误。
伪代码:

grpc::Status status = context.GetStatus();
if (!status.ok()) {// 处理错误
}

11. Watchers

用途:注册状态变化的观察者。
伪代码:

channel->NotifyOnStateChange(GRPC_CHANNEL_READY, deadline, &cq, this);

12. Liveness Probes

用途:定期检查服务端是否存活。
伪代码:

// 通常由 gRPC 内部处理,客户端不需要显式调用

13. Resource Quotas

用途:为通道设置资源配额。
伪代码:

grpc::ChannelArguments args;
args.SetResourceQuota("some_quota_name");
grpc::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("server_address", grpc::InsecureChannelCredentials(), args);

14. Security

用途:配置 SSL/TLS 安全设置。
伪代码:

grpc::SslCredentialsOptions ssl_opts;
ssl_opts.pem_root_certs = "root_cert.pem";
ssl_opts.pem_private_key = "private_key.pem";
ssl_opts.pem_cert_chain = "cert_chain.pem";
grpc::shared_ptr<grpc::Channel> secure_channel = grpc::CreateChannel("server_address", grpc::SslCredentials(ssl_opts));

请注意,上述伪代码仅用于演示目的,实际代码可能会根据 gRPC API 的具体版本和您的应用程序需求有所不同。


如果有gRPC 相关的其他问题,欢迎评论区留言。我看到都会回复的。


分享一个有趣的 学习链接

相关文章:

  • 力扣496. 下一个更大元素 I
  • 【数据库基础-mysql详解之索引的魅力(N叉树)】
  • sheng的学习笔记-docker部署Greenplum
  • 会话机制:Session
  • Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册
  • Python库之`lxml`的高级用法深度解析
  • Python开发Android手机APP
  • Java入门基础学习笔记42——常用API
  • Python Flask 图片上传与下载
  • 基于yolov5和desnet的猫咪识别模型
  • 深度学习中的优化算法二(Pytorch 19)
  • Spring ----> IOC
  • 探索集合python(Set)的神秘面纱:它与字典有何不同?
  • 【建议收藏】30个较难Python脚本,纯干货分享
  • jenkins升级,涉及ssh remote执行出现Algorithm negotiation fail
  • css选择器
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • javascript 哈希表
  • JavaScript的使用你知道几种?(上)
  • JS学习笔记——闭包
  • Mithril.js 入门介绍
  • Mysql5.6主从复制
  • PHP 的 SAPI 是个什么东西
  • Puppeteer:浏览器控制器
  • Python打包系统简单入门
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序--------语音识别(前端自己也能玩)
  • 小程序开发之路(一)
  • 一文看透浏览器架构
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #Spring-boot高级
  • #单片机(TB6600驱动42步进电机)
  • $$$$GB2312-80区位编码表$$$$
  • $L^p$ 调和函数恒为零
  • (13)Hive调优——动态分区导致的小文件问题
  • (2)空速传感器
  • (PADS学习)第二章:原理图绘制 第一部分
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (南京观海微电子)——COF介绍
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十六)一篇文章学会Java的常用API
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .apk 成为历史!
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 将实体类转换为 SQL(ORM 映射)