gprc python调用c++远程服务

发布时间 2023-06-08 23:28:05作者: 阳光中的影子

 

 客户端和服务端之间不是直接通信的,需要通过生成的代码和protocol buffers传输协议(可使用其他传输协议替换)进行通信。

开发步骤:

 

 

1. .proto文件----message和service

message是消息类型,定义参数,service是接口类型,定义远程服务的方法

在grpc中有四种类型的服务方法:参考

1.简单rpc,即一元消息:客户端向服务端发送一个请求,服务端响应,类似普通的函数调用 

rpc SimpleRPC(HelloRequest) returns (HelloResponse);

2.服务端流式rpc:客户端向服务端发送一个请求,服务端返回一个流。客户端可以从这个流中读取,直到服务端关闭这个流。

rpc ServerSideStreamingRPC(HelloRequest) returns (stream HelloResponse);

流式传输方式就是不将数据一次性传输完,数据被划分为小块传输,每个小块传输完后可以立即处理,减少等待时间,提高传输效率,但是可靠性可能会降低。】

3.客户端流式rpc:客户端向服务端发起流式请求,客户端可以多次向流中写入数据,服务端从流中多次读取数据直到客户端关闭流。服务端处理完所有数据后,向客户端返回普通响应。

rpc ClientSideStreamingRPC(stream HelloRequest) returns (HelloResponse);

4.双向流式rpc:客户端发起流式请求,服务端返回流式响应。两个流相互独立,互不影响。

rpc BidrectionalStreamingRPC(stream HelloRequest) returns (stream HelloResponse);

 

编写.proto代码后,运行下面的两个命令分别生成两个py文件,.cc和.h文件

python需要安装grpcio模块和grpcio-tools工具,直接用pip安装即可

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. example.proto
protoc -I ./ --grpc_out=./ --plugin=protoc-gen-grpc=./grpc/cmake/build/grpc_cpp_plugin ./example.proto    //自动生成example.grpc.pb.cc和example.grpc.pb.h文件

 生成的代码中

namespac::grpc::service是grpc c++库的一个基类,用于定义grpc服务的接口,它是一个抽象类为派生类提供了处理grpc请求的能力。

::grpc::service中定义了一组虚函数用来处理特定服务中定义的rpc方法,这些虚函数应该在派生类中被实现以处理客户端请求并生成响应。

 

2.使用简单rpc编写客户端python代码和服务端c++代码

 简单编写后遇到以下问题:当前还没解决

 

简单编写客户端代码后,思考一个问题,由于客户端处理的是多维数据,传递给服务端的矩阵形状为[L, P, P, B],以及一个数组np.array([L, P, P, B]),c++服务端返回给客户端的矩阵形状是[B, B]。python传递的是numpy数组,c++端怎样接收。

 

 

对于服务端代码,在.grpc.pb.h中找到自动生成的服务类的虚函数,新建一个cpp文件,其中继承该类并实现其中的虚函数。

 

遇到的问题记录:

在简单编写服务端代码后,进行编译和链接,编译无问题(gcc -c server.cpp 执行后生成了server.o目标文件),链接阶段出现了很多undefined reference to...的问题。可能是没有找到需要链接的库,关于这一方面我其实现在不是特别清楚为什么它找不到需要链接的库。

 

grpc在编译和安装后会生成哪些文件,分别位于什么位置?

会生成grpc插件文件:这些文件用于根据.proto文件完成客户端和服务端代码的生成,例如grpc_cpp_plugin等,

编译生成的库文件:编译和安装过程将生成静态库文件和动态库文件,用于在应用程序中链接和使用grpc,通常生成的库文件会被安装到系统库目录或指定目录中。我系统上安装到了/usr/local/include/grpc下面。

通过在网上找相关问题,可能是RTTI和no-RTTI同时存在的问题,对于这个可以问题可以看这篇博客,另外,这篇是个人学习记录