brpc快速上手:10分钟搭建你的第一个RPC服务
brpc是一款工业级C++ RPC框架,广泛应用于搜索、存储、机器学习、广告和推荐等高性能系统。本文将带你快速掌握brpc的核心概念和使用方法,从零开始搭建一个完整的RPC服务。## 什么是brpc?brpc(全称"better RPC")是由百度开发的高性能RPC框架,它支持多种协议(如baidu_std、hulu_pbrpc、nshead等),提供了丰富的功能特性,包括负载均衡、服务发
brpc快速上手:10分钟搭建你的第一个RPC服务
brpc是一款工业级C++ RPC框架,广泛应用于搜索、存储、机器学习、广告和推荐等高性能系统。本文将带你快速掌握brpc的核心概念和使用方法,从零开始搭建一个完整的RPC服务。
什么是brpc?
brpc(全称"better RPC")是由百度开发的高性能RPC框架,它支持多种协议(如baidu_std、hulu_pbrpc、nshead等),提供了丰富的功能特性,包括负载均衡、服务发现、超时控制、熔断降级等。其设计目标是满足大规模分布式系统的高性能需求,同时保持易用性和稳定性。
图:brpc RPC流程示意图,展示了客户端与服务器之间的通信过程
环境准备
在开始之前,请确保你的系统满足以下要求:
- C++11及以上编译器(GCC 4.8+ 或 Clang 3.4+)
- CMake 3.10+
- Git
首先,克隆brpc仓库:
git clone https://gitcode.com/gh_mirrors/brpc3/brpc
cd brpc
快速安装步骤
brpc提供了简单的编译和安装流程:
- 安装依赖:
sudo apt-get install -y build-essential libssl-dev libprotobuf-dev protobuf-compiler
- 编译brpc:
sh build.sh
- 安装brpc:
sudo make install
安装完成后,brpc库文件将被安装到系统默认路径,头文件位于/usr/local/include/brpc/目录下。
构建第一个RPC服务
下面我们将创建一个简单的"回声"服务,该服务接收客户端发送的消息并原样返回。
定义服务接口
首先,创建一个protobuf文件echo.proto,定义服务接口:
syntax = "proto2";
package example;
service EchoService {
rpc Echo(EchoRequest) returns (EchoResponse);
}
message EchoRequest {
required string message = 1;
}
message EchoResponse {
required string message = 1;
}
实现服务
创建服务实现文件echo_service.cpp:
#include <brpc/server.h>
#include "echo.pb.h"
using namespace std;
class EchoServiceImpl : public example::EchoService {
public:
void Echo(google::protobuf::RpcController* cntl_base,
const example::EchoRequest* request,
example::EchoResponse* response,
google::protobuf::Closure* done) {
brpc::ClosureGuard done_guard(done);
brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
// 设置响应消息
response->set_message(request->message());
// 打印请求信息
LOG(INFO) << "Received request from " << cntl->remote_side()
<< ": " << request->message();
}
};
编写服务器代码
创建服务器主文件server.cpp:
#include <brpc/server.h>
#include "echo.pb.h"
#include "echo_service.h"
int main() {
// 创建服务器实例
brpc::Server server;
// 注册服务实现
example::EchoServiceImpl echo_service;
if (server.AddService(&echo_service,
brpc::SERVER_DOESNT_OWN_SERVICE) != 0) {
LOG(ERROR) << "Fail to add service";
return -1;
}
// 设置服务器地址和端口
brpc::ServerOptions options;
options.idle_timeout_sec = 300;
if (server.Start(8000, &options) != 0) {
LOG(ERROR) << "Fail to start server";
return -1;
}
// 等待服务器停止
server.RunUntilAskedToQuit();
return 0;
}
编写客户端代码
创建客户端文件client.cpp:
#include <brpc/channel.h>
#include "echo.pb.h"
int main() {
// 初始化channel
brpc::Channel channel;
brpc::ChannelOptions options;
options.protocol = "baidu_std";
options.connection_type = "single";
options.timeout_ms = 100;
options.max_retry = 3;
// 连接服务器
if (channel.Init("127.0.0.1:8000", &options) != 0) {
LOG(ERROR) << "Fail to initialize channel";
return -1;
}
// 创建stub
example::EchoService_Stub stub(&channel);
// 发送请求
example::EchoRequest request;
example::EchoResponse response;
brpc::Controller cntl;
request.set_message("Hello, brpc!");
stub.Echo(&cntl, &request, &response, NULL);
// 处理响应
if (!cntl.Failed()) {
LOG(INFO) << "Received response: " << response.message();
} else {
LOG(ERROR) << "RPC failed: " << cntl.ErrorText();
}
return 0;
}
编译运行
创建CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(echo_server)
find_package(brpc REQUIRED)
find_package(protobuf REQUIRED)
add_executable(server server.cpp echo_service.cpp echo.pb.cc)
target_link_libraries(server brpc protobuf)
add_executable(client client.cpp echo.pb.cc)
target_link_libraries(client brpc protobuf)
编译并运行:
mkdir build && cd build
cmake ..
make
./server &
./client
如果一切顺利,你将看到客户端输出:"Received response: Hello, brpc!"
常见问题解决
-
编译错误:如果遇到编译错误,请检查依赖库是否安装完整,特别是protobuf和brpc的版本是否匹配。
-
连接失败:确保服务器已启动且端口未被占用。可以使用
netstat -tln命令检查端口状态。 -
性能优化:对于高性能需求,可以调整服务器线程数和连接池大小,具体配置可参考brpc官方文档。
总结
通过本文的介绍,你已经了解了brpc的基本概念和使用方法,并成功搭建了一个简单的RPC服务。brpc作为一款工业级RPC框架,提供了丰富的功能和优异的性能,适合构建各种高性能分布式系统。
想要深入了解brpc的更多特性,可以查阅源代码中的示例程序和文档,或参考官方提供的详细教程。祝你在brpc的使用过程中收获更多!
更多推荐




所有评论(0)