本地的gitgit除了最经典的add commit push用来做版本管理,其实他的分支管理也非常强大
可以说你学好了分支管理,就可以完成团队的配合协作了
git仓库我们可以使用git init来初始化一个git仓库,只要能看见.git文件夹,就代表这是一个git仓库了
git分区git一共有三个分区,工作区、暂存区、版本库
工作区和.git文件夹在相同目录即为工作区,也就是我们写代码的地方
暂存区与版本库这两个分区实际上是存在.git文件夹里的
当我们使用add之后,代码就会被存储在暂存区,只有commit之后,也就是提交代码,整个代码才会被放入版本库,也就是上图的master文件夹中
我们也可以偷看一下.git文件夹,需要注意的是,我们绝不能更改.git文件夹的任何内容
在整个git目录中,我们不需要全部搞明白,只需要抓住几个核心文件即可
objects:这是一个对象目录,存储的是git对象,Git进行版本管理的核心不是将文件全部备份,而是只记录修改的部分,当工作区代码修改后,会将修改的内容写入obj库中的一个新git对象中,因此暂存区和版本库存的不是数据本身,而是g...
死信队列的概念死信(Dead Letter)是消息队列中的一种特殊消息,是指没有办法被正常消费或者处理的消息,例如消息过期、消息被拒绝、队列满了
RabbitMQ的私信队列就专门用来存储这些死信消息
死信的来源
消息被拒绝(Rejection) 消费者显式拒绝接收某条消息,并且不希望该消息被重新投递时,这条消息会进入死信队列。
消息超时(TTL Expiration) 消息的生存时间(Time-To-Live, TTL)超过了指定的时长,而消息仍未被消费,这样的消息会被转移到死信队列。
队列长度超限(Queue Overflow) 当消息队列的长度达到最大限制,再有新消息进入时,多出来的消息可能会被直接移动到死信队列。
重试次数达到上限 某些消息在多次消费尝试失败(如因业务逻辑异常)后,达到最大重试次数后进入死信队列。
死信队列的应用场景对于RabbitMQ来说,死信队列是可以存储不能被正确消费的信息的,可以通过消费死信队列中的内容来分析可能出现的异常情况,可以用于改善和优化系统
可以用于比如说消息重试,丢弃,日志收集,人工处理等
常见的死信队列实现
RabbitMQ...
ProtoBuf介绍ProtoBuf全称是Protocol Buffer,是一个数据结构的序列化和反序列化框架
他又很多好处,首先是他支持跨平台,支持Java、C++、Python等多种语言,还比XML更小更快更简单
除此之外还可以更新数据结构,不会破坏原有的结构
使用流程
这个框架的使用流程是这样的
我们需要编写的是.proto文件,来描述结构化的对象,和其中的成员,属性
这个文件可以使用protoc编译器来处理,处理的结果就是我们需要的对应的语言,用来结构化对象数据操作的代码
我们在业务代码中包含这些头文件,就能使用这些方法把我们要序列化或者反序列化的数据进行处理
QUICK START这里我们通过一个简单的通讯录实现来快速上手protobuf
创建.proto文件推荐的规范
创建该文件,文件名必须用全小写命名,字母之间使用_连接
2字符缩进
注释与C/C++一样
12///* */
语法123456789101112syntax = "proto3"; // 指定使用proto3版本语法package contacts; // 可选的声...
RPCRPC是一种通信协议 他可以让程序在不同的计算机上调用彼此的程序或者服务 就像本地调用函数一样调用远程服务器的服务
RPC框架负责底层的网络通信 序列化和反序列化数据 错误处理
这样我们在开发的过程中就不再需要重复造轮子了 这和reactor一样只是一种编程思想
各家公司一般都有自己的RPC框架
RPC架构和工作流程RPC的工作流程很简单
客户端调用:客户端调用本地的一个代理函数(stub),负责将请求参数序列化,然后发送到服务器
代理函数(stub):是负责客户端和服务器之间的通信 主要是为远程服务调用提供的一个本地接口 把远程调用的过程隐藏起来 他的内部处理功能就是序列化与反序列化 错误处理 返回结果 这种代理函数也支持多种编程语言 让不同语言的服务也能够通信
网络传输
服务处理:服务端接收代理函数的请求 反序列化参数 调用相关服务
响应返回
客户端接收
我们可以在很多地方都看到这种思想 例如MySQL的客户端和服务端分离 RabbitMQ的客户端服务端分离
客户端负责的起始就只有把请求按要求进行序列化和传递请求给服务端 真正运行复杂服务的是服务端
...
在 C++ 项目中,灵活地读取用户配置是提升软件可用性的重要部分。本文将介绍几种常见的 C++ 配置库,包括它们的原理和使用方法。
1. inih 库原理inih 是一个轻量级的库,专门用于读取 .ini 格式的配置文件。它通过逐行解析文本文件,识别键值对和节(section),便于简单的配置管理。
使用方法
安装 inih 库:
1git clone https://github.com/benhung11/inih.git
创建配置文件(config.ini):
123[Settings]log_level=debugoutput_path=/var/log/myapp.log
代码示例:
123456789101112131415161718#include "INIReader.h"#include <iostream>int main() { INIReader reader("config.ini"); if (reader.ParseError() < 0) { ...
随着互联网技术的发展,业务规模和数据量不断扩大,为了能够又快又精确的为用户提供服务,技术架构也不断演进,来适应不同时期的业务需求
本文主要介绍八种业务架构以及优缺点和演进的过程
单机架构也称之为单体架构,主要指的是将系统的各个模块集成在一起形成一个整体的应用,通常是一整个服务器为用户提供服务
我们可以用一个简单的网站服务来画一个示意图
我们输入目标服务器的域名之后,会先访问DNS服务获取服务器的IP地址,然后在由服务器为用户提供服务,这里的网站服务和数据库服务是处于同一台机器的,因此也就是单机服务
特点:系统的各个模块集成在一起形成一个整体应用,通常由一个大型代码库管理 每次部署和更新都需要发布整个应用
优点:适合初期开发和快速上线,维护成本低,开发和测试相对简单
缺点:随着业务复杂度增加,单体架构的维护变得困难,更新和部署风险高,扩展性有限,容易出现性能瓶颈
相关软件Web 服务器软件:Tomcat、Netty、Nginx、Apache 等
数据库软件:MySQL、Oracle、PostgreSQL、SQL Server 等
应用数据分离架构当服务器的资源不够用的时候,一种很...
cinatra简介cinatra是一个基于C++20协程的高性能HTTP框架,它的目标是提供一个快速开发的C++ HTTP框架解决方案
它不仅支持HTTP/1.1和1.0,还支持SSL和WebSocket,使得开发者可以轻松构建数据库访问服务器、文件上传下载服务器、实时消息推送服务器,甚至是MQTT服务器
主要特点
统一而简单的接口:cinatra提供了一个简洁的API,使得开发者可以快速上手
Header-only:作为一个头文件库,cinatra无需复杂的编译和链接过程,可以直接包含头文件即可使用
跨平台支持:cinatra可以在多种操作系统上编译和运行,包括Ubuntu、macOS和Windows
高性能:cinatra在性能测试中表现出色,是世界上性能最好的HTTP服务器之一。
支持面向切面编程:cinatra支持AOP(面向切面编程),允许开发者以非侵入式的方式添加日志、安全检查等功能
快速上手编译器版本要求要使用cinatra,你需要一个支持C++20的编译器,如gcc 10.2、clang 13或Visual Studio 2022。
使用指南cinat...
WebSocket 是一种计算机网络协议,提供了全双工、低延迟的双向通信。它广泛用于实时数据传输场景,比如即时消息、在线游戏、实时股票行情、实时通知等应用中。与传统的HTTP协议不同,WebSocket支持持久连接,允许客户端和服务器保持一个持久的连接,通过该连接进行双向数据通信。
WebSocket协议概述WebSocket协议建立在HTTP协议之上,首先通过一个HTTP请求来进行握手。一旦握手完成,客户端和服务器之间的连接会被“升级”到WebSocket协议,之后通信不再依赖HTTP,而是直接使用WebSocket协议。
WebSocket握手过程WebSocket协议的握手过程是基于HTTP协议的,过程如下:
客户端发起请求:客户端发起一个HTTP请求,要求服务器将协议升级为WebSocket。请求的格式如下:
123456GET /chat HTTP/1.1Host: example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Sec-WebSock...