gRPC C++客户端 超时Deadline Exceeded

本文介绍了gRPC C++客户端在调用服务时遇到的超时(Deadline Exceeded)问题。通过场景还原,分析了请求是否发送、gRPC建立TCP连接失败的原因,并探讨了gRPC::Channel和stub的复用性。解决方法包括检查TCP连接、避免域名解析问题以及合理复用stub以优化资源利用。
摘要由CSDN通过智能技术生成

0.场景还原

最近许多用户说客户端登录失败,打开日志发现gRPC存根stub在调用接口错误,返回Deadline Exceeded,stub在调用接口时可以指定grpc::ClientContext,来规定超时时间,代码如下:

// 设置超时时间
grpc::ClientContext context;
gpr_timespec ts;
ts.tv_sec = 10;
ts.tv_nsec = 0;
ts.clock_type = GPR_TIMESPAN;
context.set_deadline(ts);
    
m_stub->rpcFunc(&context, request, reply);

返回Deadline Exceeded说明gRPC在调用函数时,10s没有返回结果。


1.请求到底发出去了没有?

下载tcping.exe 放在c:\WINDOWS\system32目录下 tcping -t IP Port  观察本地是否能连的上服务器的端口,Port is open说明能正常连接

PS C:\WINDOWS\system32> tcping -t 14.215.177.39 80

** Pinging continuously.  Press control-c to stop **

Probing 14.215.177.39:80/tcp - Port is open - time=40.968ms
Probing 14.215.177.39:80/tcp - Port is open - time=44.627m
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的 gRPC C++ 客户端代码示例: ```cpp #include <iostream> #include <memory> #include <string> #include <grpcpp/grpcpp.h> #include "your_service.grpc.pb.h" // 根据你的实际服务文件名称进行包含 using grpc::Channel; using grpc::ClientContext; using grpc::ClientReader; using grpc::Status; using your_service::YourRequest; using your_service::YourResponse; using your_service::YourService; class YourServiceClient { public: YourServiceClient(std::shared_ptr<Channel> channel) : stub_(YourService::NewStub(channel)) {} std::string YourRPCMethod(const std::string& input) { YourRequest request; request.set_input(input); YourResponse response; ClientContext context; Status status = stub_->YourRPCMethod(&context, request, &response); if (status.ok()) { return response.output(); } else { std::cout << "RPC failed with error code: " << status.error_code() << std::endl; return ""; } } private: std::unique_ptr<YourService::Stub> stub_; }; int main() { std::string server_address = "localhost:50051"; // 替换为你的 gRPC 服务器地址 YourServiceClient client(grpc::CreateChannel(server_address, grpc::InsecureChannelCredentials())); std::string input = "Hello, gRPC!"; // 替换为你的输入 std::string output = client.YourRPCMethod(input); std::cout << "Response: " << output << std::endl; return 0; } ``` 请记得根据你的实际情况替换 `your_service.grpc.pb.h`、`your_service::YourRequest`、`your_service::YourResponse`、`your_service::YourService`、`YourRPCMethod`、`server_address` 和输入值等内容。此示例假设你已经根据你的服务定义生成了相应的 gRPC 代码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值