Clion上搭建基于grpc的service与client实例

2024-06-11 16:48

本文主要是介绍Clion上搭建基于grpc的service与client实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里假设protobuf,grpc,zlib等前置库都已经安装好了。
 

1.新建protobuf文件

syntax = "proto3";
message SearchRequest
{string Request = 1;
}
message SearchResponse
{string Response = 2;
}
service SearchService 
{rpc Search (SearchRequest) returns (SearchResponse);
}

2.生成protobuf和grpc手脚架文件

protoc --cpp_out=./ param.proto
protoc --grpc_out=./ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_cpp_plugin param.proto

查看protobuf生成的文件,可以看到工具为我们生成了一系列的函数。

getter 函数具有与字段名一模一样的名字,并且是小写的,而 setter 函数都是以 set_ 前缀开头。此外,还有 has_ 前缀的函数,对每一个单一的(required 或 optional 的)字段来说,如果字段被置(set)了值,该函数会返回true。最后,每一个字段还有一个 clear_ 前缀的函数,用来将字段重置(un-set)到空状态(empty state)。

然而,数值类型的字段 id 就只有如上所述的基本读写函数,name 和email 字段则有一些额外的函数,因为它们是 string——前缀为 mutable_的函数返回 string 的直接指针(direct pointer)。除此之外,还有一个额外的setter函数。注意:你甚至可以在 email 还没有被置(set)值的时候就调用 mutable_email(),它会被自动初始化为一个空字符串。在此例中,如果有一个单一消息字段,那么它也会有一个 mutable_ 前缀的函数,但是没有一个 set_ 前缀的函数。

重复的字段也有一些特殊的函数——如果你看一下重复字段 phone 的那些函数,就会发现你可以:
(1)得到重复字段的 _size(换句话说,这个 Person 关联了多少个电话号码)。
(2)通过索引(index)来获取一个指定的电话号码。
(3)通过指定的索引(index)来更新一个已经存在的电话号码。
(4)向消息(message)中添加另一个电话号码,然后你可以编辑它(重复的标量类型有一个add_前缀的函数,允许你传新值进去)。

关于枚举和嵌套类(Enums and Nested Classes)。
生成的代码中包含了一个PhoneType 枚举,它对应于.proto文件中的那个枚举。你可以把这个类型当作Student::PhoneType,其值为Student::MOBILE和Student::HOME(实现的细节稍微复杂了点,但是没关系,不理解它也不会影响你使用该枚举)。

编译器还生成了一个名为 Student::PhoneNumber 的嵌套类。如果你看看代码,就会发现“真实的”类实际上是叫做Student_PhoneNumber,只不过Student内部的一个typedef允许你像一个嵌套类一样来对待它。这一点所造成的唯一的一个区别就是:如果你想在另一个文件中对类进行前向声明(forward-declare)的话,你就不能在C++中对嵌套类型进行前向声明了,但是你可以对Student_PhoneNumber进行前向声明。

可以查看官方文档获取更多信息:

https://developers.google.com/protocol-buffers/docs/reference/cpp-generated

3.service端代码

文件目录:
Service
├── CMakeLists.txt
└── src├── main.cpp└── protos├── param.grpc.pb.cc├── param.grpc.pb.h├── param.pb.cc├── param.pb.h└── param.proto

main.cpp内容:

#include <iostream>
#include <memory>
#include <string>#include <grpc++/grpc++.h>
#include <grpc++/server.h>
#include <grpc++/server_builder.h>
#include <grpc++/server_context.h>#include "param.grpc.pb.h"using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;class SearchRequestImpl final : public SearchService::Service {Status Search(ServerContext* context, const SearchRequest* request,SearchResponse* reply) override {std::string prefix("Hello ");reply->set_response(prefix + request->request());return Status::OK;}
};void RunServer() {std::string server_address("0.0.0.0:50051");SearchRequestImpl service;ServerBuilder builder;builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());builder.RegisterService(&service);std::unique_ptr<Server> server(builder.BuildAndStart());std::cout << "Server listening on " << server_address << std::endl;server->Wait();
}int main(int argc, char** argv) {RunServer();return 0;
}

4.CMakeList.txt文件

cmake_minimum_required(VERSION 3.13)
project(Service)set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS -std=c++11)
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 -pthread")
set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall ${CMAKE_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -Wl,-allow-multiple-definition -Wl,--eh-frame-hdr")
set(CMAKE_MODULE_PATH /home/CLionProjects/Service/cmake)   //这里是指明查找grpc库的位置,会自动去这个目录下找Find_grpc.cmake文件aux_source_directory(src/ LIST_SRC)
aux_source_directory(src/protos LIST_SRC)add_executable(Service ${LIST_SRC})include_directories(Service src/protos)find_package(grpc REQUIRED)
include_directories(Service ${grpc_INCLUDE_DIRS})
target_link_libraries(Service ${grpc_LIBRARIES})find_package(ZLIB)
include_directories(Service ${ZLIB_INCLUDE_DIRS})
target_link_libraries(Service ${ZLIB_LIBRARIES})
target_link_libraries(Service pthread)

5.配置Find_grpc.cmake

set(SHEEP_PROJECT_SOURCE_DIR /root)
set(PACKAGE_PATH ${SHEEP_PROJECT_SOURCE_DIR}/grpc)
set(grpc_INCLUDE_DIRS ${SHEEP_PROJECT_SOURCE_DIR}/grpc/include)
set(grpc_INCLUDE_DIRS ${grpc_INCLUDE_DIRS} ${SHEEP_PROJECT_SOURCE_DIR}/grpc/third_party/protobuf/src)
SET(GRPCC++_LIBRARIES ${PACKAGE_PATH}/build/libgrpc++.a)
SET(GRPC_LIBRARIES ${PACKAGE_PATH}/build/libgrpc.a)
SET(PROTOBUF_LIBRARIES ${PACKAGE_PATH}/build/libprotobuf.a)
FIND_LIBRARY(RT_LIBRARIES librt.a PATH ${PACKAGE_PATH}/build)
SET(grpc_LIBRARIES ${GRPCC++_LIBRARIES} ${GRPC_LIBRARIES} ${PROTOBUF_LIBRARIES} ${RT_LIBRARIES})

6.Client

与Service相比只有main.cpp不同

#include <iostream>
#include <memory>
#include <string>#include <grpc++/grpc++.h>
#include <grpc/support/log.h>#include "param.grpc.pb.h"using grpc::Channel;
using grpc::ClientAsyncResponseReader;
using grpc::ClientContext;
using grpc::CompletionQueue;
using grpc::Status;class ExampleClient {
public:explicit ExampleClient(std::shared_ptr<Channel> channel): stub_(SearchService::NewStub(channel)) {}std::string Search(const std::string& user) {SearchRequest request;request.set_request(user);SearchResponse reply;ClientContext context;CompletionQueue cq;Status status;std::unique_ptr<ClientAsyncResponseReader<SearchResponse> > rpc(stub_->AsyncSearch(&context, request, &cq));rpc->Finish(&reply, &status, (void*)1);void* got_tag;bool ok = false;GPR_ASSERT(cq.Next(&got_tag, &ok));GPR_ASSERT(got_tag == (void*)1);GPR_ASSERT(ok);if (status.ok()) {return reply.response();} else {return "RPC failed";}}private:std::unique_ptr<SearchService::Stub> stub_;
};int main(int argc, char** argv) {ExampleClient client(grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials()));std::string user("world");std::string reply = client.Search(user);  // The actual RPC call!std::cout << "client received: " << reply << std::endl;return 0;
}

 

这篇关于Clion上搭建基于grpc的service与client实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051738

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen