微服务即时通信系统---(二)框架学习

server/2025/2/23 6:24:06/

目录

gflags

介绍

安装

使用

头文件包含

编译时指明库 

宏定义参数

启动时设置命令行参数来设置参数值

 使用配置文件来设置参数值

初始化所有参数

访问参数

程序B访问程序A定义的参数

gflags提供的特殊参数标识 

 使用案例

代码编写 

样例运行

gtest

介绍

安装

使用

头文件包含

编译时指明库

gtest框架初始化接口

测试样例TEST宏

断言宏

使用案例

代码编写

 样例运行

spdlog

介绍

安装

使用

头文件包含

编译时指明库

日志输出等级

日志记录器类

日志输出格式自定义

异步日志记录类

日志记录器工厂类

创建日志器函数

日志器封装

日志器封装测试

etcd

介绍

安装

节点配置

运行验证

插入一个数据

获取数据

删除数据

删除所有数据

使用etcd搭建项目的服务注册与发现中心

etcd-cpp-apiv3

github地址

安装依赖

api框架安装

 头文件包含以及编译时指明库

客户端类与接口介绍

Client

Response

Value

Event

KeepAlive

Watcher

各个类的作用以及各自的关系

简单使用样例代码

put

get

Makefile

运行结果

服务注册与服务发现代码封装


本章主要是学习和使用本项目中所需使用到的一些框架

gflags

介绍

gflags是google开发的一个开源库,用于C++程序中命令行参数的声明、定义和解析。

gflags提供了一种简单的方式来添加、解析和文档化命令行标志,使得程序可以根据不同的运行时配置来调整。

gflags的特点:

易于使用提供了一套简单直观的API来定义和解析命令行标志。
自动帮助和文档gflags可以自动生成每个标志的帮助信息和文档。
类型安全gflags支持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型转换和检查。
多平台性可以在多种操作系统上使用,如Windows、Linux。
可扩展性允许开发者自定义标志的注册和解析逻辑。

安装

命令安装:

sudo apt-get install libgflags-dev

使用

头文件包含

#include <gflags/gflags.h>

编译时指明库 

-l gflags

 例如写Makefile时:

g++ $^ -o $@ -std=c++17 -lgflags

宏定义参数

gflags提供了它自己的宏,让我们来定义参数。该宏有三个参数:参数名、参数默认值、参数说明(注释)。

其中gflags支持的宏定义类型:

DEFINE_bool
DEFINE_int32
DEFINE_int64
DEFINE_uint64
DEFINE_double
DEFINE_string

使用样例:

DEFINE_bool(reuser_addr, true, "是否启动地址重用, 默认: yes");
DEFINE_int32(log_level, 1, "日志等级: 1-DEBUG, 2-WARN, 3-ERROR");
DEFINE_string(log_file, "stdout", "日志输出文件, 默认: stdout");

启动时设置命令行参数来设置参数值

gflags为我们提供了多种设置命令行参数的方式,支持我们在运行程序的时候,以命令行参数的形式传入参数的值。

注意:这里不是定义新的参数,而是设置我们已经定义号的参数的值!

shell: ./a.out exec --log_level=2
shell: ./a.out exec --log_file="stderr"
shell: ./a.out exec --reuse_addr=false

 使用配置文件来设置参数值

除了使用命令行参数的形式来设置参数值,也可以、更推荐使用配置文件的方式来设置参数值。

main.conf:

-reuse_addr=false
-log_level=2
-log_file="stderr"

此时运行程序的时候,需要指定该程序从哪个配置文件里读取参数:

-flagfile=xxx #从xxx这个配置文件中读取参数

同样注意:配置文件中的参数名也必须和代码中定义的参数名一样。 

初始化所有参数

当我们定义好参数后,并不能直接使用,需要用gflags提供的API将我们定义的参数进行初始化解析后,才能正常使用。

int main(int argc, char *argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);
}

其中argc和argv就是main函数的参数。

