一个关于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch的backward()的底层实现逻辑

自动微分是一种计算张量&#xff08;tensors&#xff09;的梯度&#xff08;gradients&#xff09;的技术&#xff0c;它在深度学习中非常有用。自动微分的基本思想是&#xff1a; 自动微分会记录数据&#xff08;张量&#xff09;和所有执行的操作&#xff08;以及产生的新张…

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码

基于梯度算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于梯度算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于梯度优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

细说MySQL数据类型

TOC 目录 MySQL数据类型 数据类型分类 数值类型 tinyint类型 有符号tinyint范围测试 无符号tinyint范围测试 bit类型 bit类型的显示方式 bit类型的范围测试 float类型 有符号float范围测试 无符号float范围测试 decimal类型 字符串类型 char类型 char类型测试 …

Ubuntu 18.04/20.04 LTS 操作系统设置静态DNS

1、nano /etc/systemd/resolved.conf 2、修改配置 使用DNS服务器&#xff1a;223.5.5.5 223.6.6.6 [Resolve] DNS223.5.5.5 223.6.6.6 3、重启服务 systemctl restart systemd-resolved.service 4、查看解析文件 cat /run/systemd/resolve/resolv.conf # This file is man…

Jmeter 如何监控目标服务的系统资源

下载Jmeter插件管理下载 perfmon 将这个插件管理放到Jmeter的\lib\ext目录下 然后重启Jmeter jmeter-plugins-manager-1.10.jar 下载 perfmon插件 添加 io 内存 磁盘的监听 并且添加监听 在宿主机中安装代理监听程序 并启动 ServerAgent.tar.gz

数据结构-插入排序

插入排序 插入排序的三种常见方法&#xff1a; 直接插入排序、折半插入排序、希尔排序。 数据存储结构 因为我们是用的是C语言来实现算法&#xff0c;因此我们需要创建一个结构体&#xff0c;用来存放初始数据。 结构体定义如下&#xff1a; #define MAX 100 typedef int…

设计原则 | 开放封闭原则

一、开放封闭原则&#xff08;OCP&#xff1a;Open-Closed Principle&#xff09; 1、原理 软件实体&#xff08;类、模块、函数等等&#xff09;应该是可以扩展的&#xff0c;但是不可修改的。如果程序中的一处改动就会引发连锁反应&#xff0c;导致一些列相关模块的修改&…

GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)

GPT实战系列-如何使用P-Tuning本地化训练ChatGLM2等LLM模型&#xff1f;(二) 文章目录 GPT实战系列-1.训练参数配置传递2.训练前准备3.训练参数配置4.训练对象&#xff0c;seq2seq训练5.执行训练6.训练模型评估依赖数据集的预处理 P-Tuning v2 将 ChatGLM2-6B 模型需要微调的参…

MATLAB 嵌套switch语句||MATLAB while循环

MATLAB 嵌套switch语句 在 MATLAB 中嵌套 switch 语句是可能的&#xff0c;可以在 switch 一部分外嵌套 switch 语句序列。即使 case 常量的内部和外部的 switch 含有共同的值&#xff0c;也不算冲突出现。 MATLAB嵌套switch语句语法 嵌套switch语句的语法如下&#xff1a; s…

012 C++ AVL_tree

前言 本文将会向你介绍AVL平衡二叉搜索树的实现 引入AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序普通的二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M…

学习模拟简明教程【Learning to simulate】

深度神经网络是一项令人惊叹的技术。 有了足够的标记数据&#xff0c;他们可以学习为图像和声音等高维输入生成非常准确的分类器。 近年来&#xff0c;机器学习社区已经能够成功解决诸如对象分类、图像中对象检测和图像分割等问题。 上述声明中的加黑字体警告是有足够的标记数…

OpenHarmony源码下载

OpenHarmony源码下载 现在的 OpenHarmony 4.0 源码已经有了&#xff0c;在 https://gitee.com/openharmony 地址中&#xff0c;描述了源码获取的方式&#xff0c;但那是基于 ubuntu 或者说是 Linux 的下载方式。在 windows 平台下的下载方式没有做出介绍。 我自己尝试了 wind…

PCIe协议加持,SD卡9.1规范达到媲美SSD的速度4GB/s

近日&#xff0c;SD协会&#xff08;SDA&#xff09;宣布了最新的SD Express存储卡的进化&#xff0c;将microSD Express存储卡的速度提高了一倍&#xff0c;达到2GB/s&#xff0c;并引入了4个新的SD Express速度等级&#xff0c;以确保新的SD 9.1规范中最低的顺序性能水平。这…

【Qt开发流程】之HelloWorld程序

【Qt开发流程】之HelloWorld程序 目的编写程序新建项目文件说明及界面设计 程序运行及发布程序运行程序发布手动构建使用windeployqt进行构建 设置应用程序图标修改快捷键类型列表命令行编译程序命令行编译.ui文件自定义类项目模式及项目文件介绍项目模式项目文件 目的 从Hell…

【Linux 源码阅读记录】设备树解析 of 相关代码

前言 最近移植接触 Linux 的设备树解析相关的代码&#xff0c;对 Linux of &#xff08;open firmware&#xff09;设备树解析代码比较感兴趣。 可以通过阅读Linux 大量的优秀代码&#xff0c;增强一些编程与编码的技巧与经验 切入点 of_device_is_available &#xff1a;设…

通过bat脚本控制Oracle服务启动停止

1、将Oracle服务全部设置为手动启动 初始安装Oracle之后服务启动状态&#xff1a; 2、服务功能介绍 3、构建服务启动/停止bat脚本 注意&#xff1a;编码选择ANSI(如果编码不是ANSI运行脚本会显示乱码) echo off :main cls echo 注&#xff1a;请保证该脚本是使用管理员权限…

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…

c++ binary_semaphore 使用详解

c binary_semaphore 使用详解 std::binary_semaphore c20 头文件 #include <semaphore>。作用&#xff1a;二进制信号量&#xff0c;轻量同步元件&#xff0c;能控制对共享资源的互斥访问。 std::binary_semaphore 成员函数 release&#xff1a;增加内部计数器并解除…

Java —— 抽象类和接口

目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …

探索arkui(2)--- 布局(列表)--- 1(列表数据的展示)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…