tRPC-Cpp 支持服务端 gRPC Unary 服务,也支持客户端调用 gRPC Unary 服务。
Unary Service:可以理解为一问一答服务,是为了区别流式服务(Streaming Service)。
本文介绍如何基于 tRPC-Cpp (下面简称 tRPC)访问 gRPC Unary 服务,开发者可以了解到如下内容:
- 如何访问 gRPC Unary 服务。
- FAQ。
示例:grpc
在 tRPC 中,访问 gRPC 协议服务和访问 tRPC 协议服务过程大体一致,差异在于配置项为 protocol: grpc
。
下面参照访问 tRPC 服务过程,简单浏览下访问 gRPC 服务过程中的关键步骤:
- 获取 ServiceProxy 对象。
- 创建 ClientContext 对象。
- 发起 RPC 调用。
-
获取 ServiceProxy 对象。 获取
XxServiceProxyPtr
对象proxy
:使用GetTrpcClient()->GetProxy<XxServiceProxy>(...)
接口获取。auto proxy = ::trpc::GetTrpcClient()->GetProxy<::trpc::test::helloworld::GreeterServiceProxy>("xx_service_name")
配置项:
... client: service: - name: trpc.test.helloworld.Greeter target: 127.0.0.1:24656 protocol: grpc network: tcp selector_name: direct ...
-
创建 ClientContext 对象。 创建
ClientContextPtr
对象context
:使用::trpc::MakeClientContext(proxy)
。auto ctx = ::trpc::MakeClientContext(proxy);
-
发起 RPC 调用。调用 proto 中定义的接口,例如 helloworld.proto 中定义的 SayHello 方法。 按照选择的 runtime 类别对应使用同步接口或者异步接口。
-
同步调用示例代码:helloworld/fiber_client.cc
// 同步调用代码片段,使用 fiber runtime int DoRpcCall(const std::shared_ptr<::trpc::test::helloworld::GreeterServiceProxy>& proxy) { ::trpc::ClientContextPtr client_ctx = ::trpc::MakeClientContext(proxy); ::trpc::test::helloworld::HelloRequest req; req.set_msg("fiber"); ::trpc::test::helloworld::HelloReply rsp; ::trpc::Status status = proxy->SayHello(client_ctx, req, &rsp); if (!status.OK()) { std::cerr << "get rpc error: " << status.ErrorMessage() << std::endl; return -1; } std::cout << "get rsp msg: " << rsp.msg() << std::endl; return 0; }
-
异步调用示例代码:helloworld/future_client.cc
// 异步调用代码片段,使用 merge 或者 separate runtime int DoAsyncRpcCall(const std::shared_ptr<::trpc::test::helloworld::GreeterServiceProxy>& proxy) { ::trpc::ClientContextPtr client_ctx = ::trpc::MakeClientContext(proxy); ::trpc::test::helloworld::HelloRequest req; req.set_msg("future"); bool succ = true; auto fut = proxy->AsyncSayHello(client_ctx, req) .Then([&succ](::trpc::Future<::trpc::test::helloworld::HelloReply>&& fut) { if (fut.IsReady()) { auto rsp = fut.GetValue0(); std::cout << "get rsp msg: " << rsp.msg() << std::endl; } else { auto exception = fut.GetException(); succ = false; std::cerr << "get rpc error: " << exception.what() << std::endl; } return ::trpc::MakeReadyFuture<>(); }); return succ ? 0 : -1; }
-
暂未支持。tRPC 中的 gRPC 协议底层使用的 h2c,暂未支持 SSL(支持中)。