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

一个关于proto 文件的经验分享 :gRPC 跨语言双端通信显示错误码:12 UNIMPLEMENTED (附赠gRPC错误码表)

错误现象描述:

在使用c++的客户端向golang的服务端发送远程调用时,显示:

/home/zry/gRPC/grpc-v1.45.2/examples/cpp/DeviceData/greeter_client.cc83
12: unknown service DeviceData.DeviceDataService
Greeter 接收到: RPC 失败

这里的unknown service DeviceData.DeviceDataService是根据我自己的proto文件生成的。
proto 文件如下:

service DeviceDataService{rpc SendRTRecordData(RTRecordDatas) returns (RTRecordDataQcs){}
}

而12 是我们客户端调这个服务接口后返回的错误码

部分代码如下:

// 实际的 RPC。
Status status = stub_->SendRTRecordData(&context, request, &reply);
// 对它的状态进行操作。
if (status.ok()) {return std::to_string(reply.sensordata_size());
} else {std::cout << __FILE__ << __LINE__ << std::endl;std::cout << status.error_code() << ": " << status.error_message()<< std::endl;return "RPC 失败";
}

12status.error_code() 的输出,根据gRPC 错误码表 这里的错误是指远端调用的函数 找不到,在确认,两边的函数使用一致的情况下,我们使用同一份proto 文件。

那么,到底为什么呢?

问题原因

在得到 .proto文件的时候,这是一个golang的文件,即在文件中存在如下设置:

syntax = "proto3";option go_package = "grpc/DeviceData";
package pb;

而在c++ 中,没有option 指定的 包关键字。 所以我们使用的是 package DeviceData去设定命名空间。

也就是因为这个,导致虽然是同样的接口调用由于不是同一个命名空间,所以在服务端来说,表现就是 找不到调用方式。

解决方案

修改 proto文件的 package 关键字指定的命名空间让两边一致。问题解决。

附赠gRPC 错误码表

code描述
OK0不是错误;成功返回。
CANCELLED1操作通常由调用方取消。
UNKNOWN2未知错误。例如,当从另一个地址空间接收的值属于此地址空间中未知的错误空间时,可能会返回此错误。此外,未返回足够错误信息的 API 引发的错误可能会转换为此错误。Status
INVALID_ARGUMENT3客户端指定了无效的参数。请注意,这与 不同。 表示无论系统状态如何(例如,文件格式不正确)都存在问题的参数。FAILED_PRECONDITION``INVALID_ARGUMENT
DEADLINE_EXCEEDED4截止时间在操作完成之前已过期。对于更改系统状态的操作,即使操作已成功完成,也可能会返回此错误。例如,来自服务器的成功响应可能会延迟很长时间
NOT_FOUND5未找到某些请求的实体(例如,文件或目录)。服务器开发人员注意:如果整个类别的用户的请求被拒绝,则可以使用逐步推出功能或未记录的允许列表。如果拒绝一类用户中某些用户的请求,则必须使用基于用户的访问控制。NOT_FOUND``PERMISSION_DENIED
ALREADY_EXISTS6客户端尝试创建的实体(例如,文件或目录)已存在。
PERMISSION_DENIED7调用方没有执行指定操作的权限。 不得用于因耗尽某些资源而导致的拒绝(改用这些错误)。 如果无法识别调用方,则不得使用(对于这些错误,则改用)。此错误代码并不意味着请求有效,也不表示请求的实体存在或满足其他前提条件。PERMISSION_DENIED``RESOURCE_EXHAUSTED``PERMISSION_DENIED``UNAUTHENTICATED
RESOURCE_EXHAUSTED8某些资源已用尽,可能是每个用户的配额,或者可能是整个文件系统空间不足。
FAILED_PRECONDITION9该操作被拒绝,因为系统未处于执行该操作所需的状态。例如,要删除的目录为非空目录,将 rmdir 操作应用于非目录等。服务实现者可以使用以下准则来决定 、 和 : (a) 如果客户端可以只重试失败的调用,则使用。(b) 如果客户端应该在更高级别重试(例如,当客户端指定的测试和设置失败时,指示客户端应重新启动读-修改-写入序列),则使用该命令。(c) 如果客户端在系统状态被显式修复之前不应重试,则使用。例如,如果“rmdir”因为目录不为空而失败,则应返回,因为除非从目录中删除文件,否则客户端不应重试。FAILED_PRECONDITION``ABORTED``UNAVAILABLE``UNAVAILABLE``ABORTED``FAILED_PRECONDITION``FAILED_PRECONDITION
ABORTED10操作已中止,通常是由于并发问题(如排序器检查失败或事务中止)造成的。请参阅上面的准则,在 、 和 之间做出决定。FAILED_PRECONDITION``ABORTED``UNAVAILABLE
OUT_OF_RANGE11尝试的操作超出了有效范围。例如,查找或读取过去的文件末尾。与 不同,此错误表示如果系统状态发生更改,该问题可能会得到解决。例如,如果要求以不在 [32,0^2-32] 范围内的偏移量读取,则将生成 1 位文件系统,但如果要求从超过当前文件大小的偏移量读取,则将生成 <> 位文件系统。和 之间存在相当多的重叠。我们建议在应用时使用(更具体的错误),以便循环访问空间的调用方可以轻松查找错误以检测错误何时完成。INVALID_ARGUMENT``INVALID_ARGUMENT``OUT_OF_RANGE``FAILED_PRECONDITION``OUT_OF_RANGE``OUT_OF_RANGE``OUT_OF_RANGE
UNIMPLEMENTED12此服务中未实现或不支持/启用该操作。
INTERNAL13内部错误。这意味着底层系统预期的一些不变量已被打破。此错误代码保留用于严重错误。
UNAVAILABLE14该服务目前不可用。这很可能是暂时性情况,可以通过回退重试来纠正。请注意,重试非幂等操作并不总是安全的。
DATA_LOSS15不可恢复的数据丢失或损坏。
UNAUTHENTICATED16该请求没有用于该操作的有效身份验证凭据。

