在 Linux 系統(tǒng)下,要將 Protocol Buffers(protobuf)和 gRPC 集成在一起,你需要按照以下步驟操作:
安裝 Protocol Buffers 編譯器(protoc):
首先,確保你已經(jīng)安裝了 Protocol Buffers 編譯器(protoc)。如果沒有,請從官方網(wǎng)站下載并安裝:https://developers.google.com/protocol-buffers/docs/downloads
對于 Ubuntu/Debian 系統(tǒng),可以使用以下命令安裝:
sudo apt-get install protobuf-compiler
安裝 gRPC:
接下來,安裝 gRPC。對于 Ubuntu/Debian 系統(tǒng),可以使用以下命令安裝:
sudo apt-get install libgrpc++-dev
對于其他 Linux 發(fā)行版,請參考 gRPC 官方文檔中的安裝說明:https://github.com/grpc/grpc/blob/master/BUILDING.md
編寫 .proto 文件:
創(chuàng)建一個新的 .proto 文件,定義你的服務(wù)和消息。例如,創(chuàng)建一個名為 example.proto
的文件,內(nèi)容如下:
syntax = "proto3";
package example;
service ExampleService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
生成 gRPC 代碼:
使用 protoc 編譯器和 gRPC 插件生成 C++ 代碼。例如,運行以下命令:
protoc -I . --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.proto
這將生成兩個文件:example.pb.h
和 example.pb.cc
(包含 protobuf 消息類)以及 example.grpc.pb.h
和 example.grpc.pb.cc
(包含 gRPC 服務(wù)類)。
編寫 gRPC 服務(wù)器和客戶端代碼:
根據(jù)生成的代碼,實現(xiàn)你的服務(wù)器和客戶端。例如,創(chuàng)建一個名為 server.cpp
的文件,實現(xiàn)服務(wù)器端代碼:
#include<iostream>
#include<memory>
#include<string>
#include <grpc++/grpc++.h>
#include "example.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using example::ExampleService;
using example::HelloRequest;
using example::HelloResponse;
class ExampleServiceImpl final : public ExampleService::Service {
Status SayHello(ServerContext* context, const HelloRequest* request, HelloResponse* response) override {
std::string prefix("Hello ");
response->set_message(prefix + request->name());
return Status::OK;
}
};
void RunServer() {
std::string server_address("0.0.0.0:50051");
ExampleServiceImpl 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;
}
創(chuàng)建一個名為 client.cpp
的文件,實現(xiàn)客戶端代碼:
#include<iostream>
#include<memory>
#include<string>
#include <grpc++/grpc++.h>
#include "example.grpc.pb.h"
using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using example::ExampleService;
using example::HelloRequest;
using example::HelloResponse;
class ExampleClient {
public:
ExampleClient(std::shared_ptr<Channel> channel) : stub_(ExampleService::NewStub(channel)) {}
std::string SayHello(const std::string& user) {
HelloRequest request;
request.set_name(user);
HelloResponse response;
ClientContext context;
Status status = stub_->SayHello(&context, request, &response);
if (status.ok()) {
return response.message();
} else {
std::cout<< status.error_code() << ": "<< status.error_message()<< std::endl;
return "RPC failed";
}
}
private:
std::unique_ptr<ExampleService::Stub> stub_;
};
int main(int argc, char** argv) {
ExampleClient client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));
std::string user("world");
std::string reply = client.SayHello(user);
std::cout << "Greeter received: "<< reply<< std::endl;
return 0;
}
編譯和運行:
使用 CMake 或其他構(gòu)建工具編譯你的項目。確保鏈接 gRPC 和 Protobuf 庫。例如,使用 CMake 的 CMakeLists.txt
文件可能如下所示:
cmake_minimum_required(VERSION 3.10)
project(example_grpc)
set(CMAKE_CXX_STANDARD 11)
find_package(gRPC REQUIRED)
find_package(Protobuf REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${gRPC_INCLUDE_DIRS})
add_executable(server server.cpp example.pb.cc example.grpc.pb.cc)
target_link_libraries(server ${gRPC_LIBRARIES} ${PROTOBUF_LIBRARIES})
add_executable(client client.cpp example.pb.cc example.grpc.pb.cc)
target_link_libraries(client ${gRPC_LIBRARIES} ${PROTOBUF_LIBRARIES})
然后運行 cmake
和 make
命令構(gòu)建項目。最后,分別運行服務(wù)器和客戶端:
./server
./client
你應(yīng)該會看到服務(wù)器和客戶端之間的通信成功進行。