kizumi_header_banner_img

Learn. Build. Share.

加载中

文章导读

基于脚手架微服务的视频点播系统-脚手架开发部分(完结)elasticsearch与libcurl的简单使用与二次封装及bug修复


avatar
xiu114514 2025年11月14日 228
基于脚手架微服务的视频点播系统-脚手架开发部分(完结)elasticsearch与libcurl的简单使用与二次封装及bug修复

@TOC

1.ElasticClient的使用

Elasticsearch, 简称ES,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,⾃动发现,索引⾃动分⽚,索引副本机制,restful⻛格接⼝,多数据源,⾃动搜索负载等。它可以近乎实时的存储、检索数据;本⾝扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使⽤Java开发并使⽤Lucene作为其核⼼来实现所有索引和搜索的功能,但是它的⽬的是通过简单的RESTful API来隐藏Lucene的复杂性,从⽽让全⽂搜索变得简单。 Elasticsearch是⾯向⽂档(document oriented)的,这意味着它可以存储整个对象或⽂档(document)。然⽽它不仅仅是存储,还会索引(index)每个⽂档的内容使之可以被搜索。在Elasticsearch中,你可以对⽂档(⽽⾮成⾏成列的数据)进⾏索引、搜索、排序、过滤。

1.1ES检索原理

正排索引

正排索引,也称为前向索引,是⼀种将⽂档或数据记录按照某种特定顺序组织的索引机制。在正排索引中,索引的键通常是⽂档的标识符,如⽂档ID,⽽索引的值则包含⽂档的详细信息,例如标题、内容摘要、发布⽇期等。这种结构使得正排索引⾮常适合执⾏基于特定标识符的查找操作。正排索引的优点在于能够直接根据⽂档ID快速访问⽂档,适合于需要按照⽂档顺序进⾏操作的场景。 在这里插入图片描述

倒排索引

倒排索引,⼜称反向索引或逆向索引,是按照⽂档中的词汇来组织数据的索引⽅法。在倒排索引中,每个独特的词汇都会有⼀个索引条⽬,该条⽬包含指向包含该词 的所有⽂档的指针或引⽤。这使得倒排索引⾮常适合全⽂搜索,能够快速找到包含特定关键词的⽂档。倒排索引则适合于全⽂搜索,可以快速找到包含特定关键词的所有⽂档,索引的⼤⼩相对较⼩,因为它只记录关键词和⽂档的映射关系。但是,倒排索引不能直接通过索引访问⽂档,需要结合正排索引来获取⽂档的详细信息。 在这里插入图片描述

1.2ES核心概念

ES中的一些概念与传统数据库可以做如下类比 在这里插入图片描述 这里需要注意的一点是,在es7.x版本之后,类型这个概念已经被废弃,也就是每个索引下只有一个类型就是_doc。我们访问一个索引中的文档时格式如下:/index/_doc/文档id

1.2.1索引(index)

⼀个索引就是⼀个拥有⼏分相似特征的⽂档的集合。⽐如说,你可以有⼀个客⼾数据的索引,⼀个产品⽬录的索引,还有⼀个订单数据的索引。⼀个索引由⼀个名字来标识(必须全部是⼩写字⺟的),并且当我们要对应于这个索引中的⽂档进⾏索引、搜索、更新和删除的时候,都要使⽤到这个名字。在⼀个集群中,可以定义任意多的索引。

1.2.2类型(Field)

在⼀个索引中,你可以定义⼀种或多种类型。⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有⼀组共同字段的⽂档定义⼀个类型。⽐如说,我们假设你运营⼀个博客平台并且将你所有的数据存储到⼀个索引中。在这个索引中,你可以为⽤⼾数据定义⼀个类型,为博客数据定义另⼀个类型,为评论数据定义另⼀个类型……

1.2.3字段(Field)

字段相当于是数据表的字段,对⽂档数据根据不同属性进⾏的分类标识。

分类类型备注
字符串text, keywordtext会被分词生成索引;keyword不会被分词生成索引,只能精确值搜索
整形integer, long, short, byte 
浮点double, float 
逻辑booleantrue或false
日期date, date_nanos"2018-01-13" 或 "2018-01-13 12:10:30" 或者时间戳,即1970到现在的秒数/毫秒数
二进制binary二进制通常只存储,不索引
范围range 

1.2.4映射(mapping)

映射是在处理数据的⽅式和规则⽅⾯做⼀些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射⾥⾯可以设置的,其它就是处理es⾥⾯数据的⼀些使⽤规则设置也叫做映射,按着最优规则处理数据对性能提⾼很⼤,因此才需要建⽴映射,并且需要思考如何建⽴映射才能对性能更好。