下表列出了 gRPC 库(在客户端或服务器端)可能返回的代码,并总结了生成这些代码的情况。

boxcode在客户端或服务器上生成
客户端应用程序取消了请求CANCELLED
截止时间在服务器返回状态之前过期DEADLINE_EXCEEDED
在服务器上找不到方法UNIMPLEMENTED服务器
服务器关闭UNAVAILABLE服务器
服务器端应用程序引发异常(或执行除返回状态代码以终止 RPC 之外的操作)UNKNOWN服务器
在截止日期到期之前未收到任何回复。当客户端无法向服务器发送请求或服务器无法及时响应时,可能会发生这种情况。DEADLINE_EXCEEDED
在连接中断之前传输的一些数据(例如,写入TCP连接的请求元数据)UNAVAILABLE客户
无法解压缩,但支持压缩算法(客户端 -> 服务器)INTERNAL服务器
无法解压缩,但支持压缩算法(服务器 -> 客户端)INTERNAL客户
服务器不支持客户端使用的压缩机制UNIMPLEMENTED服务器
服务器暂时资源不足(例如,已达到流量控制资源限制)RESOURCE_EXHAUSTED服务器
客户端没有足够的内存来保存服务器响应RESOURCE_EXHAUSTED客户
流量控制协议冲突INTERNAL
解析返回状态时出错UNKNOWN客户
身份验证元数据不正确(凭据无法获取元数据、在通道和呼叫上设置的凭据不兼容、元数据中设置的主机无效等):authorityUNAUTHENTICATED未经身份验证
请求基数冲突(方法只需要一个请求,但客户端发送了一些其他数量的请求)UNIMPLEMENTED未执行服务器
响应基数冲突(方法只需要一个响应,但服务器发送了其他数量的响应)UNIMPLEMENTED未执行客户
解析响应 proto 时出错INTERNAL内部客户
解析请求 proto 时出错INTERNAL内部服务器
发送或接收的消息大于配置的限制RESOURCE_EXHAUSTED
Keepalive 看门狗超时UNAVAILABLE不能利用的

库从不生成以下状态代码:

  • INVALID_ARGUMENT
  • NOT_FOUND
  • ALREADY_EXISTS
  • FAILED_PRECONDITION
  • 中止
  • OUT_OF_RANGE
  • DATA_LOSS