第三个参数称为remove_flags。true:在解析命令行参数后,argc和argv会被修改,移除已解析的标志。这意味着后续代码将无法再访问这些标志,因为它们已经从argv中移除。

比如上述定义的reuse_addr,如果这里我们用的true,那么在解析之后,argv中将不再含有 --reuse_addr的标志。

true:通常在你希望清理命令行参数,使得后续代码不会误处理这些标志时使用。

访问参数

在程序中不能直接按照变量名去使用参数,gflags规定,在使用其定义的参数时,必须加上前缀FLAGS_来使用。

FLAGS_reuse_addr;
FLAGS_log_level;
FLAGS_log_file;

程序B访问程序A定义的参数

在程序B中想要访问程序A的参数,需要先声明。

gflags提供了宏DECLARE来声明参数。

DECLARE_bool(reuse_addr);
DECLARE_int32(log_level);
DECLARE_string(log_file);

gflags提供的特殊参数标识 

--help显示文件中所有标识的帮助信息
--helpfull比--help显示的信息更加全面
--helpshort只显示当前执行文件里的标志
--helpxml以XML方式进行打印,方便处理
--version打印版本信息,由google::SetVersionString()设定
--flagfile指定配置文件

 使用案例

代码编写 

main.cc

#include <gflags/gflags.h>
#include <iostream>DEFINE_bool(reuser_addr, true, "是否启动地址重用, 默认: yes");
DEFINE_int32(log_level, 1, "日志等级: 1-DEBUG, 2-WARN, 3-ERROR");
DEFINE_string(log_file, "stdout", "日志输出文件, 默认: stdout");int main(int argc, char *argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);std::cout << "reuse: " << FLAGS_reuser_addr << std::endl;std::cout << "log_level: " << FLAGS_log_level << std::endl;std::cout << "log_file: " << FLAGS_log_file << std::endl;return 0;
}

 配置文件main.conf

-reuse_addr=false
-log_level=3
-log_file="stderr"

Makefile

main:main.ccg++ $^ -o $@ -std=c++17 -lgflags

样例运行

shell$ ./main --flagfile=main.conf
reuse: 1
log_level: 3
log_file: "stderr"

gtest

介绍

gtest是一个google开发的跨平台的C++单元测试框架,是为了在不同的平台上为编写C++单元测试而生成的。

它提供了丰富的断言、致命和非致命判断、参数化等等测试所需要的宏,以及全局测试、单元测试组件。

安装

命令安装:

sudo apt-get install libgtest-dev

使用

头文件包含

#include <gtest/gtest.h>

编译时指明库

-l gtest

gtest框架初始化接口

想要使用gtest进行单元测试之前,必须进行框架的初始化。

int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);return 0;
}

测试样例TEST宏

TEST(测试名称, 测试样例)
TEST_F(test_fixture, test_name)

TEST:主要用来创建一个简单测试,定义一个测试函数。

TEST_F:主要用来进行多样测试,适用于多个测试场景如果需要相同的数据配置的情况。

断言宏

gtest中的断言宏一般分为两类。

ASSERT_系列:如果当前点检测失败,就退出当前函数。

EXPECT_系列:如果当前点检测失败,继续向下执行。

经常使用的断言介绍:

ASSERT_TRUE(x)期待x的结果是true
ASSERT_FALSE(x)期待x的结果是false
ASSERT_EQ(a , b)期待a 等于b
ASSERT_NE(a, b)期待a 不等于 b
ASSERT_LT(a, b)期待a 小于 b
ASSERT_GT(a , b)期待 a 大于b
ASSERT_LE(a , b)期待 a 小于等于b
ASSERT_GE(a , b)期待 a大于等于 b

使用案例

代码编写

main.cc

