前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++那些事之Step by step上手grpc

C++那些事之Step by step上手grpc

作者头像
公众号guangcity
发布2023-09-14 14:14:57
4780
发布2023-09-14 14:14:57
举报
文章被收录于专栏:光城(guangcity)

C++那些事之grpc小Demo

github上比较火的rpc有grpc、brpc,腾讯内部比较牛逼的trpc等等,这些rpc支持不同的语言、不同平台。今天来聊聊如何使用grpc,从一个简单的demo入手,整个项目使用CMake构建,一个非常标准的rpc项目管理,所有代码已更新至星球,获取方式见最后的二维码。

1.Step by Step 环境

如果你的电脑是mac,不好意思,暂时用不了最新版本的grpc,最新版本的grpc用了abseil,编译会有问题,官方暂时未解决,如果大家知道如何解决,可以留言,我这边目前未找到解决方法。

所以,建议安装低版本的grpc在你的mac上,或者在linux直接安装,linux上可以使用最新版本grpc,一次安装没有任何问题。

安装方式:

代码语言:javascript
复制
git clone -b v1.57.0 git@github.com:grpc/grpc.git

然后初始化submodule

代码语言:javascript
复制
git submodule update --init

cmake编译安装:

代码语言:javascript
复制
cd cmake
mkdir build
cd build
cmake -DgRPC_INSTALL=ON -DgRPC_BUILD_TESTS=OFF   -DCMAKE_INSTALL_PREFIX=/usr/local/grpc ../..
  
make -j8
make -j8 install // root 权限

大家可以修改上面的安装目录,注意install时需要root权限。

安装完之后,将你的bin目录配置到path,例如:

代码语言:javascript
复制
export PATH=/usr/local/grpc/bin:$PATH

2.反转字符串Demo

环境搞定了之后,我们便可以上手搞事了。

2.1 协议

第一件事是确定rpc协议:

代码语言:javascript
复制
syntax = "proto3";

package stringreverse;

service StringReverse {
    rpc sendRequest (StringRequest) returns (StringReply) {}
}

message StringRequest {
    string original = 1;
}

message StringReply {
    string reversed = 1;
}

非常简单的协议,请求一个字符串,返回一个字符串。

2.2 客户端

构造rpc请求字符串,然后调用sendRequest接口发送出去即可。

代码语言:javascript
复制
std::string str = "hello world grpc!";
std::cout << "Original string: " << str << std::endl;
StringRequest request;
StringReply reply;
ClientContext context;
request.set_original(str);
Status status = stub->sendRequest(&context, request, &reply);
if (status.ok()) {
 std::cout << "Reversed string: " << reply.reversed() << std::endl;
}
// do something

2.3 服务端

通过继承Service实现反转字符串逻辑。

代码语言:javascript
复制
class ReverseServiceImplementation final : public StringReverse::Service {
 Status sendRequest(ServerContext* context, const StringRequest* request,
                     StringReply* reply) override {
    // 反转逻辑
  }             
}

最后注册service即可:

代码语言:javascript
复制
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on port: " << server_address << std::endl;

3.运行

创建编译目录:

代码语言:javascript
复制
mkdir build
cmake ..
# 输出
-- The C compiler identification is GNU 10.2.1
-- The CXX compiler identification is GNU 10.2.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /opt/rh/devtoolset-10/root/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /opt/rh/devtoolset-10/root/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found Protobuf: /usr/local/grpc/bin/protoc-23.4.0 (found version "23.4.0") 
-- Using protobuf 
-- Using gRPC 1.57.0
-- Configuring done
-- Generating done
-- Build files have been written to: /code/stringreverse/build

make编译:

代码语言:javascript
复制
[ 10%] Generating stringreverse.pb.cc, stringreverse.pb.h, stringreverse.grpc.pb.cc, stringreverse.grpc.pb.h
Scanning dependencies of target server
[ 20%] Building CXX object CMakeFiles/server.dir/server.cc.o
[ 30%] Building CXX object CMakeFiles/server.dir/stringreverse.pb.cc.o
[ 40%] Building CXX object CMakeFiles/server.dir/stringreverse.grpc.pb.cc.o
[ 50%] Linking CXX executable server
[ 50%] Built target server
Scanning dependencies of target client
[ 60%] Building CXX object CMakeFiles/client.dir/client.cc.o
[ 70%] Building CXX object CMakeFiles/client.dir/stringreverse.pb.cc.o
[ 80%] Building CXX object CMakeFiles/client.dir/stringreverse.grpc.pb.cc.o
[ 90%] Linking CXX executable client
[100%] Built target client

运行server:

代码语言:javascript
复制
[light@i-i339drlk build]$ ./server 
Server listening on port: 0.0.0.0:5000

运行client:

代码语言:javascript
复制
[light@i-i339drlk build]$ ./client 
Original string: hello world grpc!
Reversed string: !cprg dlrow olleh
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-04 19:13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++那些事之grpc小Demo
  • 1.Step by Step 环境
  • 2.反转字符串Demo
    • 2.1 协议
      • 2.2 客户端
        • 2.3 服务端
        • 3.运行
        相关产品与服务
        项目管理
        CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档