分兩種情況,一種是普通調用,一種是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