分两种情况,一种是普通调用,一种是stream调用。
(1)普通调用
直接使用返回的status来检查。不过如果请求本身就可能失败,不是因为server没有启动的原因,则可以进一步检查error_message的内容。
普通调用下的server可连接性检查,应该也可以使用stream调用描述的方式,可能更加准确,但是没有实验过。
grpc::ClientContext context;
GetSomethingRequest request;
request.set_xxx(123);
GetSomethingResponse response;
grpc::Status status = stub.GetSomething(&context, request, &response);
if(!status.ok()) {
std::cerr << "request failed: " << status.error_message();
}
(2)stream调用
auto channel = grpc::CreateChannel(address, grpc::InsecureChannelCredentials());
auto stub = MyService::NewStub(channel);
ClientContext context;
GetSomethingRequest request;
std::unique_ptr<grpc::ClientReader<GetSomethingResponse>> reader(
stub->GetSomething(&context, request));
if (channel->GetState(true) != GRPC_CHANNEL_READY) {
std::cerr << "message bridge service not available";
}
可以通过channel的GetState方法来确定,不过需要在客户端发出请求后再去检查,客户端仅仅是初始化了channel但是没有发送过请求的时候,GetState的返回值不会是GRPC_CHANNEL_READY