名称数值备注
enabledtrue(默认) / false是否仅作存储,不做搜索和分析
indextrue(默认) / false是否构建倒排索引(决定了是否分词,是否被索引)
index_option  
dynamictrue(缺省) / false控制mapping的自动更新
doc_valuetrue(默认) / false是否开启doc_value,用于聚合和排序分析,分词字段不能使用
fielddata"fielddata": {"format": "disabled"}是否为text类型启动fielddata,实现排序和聚合分析
storetrue / false(默认)针对分词字段,参与排序或聚合时能提高性能,不分词字段统一建议使用doc_value
coercetrue(默认) / false是否开启自动数据类型转换功能,比如:字符串转数字,浮点转整型
analyzer"analyzer": "ik"指定分词器,默认分词器为standard analyzer
boost"boost": 1.23字段级别的分数加权,默认值是1.0
fields"fields": { "name": { "type": "text", "index": true }, … }对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
data_detectiontrue(默认) / false是否自动识别日期类型

1.2.5文档(document)

⼀个⽂档是⼀个可被索引的基础信息单元。⽐如,你可以拥有某⼀个客⼾的⽂档,某⼀个产品的⼀个⽂档或者某个订单的⼀个⽂档。⽂档以JSON(Javascript Object Notation)格式来表⽰,⽽JSON是⼀个到处存在的互联⽹数据交互格式。在⼀个index/type⾥⾯,你可以存储任意多的⽂档。⼀个⽂档必须被索引或者赋予⼀个索引的type。

1.3 Kibana访问es进行测试

通过⽹⻚访问kibana: http://192.168.65.128:5601/ ,注意:将链接中的IP地址改换成为你的主机IP地址。 默认账户密码为:elastic:123456 在这里插入图片描述 在开发工具中进行以下实验即可: 在这里插入图片描述

1.3.1创建索引

1.3.2新增数据

1.3.3查看并搜索数据

1.3.4删除索引

1.4典型操作

ES中的操作,是基于Restful⻛格的接⼝,使⽤HTTP协议进⾏通信,通信的时候正⽂采⽤JSON格式进⾏序列化。 因此,在组织请求的过程中,更多关注的⽅⾯:

  • 请求⽅法

  • 请求的URI路径

  • 请求正⽂中的各个关键字段

1.4.1索引

创建索引

删除索引

1.4.2新增数据

1.4.2.1单数据新增

URI组成: /索引名称/⽂档类型名称[/当前⽂档ID]

1.4.2.2批量数据新增

正⽂格式要求: 每个⽂档包含两⾏内容:1. 索引信息; 2. ⽂档信息

1.4.2.3查询所有数据

1.4.3删除

1.4.3.1删除指定id的数据

1.4.3.2批量删除指定id的数据

1.4.3.3根据条件进行数据的删除

1.4.4更新

1.4.4.1单数据更新

1.4.4.2批量数据更新

除了以上两种⽅式进⾏更新,也可以以新增单个数据的⽅式进⾏全字段更新。

1.4.5查询

单条件查询

1.term查询,单字段精确匹配(如果字段没有keyword属性时比如下方例子去掉.keyword,便是一种模糊匹配,有则都是精确匹配)

2.terms单字段多值精确匹配

3.match单字段模糊匹配

4.数字类型区间匹配

5.多字段模糊匹配

多条件查询

bool检索 • must:必须匹配的条件 • must_not : 必须过滤掉的条件 • should: 匹配⼀个或多个都可以 minimum_should_match:should中⾄少应该匹配n个条件

sort检索

分⻚查找 对检索按指定⽅式进⾏排序,并限制获取结果数量,以及偏移量

1.5ES客户端SDK

代码 官网 ES C++的客⼾端选择并不多, 我们这⾥使⽤elasticlient库, 下⾯进⾏安装。

1.5.1接口介绍

1.响应结构

2.典型接口

1.5.2使用样例

编译运行:

1.6二次封装

对于ES的操作其实都是通过resful⻛格API实现的,⽽在代码中我们更多是组织出合适的json格式的正⽂,⽽如果使⽤json来进⾏组织,则要求使⽤⼈员对ES各项请求的格式与字段都有深⼊了解才⾏,为了简化使⽤要求,我们的⽬标就是封装出⼀套类能够直接序列化出指定功能的json正⽂。 ES中的操作⽆⾮也就是数据的增删改查操作,我们要做的就是将这些操作中所⽤到的json结构定义出来。 具体要搞出来的结构如下: 在这里插入图片描述 其实就是按照我们上面的使用样例的格式走的,因为我们index的分词器设置也就只有设置一个中文分词器而已,所以我们就不搞那么复杂了,具体封装如下:

使用样例

编译构建:

这样一来就不需要我们自己再去一个一个的组织格式然后发给elastic服务端了,方便很多。

2.libcurl的使用与封装