可能希望重试失败的 RPC 的应用程序必须决定重试哪些状态代码。如上表所示,gRPC 库可以针对不同的情况生成相同的状态码。服务器应用程序也可以返回这些相同的状态代码。因此,没有适合在所有应用程序中重试的状态代码的固定列表。因此,各个应用程序必须自行确定哪些状态代码应导致重试 RPC。


分享一个有趣的 学习链接:https://xxetb.xet.tech/s/HY8za

相关文章:

一个关于proto 文件的经验分享 :gRPC 跨语言双端通信显示错误码:12 UNIMPLEMENTED (附赠gRPC错误码表)

错误现象描述&#xff1a; 在使用c的客户端向golang的服务端发送远程调用时&#xff0c;显示&#xff1a; /home/zry/gRPC/grpc-v1.45.2/examples/cpp/DeviceData/greeter_client.cc83 12: unknown service DeviceData.DeviceDataService Greeter 接收到: RPC 失败这里的unkn…...

腾讯极光盒子A4021增强版_线刷官方

1、用USB_Burning_Tool线刷提供的线刷包,所需资料地址在最后 1)打开USB_Burning_Tool,选择资料里的A4021_line_flash_root.img(文件夹最好没有中文字符和空格),然后点击【开始】。 2)盒子准备好双USB线和电源。在1秒内先插入电源,再插入usb口。等这个软件识别到盒子,…...

机器学习第11天:降维

文章目录 机器学习专栏 主要思想 主流方法 投影 二维投射到一维 三维投射到二维 流形学习 PCA主成分分析 介绍 代码 内核PCA 具体代码 LLE 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 主要思想 介绍&#xff1a;当一个任务有很多特征时&#xff0c;我们…...

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)

内容提要: 如果说,爬取网页数据的时候,我们使用了异步,那么将数据放入redis里面,其实也需要进行异步;当然,如果使用多线程或者redis线程池技术也是可以的,但那会造成冗余; 因此,在测试完多线程redis搭配异步爬虫的时候,我发现效率直接在redis这里被无限拉低下来! 因此: 最终的r…...

VSCode新建Vue项目

前言 Vue.js 是一款流行的 JavaScript 前端框架&#xff0c;它可以帮助开发者轻松构建高性能、可扩展的 Web 应用程序。而 VSCode 则是一款功能强大的开源代码编辑器&#xff0c;它提供了许多有用的工具和插件&#xff0c;可以大幅提高开发效率。 在本文中&#xff0c;我们将…...

前端学习--React(1)

一、React简介 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势&#xff1a;组件化开发、不错的性能、丰富生态&#xff08;所有框架中最好&#xff09;、跨平台&#xff08;web、ios、安卓&#xff09; 开发环境搭建 打开相应文件夹 新建终端并…...

HarmonyOS从基础到实战-高性能华为在线答题元服务

最近看到美团、新浪、去哪儿多家互联网企业启动鸿蒙原生应用开发&#xff0c;这个HarmonyOS NEXT越来越引人关注。奈何当前不面向个人开发者开放&#xff0c;但是我们可以尝试下鸿蒙新的应用形态——元服务的开发。 元服务是基于HarmonyOS提供的一种面向未来的服务提供方式&…...

OpenCV快速入门:窗口交互

文章目录 前言一、鼠标操作1.1 鼠标操作简介1.2 鼠标事件类型&#xff08;event类型&#xff09;1.3 鼠标事件标志&#xff08;flags&#xff09;1.4 代码示例1.4.1 获取鼠标坐标位置1.4.2 监听鼠标滚轮事件1.4.3 在图像中显示鼠标坐标 二、键盘操作2.1 代码示例2.2 waitKey的等…...

数据智能引擎:企业模糊搜索API精准获取企业列表信息

引言 随着信息时代的迅速发展&#xff0c;数据变得愈加庞大和复杂。在这个大数据的时代&#xff0c;企业面临着海量信息的管理和利用挑战。为了更有效地获取并利用数据&#xff0c;企业信息模糊搜索API成为了企业数据智能引擎的一部分&#xff0c;为企业提供了精准的企业列表检…...

