- 博客(57)
- 收藏
- 关注
原创 BoostSearch搜索引擎项目 —— 测试用例设计 + web自动化测试代码
web自动化代码:https://gitee.com/chicken-c/boost-search/tree/master/AutoTest
2025-04-08 22:44:34
299
原创 IM项目 ----- 项目部署
之前项目就是使用linux的systemd进行了一个简单的管理,太过于简陋了。这次我们使用docker来对项目进行一个部署。
2025-03-21 18:59:55
795
原创 Go项目-----Kubernetes使用
这篇文章梳理一下关于Kubernetes的一些基本概念,通过k8s来对mysql,redis和我们的服务进行部署。
2024-12-16 19:22:33
1003
原创 Go项目 ----- 用户登录功能
我们先从用户模块开始,这篇文章主要介绍gin和gorm的使用这个handler中存放这用户相关的路由,我们把它创建在web目录下。同时定义了一个RegisterRoutes方法用来注册路由。// 统一的路由注册接口这里用户的路由我们放在了Userhandler,这是一种分散注册的方式。还有一种是统一注册,是在一个统一的方法中注册所有的路由。这两种方法各有好处。
2024-12-16 14:35:09
1008
原创 IM项目-----ElasticSearch
在IM项目中通过引入ES,支持了用户搜索和历史消息的搜索。传统的关系型数据库主要是用于事务的复杂操作,对于这种需要模糊匹配的查询语句,索引会失效,进而进行全表扫描,对于数据量大的表效率是极其差的。ES通过建立倒排索引的方式,根据用户搜索的词条进行模糊查询效率较高。ES是基于文档进行存储的。文档就相当于MYsql中的一行数据,里面存储的是通过Json序列化后的数据。索引, 相当于Mysql中的表文档,MYsql中的一行记录映射,MYsql中的表结构和约束Field,MYsql中的字段。
2024-11-24 16:30:08
1178
原创 rabbitMq------客户端模块
在RabbitMQ中,提供服务的是信道,因此在客⼾端的实现中,弱化了Client客⼾端的概念。在RabbitMQ中并不会向⽤⼾展⽰⽹络通信的概念出来,⽽是以⼀种提供服务的形式来体现。实现思想类似于普通的功能接⼝封装,⼀个接⼝实现⼀个功能,接⼝内部完成向客⼾端请求的过程,但是对外并不需要体现出客⼾端与服务端通信的概念,⽤⼾需要什么服务就调⽤什么接⼝就⾏。
2024-10-02 19:29:22
1385
原创 rabbitMq-----broker服务器
搭建一个网络服务器,在内部提供各个业务接口即可。在业务处理函数中,每次请求过来找到对应的信道,通过信道句柄调用前边封装好的处理接口进行处理,最后返回响应即可。
2024-10-02 17:47:34
720
原创 rabbitMq------连接管理模块
我们的网络通信框架使用的muduo库,而在mudu库中是已经有了连接的概念,但是我们呢还有一个信道的概念muduo库是没有的。其实muduo库是有一个channel的概念的,只不过这个概念和我们这里的channel不一样。这也就是我们要封装这个模块的意义。
2024-10-02 17:14:47
907
原创 rabbitMq------信道管理模块
信道是在通信连接上更细粒度的一个划分,也就是一个通信连接上可以由多个信道,这些信道都是复用的同一条连接,为了充分利用资源。在用户眼中没有了网络通信的概念了,相当于信道他屏蔽了底层的网络通信细节。用户只需要使用信道提供的服务,不需要关心底层的网络通信细节。在用户眼中信道和信道就是完全独立的。这个信道管理是服务端的信道管理,而在客户端也会有一个信道,客户端的信道和服务端的信道是一一对应的。
2024-10-02 16:51:56
1315
原创 rabbitMq-----消费者管理模块
只有订阅客户端订阅了一个队列消息后,他才是一个消费者,而消费者存在的意义是,当这个队列上有消息的时候我们呢需要给订阅了这个队列的客户端推送消息,也就需要获取客户端的连接,所以我们呢可以通过消费者来找到对应的连接来进行消息的推送。
2024-10-02 15:49:06
1377
原创 rabbitMq-----路由匹配模块
交换机有三种类型,直接交换,广播交换,主题交换。其中交换机类型不同就有不同的匹配规则。而路由匹配模块就是用来决定交换机在收到一条消息后应该放入到哪些绑定的队列中。
2024-10-02 14:48:17
1064
原创 rabbitMq------虚拟机管理模块
虚拟机管理模块就是对交换机/队列/绑定/消息管理的一个整合,因为这几个模块他们存在一个这关联关系,而这几个模块又是独立的。所以我们将他们整合在一起,提供一个统一的操作。
2024-10-02 14:31:44
1242
原创 IM项目------网关子服务
入口网关子服务主要负责三个方面:1.接收客户端的请求,并把请求转发给的对应的字服务进行业务处理。2.对客户端的身份进行识别和鉴权。3.直接与客户端进行通信,主动推送事件通知。
2024-09-28 10:46:12
806
原创 IM项目------好友管理子服务
好友管理子服务要管理的数据有两种:好友相关数据,聊天会话相关数据。而好友的操作涉及到了好友管理表,好友申请表。聊天会话的操作涉及到了会话管理表,会话成员表。因此我们需要管理四张数据库表,同时,该子服务提供了一个用户搜索功能。我们需要管理一个ES用户类。在获取好友列表时,需要通过用户管理子服务获取用户信息。在获取会话列表时,需要通过消息存储子服务获取最近一条消息。
2024-09-26 09:58:47
1213
原创 IM项目------消息存储子服务
消息存储子服务通过MQ消费者客户端订阅队列消息,来消费消息转发子服务发来的消息。需要将消息存储进mysql数据库/ES搜索引擎,另外文件消息的文件需要通过文件子服务存储进行上传。消息存储子服务主要负责消息的存储以及提供消息的各种操作。提供三个服务:获取指定会话的最近N条消息/获取指定会话时间范围内的消息/按关键字搜索消息。
2024-09-24 10:12:17
1222
原创 IM项目-----消息转发子服务
消息转发子服务只提供一个服务功能,就是告知一条消息需要转发给谁。所以消息转发子服务不是转发消息的,而是告知消息应该转发给谁。在收到了请求后,会先根据请求中的字段组织一个完整的消息结构。其中消息结构中有一个消息发送者信息,因此我们需要调用用户子服务获取用户信息。为了完成实际业务,需要在聊天会话表中查询指定会话Id的会话成员。因此需要一个封装一个聊天会话表的数据库操作类。
2024-09-22 21:23:31
877
原创 IM项目-----用户信息子服务
用户信息子服务主要是进行用户信息的管理,以及用户信息的操作。用户名的登录与注册手机号的登录与注册手机验证码的获取获取单个用户信息获取多个多个用户信息用户信息的修改其中用户注册成功后需要在mysql数据库中新增用户信息,在ES搜索引擎中新增用户信息。用户登录时需要在mysql数据库中进行信息的比对,登录成功后需要在redis数据库中新增登录会话信息和用户Id信息。在使用手机号注册和登录以及修改手机号时,需要获取验证码,所以在redis数据库中存贮验证码ID和验证码键值对。
2024-09-21 19:18:42
1048
原创 IM项目-----文件管理子服务
文件管理子服务,主要用于管理用户的头像,以及消息中的文件存储,因此需要提供文件的上传a. 单个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储b. 多个文件的上传:这个接口基本用于后台部分,收到文件消息后将文件数据转发给文件子服务进行存储文件的下载a. 单个文件的下载:在后台用于获取用户头像文件数据,以及客户端用于获取文件/语音/图片消息的文件数据b. 多个文件的下载:在后台用于大批量获取用户头像数据(比如获取用户列表。
2024-09-19 17:21:33
696
原创 IM项目-----语音识别子服务
语音转换子服务,用于调用语音识别 SDK,进行语音识别,将语音转为文字后返回给网关。语音消息的文字转换:客户端进行语音消息的文字转换。
2024-09-19 16:51:34
2202
原创 es的封装
es他使用的网络协议时http,序列化协议用的json。而es客户端给我们提供的三个接口中,我们需要填的就是一个请求正文,所以我们主要是针对这个正文json的一个组织。es基本请求格式提示:以下是本篇文章正文内容,下面案例可供参考封装四个操作:索引创建,数据新增,数据查询,数据删除封装最主要要完成的是请求正文的构造过程: Json::Value 对象的数据新增过程索引创建:1.能够动态设定索引名称,索引类型2.能够动态的添加字段,并设置字段类型, 设置分词器类型,是否构造索引。
2024-09-18 10:04:14
1286
原创 AMQP-CPP二次封装
AMQP-CPP他不提供底层网络通信的过程,也没有网络IO监控。他只是进行了内部的一个应用层协议的定义,以及根据 amqp 协议它内部的核心概念所支持的这些功能的一个支持。所以它就需要我们自己用户自己来去来定义这块的一个网络底层的一个网络通信。但是它将一些知名的网络通信框架集成到了它的这个呃它的 sdk 当中,也就是说如果我们需要使用某种某种知名的这种网络通信框架来进行一个底层网络通信,它也是支持的。人家已经把内部的这些最基础的一个适配功能是已经完成了。
2024-09-18 09:01:36
1551
1
原创 odb使用
odb可以简化数据库的操作,通过将c++对象直接映射到数据库表,通过对 对象的操作,完成数据库表的操作。我们这次简单使用下odb来实现一个学生表和班级表的增删改查操作。
2024-09-17 17:35:59
1478
原创 websocketpp服务器搭建
概念:是一个应用层的tcp长连接协议。搭建一个websocket服务器其实就是搭建了一个tcp服务器,只不过应用层使用websocket协议格式进行数据处理。在IM项目中:客户端 -----HTTP----- 服务器但是在聊天室项目中,不单单是请求-响应的业务处理,还包含了数据的主动推送而这种消息数据的主动推送,是HTTP协议无法实现的。因此需要搭建一个长连接的服务器,用于主动向客户端推送数据。
2024-09-17 10:20:03
1600
2
原创 IM项目组件学习-----spdlog二次封装
spdlog::stdout_color_mt是创建一个同步的标准输出日志器,他会返回一个 std::shared_ptr< spdlog::logger > 的智能指针对象。basic_logger_mt是创建一个文件输出日志器,第一个参数是指定日志器的名称,第二个参数是指定日志器输出的文件路径。该日志器也是同步的。set_level是设置日志输出等级,只有在这个等级及以上的日志才会进行输出,这里的trace是最低的等级,及所有日志都会输出。对日志输出的接口,进行宏的封装,加入文件名行号的输出。
2024-09-14 22:46:36
1229
原创 Linux | 信号
子进程在终止时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略,父进程可以自定义SIGCHLD信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用wait清理子进程即可。在执行信号捕捉方法之前先置0,在调用。当我们自定义捕捉这个信号后发现,自定义的动作被一直执行,因为我们的溢出标志位没有改变,所以操作系统一直在给进程发送信号,所以这里一直在执行自定义捕捉的动作。每一次登陆,只允许一个进程是前台进程,可以允许多个进程是后台进程。
2023-12-02 19:34:52
148
原创 C++ | 特殊类设计
优点:第一次使用实例对象时,创建对象。多个单例实例启动顺序自由控制。缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。
2023-11-28 18:12:12
99
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人