掌握 gRPC:从安装到构建第一个 C++ 和 Python 微服务
gRPC(Google Remote Procedure Call)是一个高性能、开源的远程过程调用(RPC)框架,它支持多种编程语言,并且可以在不同的系统之间实现高效的通信。本文将介绍如何安装 gRPC,并构建一个简单的 C++ 和 Python 微服务。
一、环境准备与安装
首先,我们需要安装 gRPC。以下是在 Ubuntu 系统下的安装步骤:
-
安装依赖包:
bash sudo apt update sudo apt install -y build-essential autoconf libtool pkg-config sudo apt install -y clang libc++-dev
-
克隆 gRPC 仓库:
bash git clone -b v1.40.0 https://github.com/grpc/grpc.git cd grpc git submodule update --init
-
编译和安装:
bash mkdir -p cmake/build cd cmake/build cmake .. make sudo make install
-
安装 Python gRPC 库:
bash pip install grpcio grpcio-tools
二、定义服务
在 gRPC 中,我们通常通过 Protocol Buffers(protobuf)来定义服务接口。创建一个名为 helloworld.proto
的文件,内容如下:
syntax = "proto3";
package helloworld;
// 定义服务
service Greeter {
// 定义一个方法
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// 请求消息
message HelloRequest {
string name = 1;
}
// 响应消息
message HelloReply {
string message = 1;
}
三、生成代码
在终端中运行以下命令,生成 C++ 和 Python 的 gRPC 代码:
# 生成 C++ 代码
protoc -I. --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto
# 生成 Python 代码
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
四、实现服务端(C++)
创建一个名为 server.cpp
的文件,并编写以下代码:
#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
#include "helloworld.pb.h"
#include "helloworld.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using helloworld::Greeter;
using helloworld::HelloRequest;
using helloworld::HelloReply;
class GreeterServiceImpl final : public Greeter::Service {
Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
std::string prefix("Hello ");
reply->set_message(prefix + request->name());
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
GreeterServiceImpl 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;
}
五、实现客户端(Python)
创建一个名为 client.py
的文件,编写以下代码:
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name='world'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()
六、运行服务
-
启动服务端:
bash g++ server.cpp helloworld.pb.cc helloworld.grpc.pb.cc -o server -lgrpc++ -lprotobuf -lpthread ./server
-
启动客户端:
bash python client.py
总结
通过以上步骤,我们成功构建了一个简单的 gRPC 微服务框架,包含 C++ 实现的服务端和 Python 实现的客户端。gRPC 提供了一种快速、高效的方式来实现微服务之间的通信。希望本文能够帮助你理解 gRPC 的基本用法,并引导你进行更复杂的应用开发。