汇编-间接寻址(处理数组)

直接寻址很少用于数组处理&#xff0c;因为用常数偏移量来寻址多个数组元素时&#xff0c;直接寻址并不实用。取而代之的是使用寄存器作为指针(称为间接寻址(indirect addressing) ) 并控制该寄存器的值。如果一个操作数使用的是间接寻址&#xff0c; 就称之为间接操作数(indie…...

lombok 的使用讲解

目录 前言1. 基本知识2. 代码应用 前言 在项目中经常会看到lombok的应用&#xff0c;此文作为科普帖&#xff0c;详细介绍lombok 1. 基本知识 简介&#xff1a; Project Lombok是一款用于Java开发的工具&#xff0c;旨在通过自动生成样板代码来简化Java代码的编写。 它通过注…...

echarts的使用

1. 普通版 其实主要就是option1&#xff0c;option1就是画的图 echats不能响应刷新&#xff0c;要想实时刷新监听刷新的值重新调用一下方法即可 html <div class"echart" style"width: 100%;height: calc(100% - 130px)" ref"main1">&l…...

js进阶笔记之构造函数

目录 一、构造函数 1、 创建对象 2、new执行过程 3、带参数构造函数 4、实例成员与静态成员 二、内置构造函数 1、Object静态方法 2、包装类型 3、Array 1、map方法 2、find方法 3、findIndex( ) 4、some与every 5、reverse() 6、reduce方法 7、forEach() …...

Codesys数据类型(2.7):扩展数据类型之 别名 详解

Codesys代码代写&#xff0c;程序开发&#xff0c;软件定制&#xff0c;bug修改&#xff0c;问题咨询&#xff1a; T宝搜索店铺【林磊教育】 定义及声明 别名的目的是声明出 基本数据类型&#xff0c;结构体&#xff0c;枚举、共用体(UNION)、功能块、指针备用名字&#xff0c…...

白盒子测试总结

白盒子测试&#xff0c;也称为结构测试、透明盒测试、逻辑驱动测试或基于代码的测试&#xff0c;是一种测试用例的设计方法。白盒测试需要全面了解被测试程序的内部逻辑结构&#xff0c;并对所有逻辑路径进行测试。其基本方法包括&#xff1a; 语句覆盖&#xff1a;设计若干个…...

字符数组基础知识

字符数组是存放字符数据的数组&#xff0c;其中每一个元素存放的值都是单个字符。 字符数组&#xff1a;由字符类型的元素组成&#xff0c;其定义与初始化方式&#xff0c;以及对数组元素的引用都与整数数组类似&#xff0c;代码示例 char c[5]{h,e,l,l,,o}; 注意&#xff1…...

Oracle EBS 重新打开库存会期间

由库存某些账务用户操作错误,如:汇率错误、单位转换错误、BOM单据用量错误,需要反向操作纠正少量而有影响成本比较大的数据。但是,库存会计期已经关闭,需要重新打开库存会计期。根据官方文整理一份重新打开库存期间的脚本: 测试Oracle EBS版本: RDBMS : 12.1.0.2.0 Orac…...

java项目之社区互助平台(ssm+vue)

项目简介 社区互助平台实现了以下功能&#xff1a; 1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。2、管理员的功能及权限 用户信息的添…...

unity C#设置文件为不可见

unity C#设置文件为不可见 /// ///设置文件为隐藏// /// using UnityEngine; using System.IO;public class SetFolderInvisible : MonoBehaviour {private void Start(){string folderPath "Qi/Video";// 将文件夹属性设置为隐藏和系统SetFolderAttributes(folder…...

DITTEL控制器维修SENSITRON6-2AE

DITTEL工控产品维修包括&#xff1a;德国DITTEL平衡测试仪维修,DITTEL模块&#xff0c;过程监控模块&#xff0c;DITTEL控制器&#xff0c;平衡头&#xff0c;机电平衡头&#xff0c;显示器&#xff0c;平衡系统等产品。 DITTEL过程控制模块维修 DM6000是一个过程控制模块&…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...