- 博客(72)
- 收藏
- 关注
原创 C++实现分布式网络通信框架RPC(5)——分布式协调服务zookeeper、一键编译.sh
在前边的文章中我们已经基本实现了一个rpc远程调用框架,并且给它也设计了日志系统的模块,现在我们还差最后一步,那就是分布式绕不开的一个东西--分布式协调服务。那我们的rpc远程调用框架为什么需要用到分布式协调服务呢?到现在为止还有什么不足之处呢?
2025-06-10 08:23:02
980
原创 C++实现分布式网络通信框架RPC(3)--rpc调用端
在前边的文章中,我们已经大致实现了rpc服务端的各项功能代码,接下来我们就来看看,如果一个rpc调用端想要调用都要干什么。到这里我们基本已经实现了整个框架,包括rpc发布端rpc方法的发布和rpc调用端的调用。后面我们还要给整个框架添加必不可少的一个模块——日志模块,还有zookeeper在本项目上的应用。见下一文!
2025-06-10 08:21:50
708
原创 C++实现分布式网络通信框架RPC(2)——rpc发布端
上面的全部就是我们mprpc服务端的全部代码了,走到这里,我们应该对mprpc在服务端的这部分有了很深的了解了吧,最后我再做一个总结,从大局上说一下当用户发起rpc调用的时候,在服务端整个过程是什么样子的。首先,对于服务端来说,用户想要请求本端的某种服务下的某种方法的时候,这个服务及方法应该先由服务端发布成rpc方法。服务端先定义 .proto文件。
2025-06-09 21:37:07
1258
2
原创 C++实现分布式网络通信框架MPRPC(1)--预备知识
在谈分布式网络通信框架之前,我们要先从单机服务器开始聊起,单机服务器就是 一个独立运行的应用程序或服务部署在一台物理或者虚拟机上。我们之前练习的网络部分的小项目都是属于单机服务器,它因为只需要维护一个服务器的原因,所以有着部署简单、成本低、调试方便等原因。扩展性差,无法横向扩展处理更多的请求如果出现单点故障的话,服务器会整个宕机导致不可用由于单个服务器的原因,服务器会存在着性能瓶颈(CPU、内存资源)
2025-06-09 21:32:50
1301
原创 Protobuf——Protocol Buffer详解(2)
上篇文章中介绍了protobuf的使用,下面我们深入了解以下protobuf的原理,它是怎么实现高效的序列与反序列化的。首先我们需要先回答一个问题:对于运行在不同的机器上的客户端和服务端,我们该怎么表示它们之间的数据交换呢?我们知道protobuf兼具了文本的可读性以及二进制的高效。它会将可读性较好的消息编码为二进制从而可以在网络中进行传播,而对端也可以将其解码回来。
2025-05-16 12:26:21
752
原创 Protobuf——Protocol Buffer详解(1)
最近在学习项目的时候需要用到protobuf进行序列与反序列化,由于是第一次接触protobuf,所以做个小总结。我们知道,当我们想要将内存中的对象状态保存到一个文件或者存到数据库的时候,或者在进行网络传输的时候,我们无法直接传输数据(因为接收方会无法分辨),所以我们就需要序列化与反序列化,将一个对象转换为字节序,再将字节序转换为一个完整的对象的过程。
2025-05-16 12:26:09
794
原创 Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
在我们刚开始学习Linux系统编程的时候,我们就接触到了 Makefile ,它是用于自动化构建软件项目的工具,主要用于编译源代码文件、管理项目依赖关系。Makefile 是一个文件。它是一个工程文件的编译规则,它记录了原始码如何编译的详细信息、描述了整个工程的编译链接等规则。Makefile 存在的意义就是为了构建依赖关系和依赖原理。Makefile 带来的好处是“自动化编译”,一旦写好的话,只需要一个make命令,整个工程的完全自动编译,极大的提高了软件开发的效率。
2025-05-14 21:51:47
1289
1
原创 Linux网络编程——基于ET模式下的Reactor
上篇文章中我们已经讲解了多路转接剩下的两个接口:poll和epoll,并且知道了epoll的两种工作模式分别是和,下来我们就实现的是一个简洁版的Reactor,即,在linux网络中,最常用最频繁的一种网络IO设计模式Reactor设计模式是一种为处理并发操作的事件处理模式。它将事件的检测和响应分离,使得事件的监听者可以注册对特定类型事件的兴趣,并在这些事件发生时得到通知。这种模式非常适合于需要处理大量并发连接的应用程序,比如Web服务器。
2025-04-19 10:55:11
719
原创 Linux网络编程——I/O多路转接(2)之 poll、epoll
上篇文章中我们提到了I/O多路转接的select接口select的fd存在着上限每次调用都需要重新设置关心的fd针对select接口中存在的问题,本章中我们再来介绍其他的多路转接的接口——poll接口和epoll接口。
2025-04-19 10:55:03
1050
原创 Linux网络编程——I/O多路转接(1)之 select
上篇文章中,我们已经知道了I/O的五种模式,包含阻塞、非阻塞、信号驱动、多路转接、异步。本文就多路转接模式进行深入分析,其中介绍了三组转接接口:selectpoll和epoll,支持一次性“等”多个文件描述符,以此将进程或线程“等”的时间进行重叠,便于数据就绪后调用对应的recvfrom()等接口进行数据的拷贝。先来复习一下I/O的多路转接是什么I/O多路转接也叫做I/O多路复用,虽然与阻塞I/O类似,但其核心特点在于,能够同时等待多个文件描述符的就绪状态。
2025-04-18 09:40:21
1038
原创 Linux网络编程——五种I/O模式
在前面的学习中,我们不断地刷新着对I/O的认识,从最开始的我们简单认为I/O就是操作系统与外设的直接交互,从外设将数据拷贝到内存,和从内存将数据拷贝到外设,但是我们也知道在调用read()和write()时,万一缓冲区中没有数据或者数据满了,这就会导致阻塞,只有等待资源就绪之后才能继续I/O,这是我们深入理解I/O的一个关键——I/O=等待+数据拷贝。首先,什么是I/O?在我们之前学习操作系统的我们首先了解了冯诺依曼体系结构,如下图所示。
2025-04-18 09:39:41
762
1
原创 Linux网络编程——数据链路层详解,以太网、MAC地址、MTU、ARP、DNS、NAT、代理服务器......
上篇文章中,我们对网络协议栈中的网络层进行了详细的介绍,但是我们需要知道的是网络层并不会真正的传输数据。真正负责数据或者对数据进行传输的是数据链路层。ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写,是互联网协议族中的一员,主要用于将网络层(IP层,即第三层)的IP地址解析为数据链路层(第二层)的MAC地址。在局域网中,设备之间的通信需要知道对方的物理地址(MAC地址),而ARP协议正是用于实现这种转换的。
2025-04-12 21:42:35
953
原创 Linux网络编程——详解网络层IP协议、网段划分、路由
在之前的文章中,出去物理层,我们已经针对TCP/IP五层模型中的应用层、传输层的要点做了介绍。其中应用层的HTTP/HTTPS 协议主要是针对数据请求的一个超文本传输协议,目的是为了保证服务端和客户端之间的数据传输安全可靠且高效。传输层的UDP协议就是应用于像我们平时看直播刷视频一样,它并不保证数据的可靠传输,而是能容忍一定的数据丢失的传输层协议。TCP协议则是通过一系列的机制来保证数据传输的可靠性和完整性。学习完了应用层和传输层,接下来就是网络层的协议和数据链路层了。
2025-04-12 21:41:14
1082
原创 Linux网络编程——深入理解TCP的可靠性、滑动窗口、流量控制、拥塞控制
上篇文章中我们提到了TCP连接的可靠性,TCP为了这个可靠性做了很多的工作比如我们已经知道的校验和序列号,为了保证数据的按序到达等确认应答超时重发机制连接管理还有下面说的流量控制都是TCP为了传输可靠性而设计的。
2025-04-10 09:12:52
1436
1
原创 【MySQL】——理解事务的隔离性、MVCC、当前读、快照读
上篇文章中,我们已经对事务的隔离性有了一定的理解,对事务隔离性的四个等级进行了演示。但是尽管我们已经知道这些隔离性的应用,但是我们仍对这些事物的隔离性有着很深的疑问,数据库是如何实现这些控制的。读-读:不存在任何问题,也不需要并发控制读-写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失(后面补充)我们先来了解数据库是如何对读-写进行控制的。
2025-04-10 09:12:06
975
2
原创 【MySQL】——事务的隔离性
在上篇事务一文中,我们提到了事务的四个属性 原子性、持久性、隔离性、一致性。原子性和持久性我们已经在上篇文章中见识到了,但是隔离性和一致性又该怎么理解呢?我们首先来看事务的隔离性,隔离性。同时,隔离级别。其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样。
2025-04-09 16:02:54
889
原创 【MySQL】——详解事务
在实际生活中,我们在对MySQL数据库进行CURD[创建(Create)、读取(Read)、更新(Update)和删除(Delete)]的操作时,要考虑到此时此刻并不是只有我们一个用户在对该数据库进行操作,所以这就牵扯到一个问题,数据库中的內容就好像是临界资源,在同时由多个用户进行CURD操作时,会不会出问题?下面举个例子:还是拿之前在讲到线程互斥的文章中提到的火车站抢票的例子来说,
2025-04-09 16:02:04
810
原创 Linux网络编程——TCP协议格式、可靠性分析
在上一篇文章中,我们重点介绍了UDP协议格式的一些内容。在本文中介绍的便是TCP协议格式的相关内容了。TCP(传输控制协议,Transmission Control Protocol)的全名已经明确指出了它的核心功能——对数据传输进行详细的控制。作为互联网基础通信协议之一,TCP提供了面向连接的服务,确保了数据的可靠传输。序号协定规则字节流编号TCP将数据视为一个无结构但有序的字节流,并为每个字节分配一个序列号。这意味着发送的数据不是基于报文或段来编号,而是基于每个单独的字节。
2025-04-08 12:14:42
1131
原创 Linux网络编程——UDP协议格式
TCP/IP网络模型,是将网络分成四层之前的文章介绍了 和协议,他们都是应用层协议,都是在传输层协议的基础上实现的。而传输层协议中最具有代表性的就是:UDP和TCP协议,以HTTP协议为例,在使用HTTP协议通信之前,是先需要建立TCP连接的,那么,传输层协议的介绍就先从UDP协议开始。
2025-04-07 16:31:26
911
原创 Linux网络编程——https的协议及其加密解密方式
上一篇文章中我们主要了解了http协议中,什么是url、http协议的请求和响应格式、http协议的一些方法,状态码、重定向、Cookie等内容。本文接下来就基于http协议的不安全性,深入研究https的解决方案,包含了对称和非对称加密性原理,以及CA证书。上篇文章中,我们已经提到了http协议的不安全性,其在网络中都是以明文的形式传播的,无论是GET还是POST方法都是不安全的,这是因为http协议协议以明文的形式传输数据, 缺乏对信息的保护.
2025-04-07 16:30:13
1518
7
原创 Linux网络编程——http协议
我们所知道的应用层协议实际上就是对应用层传输数据时需要遵循的一系列标准的一个规定,这些协议都是程序员规定的,在TCP网络通信这篇文章中,我们实现了一个简单的网络计算器,通过客户端产生请求,服务端接收请求,并响应请求,我们为该网络计算器还制定了一个简单的协议。但是网络上需要传输的数据是非常复杂的,视频、图片、网页等等。况且如果这些都需要程序员自己制定自己的协议是非常麻烦的。所以就对于其他一些非常好的协议,就会形成一个应用层特定的协议的标准,如此就可以供大家使用。如等。
2025-04-02 11:19:51
1035
原创 Linux网络编程——TCP协议的三次握手、超时重传机制
上篇文章中我们对TCP的协议格式和可靠性做了分析,里面提到了在TCP通信时候的“三次握手”。今天就主要研究一下TCP通信的“三次握手”
2025-04-02 11:08:58
998
原创 Linux网络编程——守护进程
在我们上一篇TCP网络通信文章中,我们使用了守护线程,但是当时没有做过多的了解,下面再本文中,我们再做详细介绍。
2025-03-14 20:59:13
1161
原创 Linux网络编程——应用层协议的初认识
在前面的文章中我们已经对UDP和TCP通信协议有了一定的了解,并且实现了不同版本的UDP和TCP网络通信代码。我们在之前实现通信网络中用到的各种接口:socket()bind()listen()等这些实际上都是Berkeley套接字接口( Berkeley sockets API),它们是标准库函数,提供了对底层网络通信协议的抽象,通过这些函数,应用程序能够方便的进行网络通信,而无需直接处理复杂的网络协议细节。然而网络发展至今天,已经出现了许许多多成熟的应用层协议,
2025-03-14 15:41:51
1098
1
原创 Linux网络编程——TCP网络通信多线程处理
上篇文章中我们实现了简单的TCP网络通信,有单进程版本的,多进程版本的。但是它们都存在着许多的不足之处。如单进程版本当给多个客户端提供服务时会出现问题,从而实现了多进程的两个版本,分别利用忽略子进程的退出信号使得子进程被自动回收和创建孙子进程的两种方法实现。但是对于多进程来说,这样的资源消耗会很大,所以接下来我们要考虑的是多线程版本。
2025-03-12 08:53:47
522
原创 Linux网络编程——简单的TCP网络通信
上篇文章中我们对udp网络通信有了初步的认识,我们在之前已经知道了UDP通信和TCP通信的不同UDP非连接,面向数据包。TCP连接,面向字节流。这篇文章我们来介绍和演示一下TCP套接字的接口。
2025-03-11 09:20:40
881
1
原创 Linux网络编程——UDP网络通信的简单实现
通过上述步骤,UDP服务端和客户端就可以进行基本的数据交换了。由于UDP是无连接的,每次数据传输都是独立的,因此每次调用sendto和recvfrom都不需要事先建立连接。这种方式非常适合那些对延迟敏感的应用程序,但也意味着数据包可能丢失或乱序到达。
2025-03-11 09:19:51
1140
原创 Linux网络编程——网络编程初识、UDP套接字简单了解
上篇文章主要介绍的是网络通信方面的一些知识,也算是为以后的学习先做一下铺垫。从本章开始我们就要正式进入网络编程的学习了。但是在开始网络编程之前,我们还需要进行一些准备工作,需要先了解一些概念。
2025-03-10 08:44:03
1146
1
原创 Linux网络编程之——网络初认识
在前面的文章中,我们已经学习完了Linux系统编程方面的知识,接下来我们就要开始进入Linux网络编程部分了。在正式认识Linux网络编程前,我们先对网络做一个了解。
2025-03-10 08:42:38
820
原创 Linux系统编程——生产者消费者模型
生产者-消费者模型(Producer-Consumer Pattern)是一种经典的多线程同步问题,它描述了一组生产者线程和一组消费者线程共享一个有限缓冲区的情况。生产者负责创建数据并将其放入缓冲区中,而消费者从缓冲区中取出数据并处理它们。这个模型广泛应用于各种并发编程场景中,以确保线程之间高效、安全地交换数据。
2025-03-09 21:49:02
1129
3
原创 Linux系统编程--线程同步
上篇文章我们讲解了线程互斥的概念,为了防止多个线程同时访问一份临界资源而出问题,我们引入了线程互斥,线程互斥其实就是多个线程同时争抢一份资源,谁抢到了就是谁的,抢不到的只能等待着下一次抢。虽然解决了有多个线程同时访问同一资源所产生的问题,但是我们思考一下这样子合理吗?不合理,这会产生另一种问题——线程饥饿。二、线程饥饿那么线程饥饿是什么呢?
2025-03-09 21:48:41
1068
1
原创 Linux操作系统——多线程互斥
我们已经学习了什么是多线程,以及多线程的控制和其优点,多线程可以提高程序的并发性和运行效率,可以充分利用计算机的多核资源。但是我们在前面学习的过程中,看到了有些多线程的程序的运行结果是有一些问题的,如出现了输出混乱、访问共享资源混乱等特点。所以我们下面提出的这个概念是关于这方面的——线程互斥。
2025-01-03 11:11:20
811
1
原创 Linux系统编程——线程控制
在上一篇文章中我们已经学习了线程的概念,线程的创建和等待,并且已经从根本上了解了线程和进程的相同点及不同点。在学习进程时,我们也学习了进程的相关控制接口,而线程作为更轻量级的进程,其自然也有着控制接口。
2024-12-29 21:36:12
834
2
原创 Linux系统编程——线程
之前的文章中我们已经对进程相关的概念做了认识,从创建进程、子进程,进程回收、进程替换等,由于我们之前对于知识框架的不熟悉,为了方便我们的理解学习,我们在之前的学习中没有做到深挖细节和深入理解,对之前的进程内容的有些部分做了简单的抽象,接下来我们学习的是比进程粒度更细的一个概念——线程。在这部分内容中,我们除了学习主线的内容外,还会对之前的內容稍作补充和修改,这都是会在文章中提到的。资源共享:同一个进程中的所有线程共享该进程的资源,包括全局变量、堆栈和文件描述符。这使得线程之间的通信和数据交换更加高效。
2024-12-28 22:13:34
1048
原创 Linux系统编程——详解页表
页表是我们之前在讲到程序地址空间的时候说到的,它是物理内存到进程程序地址空间的一个桥梁,通过它物理内存的数据和代码才能映射到进程的程序地址空间中,在信号这一节我们又提到了内核空间的页表,讲到了该内核级页表不同于前面说的用户级页表是每个进程都有的,内核级页表整个系统只有一份。但是之前我们对页表的理解还都处于一个比较简单的层面,事实上页表的实现还是比较复杂的,这次我们深入理解一下页表的构成及其功能。1、进程虚拟地址和物理内存的解耦在二级页表中,每个页表条目记录的是页面(page)的位置,未加载的页面会存储为。
2024-12-27 21:39:05
1077
3
原创 Linux系统编程——理解系统内核中的信号捕获
如果 用户的自定义处理信号方法内部, 还会发送其他信号, 并且用户还对其进行了捕捉. 那么 信号的处理就无止尽了. 这种情况是不允许发生的.所以 可以通过使用。
2024-12-23 22:27:37
1033
3
原创 Linux系统编程——系统内核中的信号
在信号之前讲到的所有进程信号的产生都需要OS来执行,为什么?我们提到进程在接收到信号之后通常有着三种处理方式,那么针对这三种处理方式,进程是立即处理的吗?如果不是立即处理,那么信号是否需要暂时被进程记录下来?记录下来放在哪里呢?一个进程在没有收到信号的时候,怎么知道自己应该对合法信号作何处理呢?怎么理解OS向进程发送信号?是怎么发送的?具体情况是什么?接下来我们将从系统内核层面着重讨论和理解进程信号产生之后进程处理信号的详细操作以及进程信号的产生到进程接收之间内核做了哪些事情。
2024-12-22 21:39:43
1158
原创 Linux系统编程——信号
在Linux操作系统中,进程信号是一个非常重要的概念。我们在前面的文章中已经见识过了进程信号了,比如我们在进程的一章中,尝试过向进程发送9号信号来终止进程(所以对于用户来说,我们可以通过向进程发送特定的信号使得进程完成某些指定的动作。signal()捕捉信号:其是一个系统调用接口,作用是捕捉进程信号,并由用户处理。可以看到该函数的函数声明:signal(intsignum。
2024-12-22 09:56:56
821
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人