#include <gtest/gtest.h>
#include <iostream>int abs(int x)
{return x > 0 ? x : -x;
}TEST(abs_test, test1)
{ASSERT_TRUE(abs(1) == 1) << "abs(1)=1";ASSERT_TRUE(abs(-1) == 1);ASSERT_FALSE(abs(-2) == -2);ASSERT_EQ(abs(1), abs(-1));ASSERT_NE(abs(-1), 0);ASSERT_LT(abs(-1), 2);ASSERT_GT(abs(-1), 0);ASSERT_LE(abs(-1), 2);ASSERT_GE(abs(-1), 0);
}int main(int argc, char *argv[])
{testing::InitGoogleTest(&argc, argv);RUN_ALL_TESTS();return 0;
}

Makefile

main:main.ccg++ $^ -o $@ -std=c++17 -lgtest

 样例运行

shell $ ./main 
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from abs_test
[ RUN      ] abs_test.test1
[       OK ] abs_test.test1 (0 ms)
[----------] 1 test from abs_test (0 ms total)[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

spdlog

介绍

spdlog是一个高性能、超快速、零配置的C++日志库,旨在提供简洁的API和丰富的功能,同时保持高性能的日志记录。

它支持多种输出目标、格式化选项、线程安全以及异步日志记录。

spdlog的特点:

高性能spdlog专为速度而设计,即时在高负载的情况下也能保持良好的性能。
零配置

http://www.ppmy.cn/server/170054.html

相关文章

具有整合各亚专科医学领域知识能力的AI智能体开发纲要(2025版)

整合各亚专科医学领域知识能力的AI代理的开发与研究 一、引言 1.1 研究背景 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量,医疗领域也不例外。近年来,AI 在医疗行业的应用取得了显著进展,从医学影像诊断到疾病预测,从药物研发到个性化医疗,AI 技…

【Python爬虫(45)】Python爬虫新境界:分布式与大数据框架的融合之旅

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

三星Galaxy S24系列手机被曝3月推送One UI 7稳定版更新

在智能手机的激烈竞争中&#xff0c;系统更新往往是决定用户体验的关键因素之一。2025年2月22日&#xff0c;一则振奋人心的消息在科技圈传开&#xff1a;三星计划于今年3月&#xff0c;向Galaxy Z Fold6、Galaxy Z Flip6折叠手机以及Galaxy S24系列推送One UI 7稳定版更新。这…

Linux 在云计算中的应用有哪些?

目录 Linux 在云计算中的应用 1. 云计算基础设施的核心 2. 虚拟化技术的基础 3. 容器化与微服务 4. 大数据与人工智能 5. 开源生态与社区支持 6. 在 Google Cloud 上运行 Linux 的优势 7. 边缘计算与物联网 总结 Linux 在云计算中的应用 Linux 作为开源操作系统的代表…

自动驾驶的等级划分

自动驾驶等级是衡量汽车自动化程度的标准&#xff0c;目前广泛采用的是由美国汽车工程师协会&#xff08;SAE&#xff09;和国际标准化组织&#xff08;ISO&#xff09;制定的分级标准&#xff0c;将自动驾驶分为 0 到 5 级&#xff0c;各级别的区别主要体现在人类驾驶员和自动…

Rust 中的 `Drop` 特性:自动化资源清理的魔法

一、自动清理机制&#xff1a;Rust 的析构函数 在许多语言中&#xff0c;当程序结束或对象不再需要时&#xff0c;开发者必须显式调用清理函数来释放内存或关闭资源。Rust 则不然——它通过 Drop 特性实现了类似析构函数&#xff08;destructor&#xff09;的自动化清理机制。…

如何设计app测试用例

功能测试 测试方法&#xff1a;等价类划分法、边界值法、场景法、因果图法。优先级设定&#xff1a;核心业务功能设为高优先级。需求覆盖 正向场景、反向场景、关联接口串场景 与后端开发确认测试用例是否全面覆盖后端逻辑。和产品确认用例是否覆盖本次需求&#xff0c;以及是否…

设计模式之组合设计模式实战 文件展示 树叶子节点

1.组合设计模式实战 文件展示 树叶子节点 组合设计模式 又叫部分整体模式&#xff0c;将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;可以更好的实现管理操作组合模式使得用户可以使用一致的方法操作单个对象和组合对象部分-整体对象的基本操作多数是一样的&a…