gRPC 四模式之 一元RPC模式
一元RPC模式
一元 RPC 模式也被称为简单 RPC 模式。在该模式中,当客户端调用服务器端的远程方法时,客户端发送请求至服务器端并获得一个响应,与响应一起发送的还有状态细节以及 trailer 元数据(这部分不是默认发送的,需要自己实现)。
![[Pasted image 20231115104223.png]]
使用场景
单次通讯,传输数据包的时候,返回收到应答。
在一元RPC模式中,状态细节和trailer元数据并不是默认就有的,它们是由服务器端根据需要添加的。状态细节通常包含了关于RPC调用的状态信息,例如是否成功,如果失败了具体是什么原因等。而trailer元数据则是一些额外的信息,例如调用的时间,服务器的处理时间等。
具体来说,状态细节和trailer元数据的形式取决于你使用的RPC框架和编程语言。在gRPC中,状态细节和trailer元数据通常以键值对的形式存在,键和值都是字符串。例如,你可能会看到这样的状态细节:{"status": "success"},或者这样的trailer元数据:{"processing-time": "123ms"}。
请注意,这只是一个例子,实际的状态细节和trailer元数据会根据你的应用需求和服务器的实现来定。
在gRPC中,服务器可以通过grpc::ServerContext对象来设置trailer元数据。这些元数据在RPC调用结束时发送给客户端。以下是一个C++的示例,展示了如何设置和发送trailer元数据:
#include <grpcpp/grpcpp.h>
#include "your_service.grpc.pb.h" // 替换为你的服务的protobuf头文件class YourServiceImpl final : public YourService::Service {grpc::Status YourMethod(grpc::ServerContext* context, const YourRequest* request,YourResponse* reply) override {// 处理你的方法逻辑...// 在RPC调用结束时,设置trailer元数据context->AddTrailingMetadata("processing-time", "123ms");return grpc::Status::OK;}
};
在这个例子中,服务器在处理完YourMethod方法后,通过AddTrailingMetadata方法添加了一个名为"processing-time"的trailer元数据,值为"123ms"。这个元数据会在RPC调用结束时发送给客户端。
至于状态细节,它通常包含在返回的grpc::Status对象中。例如,如果你的方法出现了错误,你可以返回一个包含错误信息的grpc::Status对象:
return grpc::Status(grpc::StatusCode::INTERNAL, "An internal error occurred");
在这个例子中,服务器返回了一个状态码为INTERNAL的grpc::Status对象,状态细节为"An internal error occurred"。这个状态细节会被发送给客户端,客户端可以通过检查返回的grpc::Status对象来获取这个信息。
在服务端返回时,设置多个状态和元数据
在gRPC中,你可以通过多次调用AddTrailingMetadata方法来添加多个trailer元数据。每次调用都会添加一个新的键值对。例如:
context->AddTrailingMetadata("processing-time", "123ms");
context->AddTrailingMetadata("server-id", "server-001");
context->AddTrailingMetadata("timestamp", "2022-01-01T00:00:00Z");
在这个例子中,服务器添加了三个trailer元数据:“processing-time”,“server-id"和"timestamp”。
至于状态细节,gRPC的grpc::Status对象只支持设置一个状态细节。如果你需要传递多个状态信息,你可以将它们编码为一个字符串,例如JSON格式的字符串,然后设置为状态细节。例如:
std::string status_detail = R"({"error": "An internal error occurred","error_code": 123,"error_info": "Some additional info"
})";
return grpc::Status(grpc::StatusCode::INTERNAL, status_detail);
在这个例子中,服务器将多个状态信息编码为一个JSON格式的字符串,然后设置为状态细节。客户端可以解析这个字符串来获取这些状态信息。
客户端接取trailer元数据
客户端可以接收到服务端发送的trailer元数据和状态细节,并根据需要进行处理。
在gRPC中,客户端可以通过grpc::ClientContext对象来获取trailer元数据。例如:
grpc::ClientContext context;
YourResponse response;
grpc::Status status = stub->YourMethod(&context, request, &response);if (!status.ok()) {std::cout << "RPC failed with code " << status.error_code()<< ", message: " << status.error_message() << std::endl;// 获取trailer元数据auto trailers = context.GetServerTrailingMetadata();for (const auto& kv : trailers) {std::cout << "Trailer key: " << kv.first << ", value: " << kv.second << std::endl;}
}
在这个例子中,客户端首先调用YourMethod方法并获取返回的grpc::Status对象。如果RPC调用失败,客户端会打印出错误信息,然后通过GetServerTrailingMetadata方法获取trailer元数据并打印出来。
至于状态细节,客户端可以通过grpc::Status对象的error_message方法来获取。例如:
std::cout << "Status detail: " << status.error_message() << std::endl;
在这个例子中,客户端打印出了状态细节。如果状态细节是一个编码的字符串,例如JSON格式的字符串,客户端可以解析这个字符串来获取状态信息。
客户端发送 header 元数据、状态细节
在gRPC中,客户端也可以设置和发送header元数据和状态细节。这可以通过grpc::ClientContext对象来实现。
首先,客户端可以通过AddMetadata方法来设置header元数据:
grpc::ClientContext context;
context.AddMetadata("client-id", "client-001");
context.AddMetadata("timestamp", "2022-01-01T00:00:00Z");
在这个例子中,客户端设置了两个header元数据:“client-id"和"timestamp”。
然后,客户端可以通过TryCancel方法来取消RPC调用,并通过set_cancel_message方法来设置状态细节:
context.TryCancel();
context.set_cancel_message("The request was cancelled by the client");
在这个例子中,客户端取消了RPC调用,并设置了状态细节为"The request was cancelled by the client"。
请注意,这只是一个例子,实际的使用方式会根据你的应用需求和gRPC的API来定。在gRPC中,客户端也可以设置和发送header元数据和状态细节。这可以通过grpc::ClientContext对象来实现。
首先,客户端可以通过AddMetadata方法来设置header元数据:
grpc::ClientContext context;
context.AddMetadata("client-id", "client-001");
context.AddMetadata("timestamp", "2022-01-01T00:00:00Z");
在这个例子中,客户端设置了两个header元数据:“client-id"和"timestamp”。
然后,客户端可以通过TryCancel方法来取消RPC调用,并通过set_cancel_message方法来设置状态细节:
context.TryCancel();
context.set_cancel_message("The request was cancelled by the client");
在这个例子中,客户端取消了RPC调用,并设置了状态细节为"The request was cancelled by the client"。
补充:
取消RPC调用通常是因为客户端不再需要RPC的结果,或者因为某些条件已经改变,使得继续等待响应变得没有意义。取消可以用于各种情况,例如:
-
超时: 如果一个RPC调用超过了预定的时间还没有响应,客户端可能会选择取消它,以避免无限期地等待。
-
用户干预: 如果用户发起了一个操作,然后在操作完成前改变了主意,客户端应用可能需要取消相关的RPC调用。
-
资源优化: 如果客户端已经发送了多个RPC调用,但是得到了足够的信息来完成任务,它可能会取消剩余的调用,以节省服务器资源和网络带宽。
-
错误恢复: 如果在RPC调用过程中发生了错误,客户端可能会取消该调用,并尝试其他恢复策略。
-
依赖关系变化: 如果RPC调用的结果依赖于某些条件,而这些条件在调用过程中发生了变化,客户端可能需要取消调用。
取消RPC调用是异步编程中常见的一种模式,它允许应用程序更有效地管理资源和用户交互。在gRPC中,客户端可以通过调用grpc::ClientContext的TryCancel方法来取消RPC调用。服务端可以通过检查grpc::ServerContext::IsCancelled来响应取消事件,并及时停止处理。
分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za
相关文章:
gRPC 四模式之 一元RPC模式
一元RPC模式 一元 RPC 模式也被称为简单 RPC 模式。在该模式中,当客户端调用服务器端的远程方法时,客户端发送请求至服务器端并获得一个响应,与响应一起发送的还有状态细节以及 trailer 元数据(这部分不是默认发送的,…...
Java GUI实现贪吃蛇游戏
贪吃蛇是一款经典的游戏,玩法相对简单但富有挑战性。以下是贪吃蛇游戏的基本玩法说明: 目标:控制一条蛇,在游戏区域内吃到尽可能多的食物,使蛇身变长,同时避免撞到自己的身体或游戏区域的边界。 控制&…...
Vue3 使用教程
目录 一、创建vue3工程1. 使用vue-cli创建2.使用 vite 创建 二、setup使用三、ref函数四、reactive函数五、计算属性与监视属性5.1 computed函数5.2 watch函数5.3 watchEffect函数 六、自定义hook函数七、toRef函数八、shallowReactive 与 shallowRef九、readonly 与 shallowRe…...
卡方检验-python代码
故事背景 问题 卡方检验的结果怎么计算? 方法 python代码 import numpy as np from scipy.stats import chi2_contingency# 观察频数矩阵 observed np.array([[47, 21, 17],[63, 29, 15],[11, 2, 4]])# 进行卡方检验 chi2, p, dof, expected chi2_contingency(o…...
电磁场与电磁波part4--时变电磁场
1、采用洛伦兹条件使得矢量位 与标量位 分离在两个独立的方程中,且矢量位 仅与电流密度 有关,而标量位 仅与电荷密度 有关。 2、电磁能量守恒定理(坡印廷定理) 即减少的电磁能量电磁场所做的功流出的电磁能量 3、设u(r,t)是…...
电压跟随器
电压跟随器即输入多大电压就输出多大的电压,那其起什么作用呢,直接用导线不行吗? 下图为Multisim软件仿真结果,很明显输入电压6.5V输出电压使用万用表测得同为6.5V,验证了电压跟随器的作用。 在同相放大电路的基础上&a…...
元宇宙3D云展厅应用到汽车销售的方案及特点
为了紧紧抓住年轻消费者的需求,汽车销售行业也正在经历一场深刻的变革。在这个变革的前沿,元宇宙3D汽车展厅作为一项全新技术闪亮登场,打破了传统汽车销售模式的限制,为消费者带来了前所未有的购车体验。 元宇宙3D汽车展厅采用了尖…...
SourceTree修改Git密码
SourceTree用的好好的,无奈公司隔段时间强制更改电脑密码。更改完成后SourceTree无法使用,重新输入密码。VS的nuget也是。查资料虽然也能比较快的解决,但是。。。。在此转载记录下。 1. 找到 SourceTree 配置文件所在目录 ‘userhosts’ 目录…...
java中的深度复制和浅复制的BUG
刷题刷到LeetCode回溯DFS的算法题39题的时候,碰见一个Arraylist里面的bug,其中dfs函数里面的第一个if判断里面的语句 paths.add(path); path.clear();其中path是添加了path,但是添加之后path.clear(),导致原来添加到paths的path置为空数组,因为ArrayList的add只是把一个引用指…...
计算机毕业设计 基于SpringBoot的车辆网位置信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城一体的后台系统+HBuilderX 前端软件社区
集软件库、论坛、社区、工具箱、积分商城、会员体系、在线商城等多个功能于一体的全面后台系统加上强大的HBuilderX前端软件社区,为用户提供了全面的应用开发和交流平台 企业猫提供了完善的后台搭建服务,通过该服务,用户可以方便地搭建出所需…...
【解决Qt编译报错:-1: warning: **.so, not found(try using -rpath or -rpath-link)】
[TOC](Qt调用opencv报错👎 warning: libopencv_flann.so.406, needed by **//libopencv_features2d.so, not found (try using -rpath or -rpath-link)) 最终提示使用-rpath,于是抱着试试看的方法改写.pro文件: QMAKE_LIBDIR_FLAGS -Wl,-r…...
关于数据mysql ->maxwell->kafka的数据传输
个人名片: 🐅作者简介:一名大三在校生,热爱生活,爱好敲码! \ 💅个人主页 🥇:holy-wangle ➡系列内容: 🖼️ tkinter前端窗口界面创建与优化 &…...
【linux】查看CPU的使用率
命令1:top top 总体系统信息 uptime:系统的运行时间和平均负载。tasks:当前运行的进程和线程数目。CPU:总体 CPU 使用率和各个核心的使用情况。内存(Memory):总体内存使用情况、可用内存和缓存…...
【系统稳定性】1.6 黑屏(三)
五,QNX启动异常 qnx启动异常无疑同样是灾难级的存在。qnx是目前座舱方案中主流的存在,如果qnx存在异常会导致host或la或其他娱乐世界offline。那么导致qnx的原因有很多,相应地,我们也有很多的排查手段。 5.1 以太网连接 座舱方案中目前还是多域的设计,那么多域之间的连…...
《使用EasyExcel在Excel中增加序号列的方法》
《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时,有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能,并提供了一个示例代码。 2、正文 在处理…...
【Linux】安全审计-audit
文章目录 一、audit简介二、开启auditd服务三、相关文件四、审计规则五、审计日志查询及分析附录1:auditctl -h附录2:systemcall 类型 参考文章: 1、安全-linux audit审计使用入门 2、audit详细使用配置 3、Linux-有哪些常见的System Call&a…...
Linux 之查看标准错误码工具
目录 1. Linux 之查看标准错误码工具 1. Linux 之查看标准错误码工具 $ sudo apt install moreutils$ errno -l EPERM 1 不允许的操作 ENOENT 2 没有那个文件或目录 ESRCH 3 没有那个进程 EINTR 4 被中断的系统调用 EIO 5 输入/输出错误 ENXIO 6 没有那个设备或地址 E2BIG 7 参…...
Git企业开发级讲解(五)
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、bug 分⽀二、删除临时分支三、小结 一、bug 分⽀ 假如我们现在正在 dev2 分⽀上进⾏开发…...
目录自动清洗
文章目录 前言一、需求分析二、操作步骤详解(标准章节)1. 提取文章目录2. 更改保存目录.txt3. 二级标题前面加4个空格4. 在章字和节字后面添加一个空格5. 在页码前面加上>符号6. 代码完全体 三、进阶一(有章无节小数二级标题)1…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
