C++/gRPC 开发环境搭建手册
在本文中,我们将介绍如何搭建一个完整的C++/gRPC开发环境,集成Envoy、Google Test、Prometheus、Grafana等工具,用于服务设计、单元测试、调试和监控的全流程实践。
1. 环境准备
安装基础依赖
在开始之前,请确保你的系统已经安装了以下工具:
- Git:代码管理工具
- CMake:构建系统
- 编译器:如
g++
或clang++
sudo apt update
sudo apt install -y git cmake build-essential autoconf libtool pkg-config
2. 安装gRPC
gRPC是本地开发的核心部分,用于实现高效的远程过程调用。
克隆gRPC代码库并安装
git clone -b v1.30.0 https://github.com/grpc/grpc
cd grpc
git submodule update --init
make -j$(nproc)
sudo make install
这将下载并安装gRPC和其依赖的Protobuf库。
3. 安装Google Test(GTest)
Google Test 是C++中流行的单元测试框架。它帮助开发者进行代码测试和验证。
克隆并安装Google Test
git clone https://github.com/google/googletest.git
cd googletest
mkdir build
cd build
cmake ..
make
sudo make install
Google Test 将用于后续的单元测试集成,以便于gRPC服务的测试。
4. 安装Envoy
Envoy是一个高性能的代理,广泛用于gRPC环境中进行负载均衡、服务发现和数据链路追踪。
添加Envoy存储库并安装
curl -L https://getenvoy.io/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://packages.getenvoy.io/debian focal stable" | sudo tee /etc/apt/sources.list.d/getenvoy.list
sudo apt update
sudo apt install -y getenvoy-envoy
5. 安装Prometheus
Prometheus是一款用于监控和收集应用指标的工具。在gRPC服务中,它用于收集服务的性能数据,如请求量、错误率等。
安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.31.1/prometheus-2.31.1.linux-amd64.tar.gz
tar xvfz prometheus-2.31.1.linux-amd64.tar.gz
cd prometheus-2.31.1.linux-amd64
./prometheus --config.file=prometheus.yml
6. 安装Grafana
Grafana是一个开源的可视化工具,常与Prometheus集成,用于可视化监控数据。
添加Grafana存储库并安装
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl enable --now grafana-server
7. 配置gRPC与Envoy、Prometheus、Grafana集成
接下来,配置如何将gRPC服务与Envoy代理、Prometheus监控和Grafana可视化整合在一起。
gRPC服务配置
创建一个简单的gRPC服务,供Envoy代理使用。示例.proto文件:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
生成服务代码并实现:
#include "helloworld.grpc.pb.h"
#include <grpcpp/grpcpp.h>
class GreeterServiceImpl final : public Greeter::Service {
public:
grpc::Status SayHello(grpc::ServerContext* context, const HelloRequest* request,
HelloReply* reply) override {
reply->set_message("Hello " + request->name());
return grpc::Status::OK;
}
};
int main() {
std::string server_address("0.0.0.0:50051");
GreeterServiceImpl service;
grpc::ServerBuilder builder;
builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
builder.RegisterService(&service);
std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
server->Wait();
}
Envoy配置文件
为Envoy配置代理gRPC流量,并将监控数据发送到Prometheus。
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route:
cluster: grpc_service
http_filters:
- name: envoy.filters.http.router
clusters:
- name: grpc_service
connect_timeout: 0.25s
type: LOGICAL_DNS
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
cluster_name: grpc_service
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 127.0.0.1
port_value: 50051
admin:
access_log_path: "/tmp/admin_access.log"
address:
socket_address:
address: 127.0.0.1
port_value: 9901
stats_sinks:
- name: envoy.stat_sinks.prometheus
typed_config:
"@type": type.googleapis.com/envoy.extensions.stat_sinks.prometheus.v3.PrometheusSink
emit_tags_as_labels: true
Prometheus配置文件
Prometheus配置文件,用于抓取Envoy暴露的监控指标:
scrape_configs:
- job_name: 'envoy'
static_configs:
- targets: ['localhost:9901']
8. 配置Grafana
打开浏览器,访问http://localhost:3000
,使用默认的用户名和密码admin/admin
登录。
添加Prometheus数据源
- 点击“配置(Configuration)” -> “数据源(Data Sources)”。
- 选择Prometheus,填写URL为
http://localhost:9090
。
- 点击“保存并测试(Save & Test)”。
创建监控仪表盘
- 在左侧选择“创建(Create)” -> “仪表盘(Dashboard)”。
- 点击“添加图表(Add a new panel)”,选择Prometheus中的指标(如gRPC请求数、错误率等)进行可视化。
9. 单元测试集成
使用Google Test进行单元测试
创建gRPC服务的单元测试:
#include "gtest/gtest.h"
#include "helloworld.grpc.pb.h"
#include "grpcpp/grpcpp.h"
TEST(GreeterServiceTest, SayHello) {
GreeterServiceImpl service;
HelloRequest request;
HelloReply reply;
grpc::ServerContext context;
request.set_name("World");
grpc::Status status = service.SayHello(&context, &request, &reply);
EXPECT_TRUE(status.ok());
EXPECT_EQ(reply.message(), "Hello World");
}
使用CMake构建测试
在CMakeLists.txt中添加测试目标:
add_executable(test_greeter test_greeter.cpp)
target_link_libraries(test_greeter gtest gtest_main grpc++ grpc++_reflection)
add_test(NAME GreeterTest COMMAND test_greeter)
使用以下命令运行测试:
make test_greeter
./test_greeter
10. 总结
通过以上步骤,我们成功搭建了一个完整的C++/gRPC开发环境,包括以下工具的集成:
- gRPC:用于服务通信。
- Google Test:用于单元测试。
- Envoy:用于服务代理和负载均衡。
- Prometheus:用于服务性能监控。
- Grafana:用于数据可视化。
这种组合提供了从服务开发、单元测试到监控和调试的全流程解决方案,适用于C++/gRPC的现代化开发。
如果有进一步的需求或问题,请随时提出!