金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks

用grpc_cb代替grpc++

(金庆的专栏 2017.1)

jinq0123/grpc_cb
是 Google gRpc 的C++库。
它依赖于 grpc, 采用回调接口,简化了使用,用来代替 grpc++ 库。

使用简介如下。

定义服务

用 proto 文件定义服务:

 

// See examples/protos/route_guide.proto.

syntax = "proto3";

package routeguide;

// Interface exported by the server.
service RouteGuide {
  // A simple RPC.
  rpc GetFeature(Point) returns (Feature) {}
}

message Point {
  int32 latitude = 1;
  int32 longitude = 2;
}

message Feature {
  string name = 1;
  Point location = 2;
}
生成服务器和客户端代码

 

详见:examples/protos/generate.bat

        protoc.exe -I . --cpp_out=../cpp_cb/route_guide route_guide.proto
        protoc.exe -I . --grpc_out=../cpp_cb/route_guide --plugin=protoc-gen-grpc=grpc_cpp_cb_plugin.exe route_guide.proto
在examples/cpp_cb/route_guide/ 生成以下文件:
  • route_guide.pb.h, 消息类定义
  • route_guide.pb.cc, 消息类实现
  • route_guide.grpc_cb.pb.h, 服务类定义
  • route_guide.grpc_cb.pb.cc, 服务类实现

生成的命名空间RouteGuide将包含

  • 客户端使用的Stub类.
  • 需服务器实现的Service类.

客户端调用RPC

同步调用

ChannelSptr channel(new Channel("localhost:50051"));
Stub stub(channel);

Point point = MakePoint(0, 0);
Feature feature;
Status status = stub.BlockingGetFeature(point, &feature);

异步调用

stub.AsyncGetFeature(point,
[](const Feature& feature) {
cout << feature.name() << endl;
});

服务器实现

先实现服务类

    class RouteGuideImpl final : public routeguide::RouteGuide::Service {
    public:
        void GetFeature(const Point& point,
                const GetFeature_Replier& replier) override {
            Feature feature;
            feature.set_name("...");
            replier.Reply(feature);
        }    
    }
GetFeature()不必立即应答,可复制保存replier后直接返回, 待应答内容准备完成后,再调用Reply().

开启服务
    Server svr;
    svr.AddListeningPort("0.0.0.0:50051");
    RouteGuideImpl service(db_path);
    svr.RegisterService(service);
    svr.BlockingRun();
posted on 2017-01-22 18:06 金庆 阅读(786) 评论(0)  编辑 收藏 引用 所属分类: 1. C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理