libcurl 是⼀个跨平台、开源的客⼾端⽹络传输库,⽀持多种协议(如 HTTP、HTTPS、FTP、SMTP 等),⼴泛应⽤于⽹络通信、数据抓取、API 交互等场景。 安装命令如下:

2.1启用邮箱授权码(以163邮箱为例)

因为我们是通过libcurl实现邮件推送客⼾端,因此先在这⾥启⽤邮箱客⼾端授权码,这样才能便于使⽤。 163邮箱官网地址:https://mail.163.com/ 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

2.2使用

2.2.1头文件与链接库

2.2.2核心接口

2.2.3链表操作

2.2.4http选项

选项功能备注
CURLOPT_URL设置请求 URL所有请求的基础配置
CURLOPT_READFUNCTION处理请求数据的回调函数添加请求正文
CURLOPT_WRITEDATA设置给请求回调函数的用户数据文件句柄或数据对象
CURLOPT_WRITEFUNCTION处理响应数据的回调函数下载文件或保存 API 响应
CURLOPT_POSTFIELDS指定 POST 请求正文提交表单或 JSON 数据
CURLOPT_HTTPHEADER自定义 HTTP 头部设置认证头或内容类型
CURLOPT_FOLLOWLOCATION自动跟随重定向处理短链接或跳转页面
CURLOPT_VERBOSE输出调试信息开发阶段问题排查
CURLOPT_SSL_VERIFYPEER控制是否验证对端证书生产环境不推荐使用
CURLOPT_TIMEOUT设置传输超时时间请求到完成
CURLOPT_CONNECTTIMEOUT设置连接超时时间握手超时时间

2.2.5SMTP选项

选项功能典型值示例
CURLOPT_URLSMTP服务器地址"smtps://smtp.example.com:465"
CURLOPT_MAIL_FROM发件人地址"user@example.com"
CURLOPT_MAIL_RCPT收件人列表(链表)curl_slist.append(recipients, "to@example.com")
CURLOPT_READFUNCTION处理请求数据的回调函数添加请求正文
CURLOPT_READDATA通信正文内容代码块
1 From: from@example.com\r\n
2 To: to@example.com\r\n
3 Subject: title\r\n
4 Content-Type: text/html\r\n
5 \r\n
6 Body\r\n
CURLOPT_SSL_VERIFYPEER启用服务器证书验证1L(启用)或 0L(禁用)
CURLOPT_USERNAMESMTP登录用户名"user@example.com"
CURLOPT_PASSWORDSMTP登录密码 
CURLOPT_USE_SSL控制SSL/TLS加密行为 
CURLOPT_UPLOAD启用上传模式1L(启用)或 0L(禁用),与CURLOPT_READDATA & CURLOPT_READFUNCTION搭配使用

2.3二次封装

因为这里的使用基本是按照流程走的,所以使用样例我们也放到二次封装处即可。我们的二次封装主要也就以下几个内容: 验证码发送客户端类:

  • 发送邮件函数sendCode

  • 设置邮件正文函数 具体实现如下:

使用样例

编译运行:

运行成功之后你应该会在你的目标邮箱中收到如下一封邮件: 在这里插入图片描述

3.bug修复

3.1util⼯具类功能补充

描述:在后面设置缓存过期时间的时候需要⽣成⼀个指定范围的随机数,但是当前没有接⼝提供 解决:在Random类中新增⼀个⽣成随机数的接⼝

3.2RPC封装Bug与补充

功能补充 描述:⽬前封装信道管理,是提前创建好信道使⽤时直接获取,信道的使⽤协议是固定的,但是在有 些情况下固定协议的信道⽆法⽀持更加灵活的操作。 解决:在信道管理的同时也增加节点地址管理,并且提供⼀个获取节点地址的接口 bug修复 描述:当前代码中rpc信道的默认超时时间有些短,稍有处理时间有些⻓的接⼝就会导致请求超时失败。 解决:创建信道时将信道的请求超时时间设置的⻓⼀些

3.3MQ封装Bug

描述:条件控制问题,⽐如在交换机队列还没有创建绑定完毕,就开始订阅队列消息 解决后修正的代码如下:

4.打包脚手架项目

因为我们并没有深入了解学习过cmake,所以我们这里直接按照下面的步骤对我们的项目仅打包:

4.1在项目根目录创建如下CMakeLists.txt文件

4.2在根目录下创建名为cmake的文件夹,并添加两个新文件

4.3在根目下创建一个名为build的文件夹,进入并依次执行如下bash命令

执行完毕后,查看对应文件与库是否安装到对应位置:

出现如上结果则说明我们项目已经打包完毕。至此我们脚手架的编写到此结束。开始最后一部分服务端的编写。

 



评论(已关闭)

评论已关闭

日历

2025 年 11 月
 123
45678910
11121314151617
18192021222324
25262728293031