自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 资源 (5)
  • 收藏
  • 关注

原创 【redis】使用stream消息队列做服务间的数据同步

这类专业的队列中间件,在使用时一般都是部署一个集群,生产者在发布消息时,队列中间件通常会写'多个节点',以此保证消息的完整性。这样即便其中一个节点挂了,也能保证集群的数据不丢失。Redis Streams 是一种持久化的消息队列实现,可以用于构建复杂的事件驱动应用程序和服务,Streams 允许你按顺序添加消息到一个逻辑有序的流中,并支持多消费者模型。提供了可以指定队列最大长度的功能,在添加消息时,可以设置 MAXLEN 来指定队列的最大长度,如果超过限制,redis 会把最早的消息删除,这样就避免了。

2024-09-14 21:11:20 663

原创 【traefik】使用forwardAuth中间件做网关层的全局鉴权

1 forwardAuth中间件1 forwardAuth中间件将认证逻辑委托给一个外部服务服务返回 2XX code 表示鉴权通过,traefik 将继续请求业务服务服务返回其他 code 表示鉴权失败,traefik 会将请求挡住,直接返回未认证错误。

2024-09-11 14:24:45 206

原创 SSO单点登录&Oauth2/CAS认证

和OAuth 相比,CAS 不区分 access_token 和 refresh_token,也不考虑 token 过期的刷新,TGT 也可以重复使用(OAuth 的 code 码使用一次即失效),认证中心只需发放、管理 TGT/ST即可。用户在认证中心完成认证之后,认证中心在自己的域名下会写入一个 Cookie,各个子业务系统去请求认证中心的“检查用户是否登录”的接口时,浏览器会携带上此 Cookie,从而获取到用户的登录态。由于此时用户在认证中心已经登录过了,所以会直接携带用户的凭证回到业务系统 B。

2024-09-07 16:16:16 644

原创 【mysql】自增锁

自增锁是一种表级锁,在使用自增主键(AUTO_INCREMENT)时,为了保证数据唯一性,在插入数据时,innodb 会对自增字段进行加锁,以确保并发情况下每条记录都能够获得唯一的自增值。如事务 A 正在插入数据,则另一个事务 B 尝试 INSERT 语句,B 会被阻塞住,直至 A 释放自增锁。

2024-08-18 17:19:51 465

原创 【mysql】sysbench压测工具

【代码】【mysql】sysbench压测工具。

2024-08-18 13:51:30 218

原创 【mysql】并发 Insert 的死锁问题:Deadlock found when trying to get lock; try restarting transaction

这样可以控制多个事务锁定资源的顺序,也就是在一个事务中,执行子查询会锁定 pid 所在的行(X锁),直至 Insert 结束,此过程中其他事务不能在对相同行加 X锁或S锁,需等待前一个事务完成后才能继续执行。`,导致事务在计算 display_order 值的过程中,锁定相关行。如果多个事务同时执行插入操作,锁定相同的行,就会导致互相等待的情况,出现死锁。但是不能完全解决问题,当多个并发事务语句中的 pid 相同时,仍会锁定相同行,导致死锁。:使用事务,先执行子查询,获取数据后在同一个事务中执行插入。

2024-08-14 18:39:29 458

原创 【etcd】4.boltdb存储引擎(一):boltdb的核心思想

每个 db 会有个默认的 root bucket,以此为起点可以衍生出一个 bucket B+ 树,每个 bucket 下的数据又是一颗 B+树。freelist page:存储空闲 page 信息,哪些 page 空闲可用,哪些 page 将被事务释放(全局维度,相当于 go 语言中的 heap,以空间换时间,缓存并管理空闲 page 以供复用,减少与操作系统的交互频率)memory-mapping,是内核的一个概念,它隐藏了与磁盘交互的细节,使用方能够像访问内存中的字节数组一样读取磁盘文件中的内容。

2024-06-30 17:39:21 706

原创 【k8s】8.k8s的网络模型(二):Flannel网络模型

flannel 通过该配置可以将网卡的 IP、MAC 信息存储到 etcd 中,这样,flannel 就知道所有的节点分配的 IP 段及 VTEP 设备的 IP 和 MAC 信息,并且所有节点的 flanneld 都可以感知到节点的添加和删除操作,就可以动态的更新本机的转发配置。上述介绍都是基于 VXLAN 实现的 Flannel 网络,VXLAN 适用于三层可达的网络环境,对集群的网络要求很宽松,但是同时由于会通过 VTEP 设备进行额外封包和解包,因此给性能带来了额外的开销。

2024-06-29 17:26:30 860

原创 【k8s】7.k8s网络模型(一):容器网络接口CNI,VXLAN网络

VXLAN 虚拟可扩展的局域网(Virtual eXtensible Local Area Network),是一种 overlay 技术,通过三层的网络来搭建虚拟的二层网络。由于k8s容器的所有流量都会打到网桥上,那么可以直接将 VTEP 设备插到网桥上,容器流量通过网桥发至 VTEP 设备,再经过 VXLAN 网络转发出去。创建在原有的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 VXLAN。)设备,负责 VXLAN 协议报文的封包和解包,也就是在虚拟报文上封装。

2024-06-29 15:29:32 748

原创 【k8s】6.pod控制器(二):pod拓扑分布约束,优先级与抢占,pod驱逐

比如 kubelet 还来不及驱逐,Node 上的资源就被耗尽导致宕机,此时 control-plane 无法正常和该节点通信,拿不到节点上的 Pod 的状态,因此会做最坏的打算,认为这些 Pod 都挂了,因此会将该 Node 上的所有 Pod 都驱逐到其他节点重新跑起来,以保证高可用。node-eviction-rate: 驱赶 Node 的速率,由令牌桶流控算法实现,默认为 0.1,即每秒驱赶 0.1 个节点(注意这里不是驱赶 Pod 的速率,而是驱赶节点的速率,相当于每隔 10s,清空一个节点)

2024-06-23 19:31:32 996

原创 【k8s】5.pod控制器(一):pod生命周期,健康检查,滚动更新,重启与崩溃

又称为控制器,是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。k8s提供几种资源作为工作负载:无状态的:Deployment, Replicaset有状态的:Statefulset守护进程:Daemonset批处理:Job, Cronjob。

2024-06-16 18:47:05 1065 1

原创 【k8s】4.调度器的调度策略:节点选择器,节点亲和性,污点与容忍,pod亲和性

1 节点的调度策略我们可以在node节点上定义的一些规则,来决定上。1.1 节点选择器nodeSelector这是一种较常用也是较简单的方式,将pod调度到指定label的node上,可以满足一般情况下的调度需求。这样pod就会被调度到有对应标签的节点上了。如果找不到任何一个node有nodeSelector定义的标签,pod是会一直Pending的~1.2 节点亲和性。

2024-06-16 17:13:50 882

原创 【k8s】3.k8s的调度过程:一个deployment的创建过程

deployment controller:监听deployment的创建事件,创建相应的replicaset副本集(控制副本数量)。replicaset controller:监听replicaset的创建事件,创建相应的pod。预选:遍历k8s集群中所有的pod,根据节点亲和性、污点、容忍、硬件资源计算等,选出符合要求的ndoe最为预选node。controller manager监听到etcd中的事件,对于不同的资源,触发不同的处理方式。以上三种接口是k8s定义的标准,具体的实现都是由插件完成的。

2024-06-16 14:59:35 1049

原创 【traefik】traefik性能测试

无论是将业务节点增到6个,traefik节点增到3个,还是增加并发,都不能提升cpu利用率,nginx、traefik、业务pod的cpu都打不满。在12核机器上,单 nginx 节点cpu最多不到3核,单traefik不到2核,每个业务pod不到1核....将traefik服务增加至3节点,业务服务6节点,并对业务服务重新分配节点确保负载均衡,进行测试,发现性能没有明显变化。以下 traefik 服务为单pod,业务服务为3pod,且limit限制4个cpu、2G内存。请求traefik入口。

2024-05-18 15:54:53 900

原创 !真是一场酣畅淋漓的docker & k8s安装大战

1 环境mac m2(arm芯片)ubuntu 24.04docker 20.10.10k8s 1.23.1(单机)2 离线安装docker 20.10 arm版我这里要指定版本安装,所以用的离线安装方式。阿里docker镜像源在这里找:https://mirrors.aliyun.com/docker-ce/linux/static/stable/完整安装过程:

2024-05-01 04:33:51 393 2

原创 【traefik】基于k8s搭建traefik, nginx与traefik共存

ingress controller 负责解析 Ingress 的反向代理规则,当它收到请求后就会根据规则将请求转发到对应的 Service。每种边缘路由都有自己的 ingress controller,如 nginx ingress controller。此toml文件是静态的,不会热更新,关于动态配置文件下一篇再聊。检查pod 状态是否正常即可。

2024-04-27 23:16:32 2246

原创 【网络】http2.0

http1.x的传输单位是报文段,http2.0将传输单位切分为更小的帧(报文段的一个数据块),多个帧可以并行乱序发送,根据帧首部的流标识重新组装,提高传输速度。并且通讯双方各自存储一份头部字段表,不需要再重复发送header,如果header发生了变化,则只需将变化的部分加入到header帧中,更新头部字段表即可。服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端。对http1.x主要是性能上的提升,且对1.x兼容。

2024-04-27 19:39:04 114

原创 【网络】http & https

服务器申请CA证书:服务器向一个可信的证书颁发机构(CA)申请一个数字证书,包含了服务器的公钥和一些其他信息,并由CA使用其私钥进行签名。客户端生成预主密钥并加密:客户端生成一个预主密钥(Pre-Master Secret),使用之前从CA中提取出的公钥对预主密钥进行加密,将加密后的预主密钥发送给服务器。生成会话密钥:客户端和服务器都拥有了相同的预主密钥,使用预主密钥等信息,计算出会话密钥(Session Key),用于后续的加解密。客户端的CA公钥与CA对服务器提供的公钥进行签名的私钥是一对。

2024-04-27 19:37:27 528

原创 【网络】tcp

接收方收到数据后,会对数据进行同样的校验和计算,并与发送方的校验和进行比对。所以在server发送ACK后,需要等待client的close()信号,表示对方已经确定没有数据传输了,再发送FIN信号。中告诉发送方其当前可用的缓冲区大小,发送方则根据这个信息来调整发送速率,避免发送过多的数据导致接收方无法及时处理。为每个数据段分配一个唯一的序列号,接收方在收到数据后,会向发送方发送一个包含接收到的数据段序列号的确认应答(如果发送方没有收到确认应答,或者序列号不连续,它会重新发送丢失或损坏的数据段。

2024-04-27 19:31:33 545

原创 【数据库】分库分表 & 数据库迁移

2. 数据库迁移1. 分库分表。

2024-04-27 19:25:22 600 1

原创 【数据库】elasticsearch

当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。在创建索引时,可以指定主分片的数量,一旦索引创建完成,主分片的数量就不能再更改。副本分片与主分片分布在不同的节点上,当主分片所在的节点出现故障时,副本分片可以接管主分片的工作,确保服务的连续性。副本是主分片的完全复制,用于提供数据的冗余备份,增强数据的可用性和容错能力。

2024-04-27 19:17:49 489 2

原创 【数据库】mongo

而多键索引主要用于支持包含数组或嵌套文档的字段的查询,它允许数据库系统对数组中的每个元素进行索引。索引大小:非聚簇索引的大小通常取决于索引字段的值和指针的大小。而多键索引可能会增加索引的大小,因为对于每个数组元素,索引条目:非聚簇索引的索引条目是指向数据行的指针和索引字段的值。而多键索引的索引条目是数组元素或嵌套文档本身。索引本身是在高速缓存当中,相比磁盘IO操作会有大幅的性能提升。面向文档 的存储方式(bson),模式自由,不需要字段定义。单字段索引、复合索引、多键索引、哈希索引、文本索引。

2024-04-27 19:11:24 273

原创 【数据库】mysql

同样,如果查询条件包含范围查询,如a=1 and b>2 and c=3,那么索引匹配在b字段上就会停止,因为b字段是一个范围查询,它之后的字段(如c字段)将无法使用索引。一个表可以有多个非聚簇索引,因为非聚簇索引只是数据的副本,并不会改变数据的物理存储顺序。优化查询计划:查询优化器生成一个或多个可能的查询执行计划,优化器会评估每个计划的成本(磁盘/CPU/内存),选择成本最低的。在一个事务内执行相同的查询,但由于其他事务插入了满足其查询条件的新行,导致第二次查询返回了更多的行。

2024-04-27 19:08:07 938

原创 【数据结构】B树, B+树, B*树, 红黑树, 平衡二叉树

mongo的存储引擎 WiredTiger 实现lazyB树,是一种 B+ 树变种。任一节点的左子树和右子树都是平衡二叉树,且高度差不能超过1(平衡因子)(1)mongo 3.2之前用的是B树,后面改为B+树。在B+的非根和非叶子结点,增加指向兄弟的指针。(4)数据插入和删除。

2024-04-27 18:57:01 1205

原创 【分布式】分布式锁:redis/etcd/mysql/zookeeper的分布式锁

watch 并不会 watch 所有 key,而是 revision 小于自己且最接近自己的那一个 key,那么所有取锁方就会根据 revision 排成队列,锁释放时,只会通知到下一个取锁方,不会惊群。若一把锁的竞争比较激烈,那么锁的释放事件可能同时被多个的取锁方监听,一旦锁被释放,所有取锁方都会一拥而上尝试取锁。每个取锁方都写入一个 kv,绑定租约,key形如 {prefix}/{leaseId},并获取自身的 revision(那么不同取锁方key的revision都不同)

2024-04-27 18:44:33 572

原创 【分布式】事务 & TCC

TCC Transaction:支持广义的分布式事务,每个模块需要改造成实现 Try/Confirm/Cancel 能力的 TCC 组件,通过事务协调器进行全局 Try——Confirm/Cancel 两阶段流程的串联,保证数据的最终一致性趋近于 100%Transaction Message:支持狭义的分布式事务,基于消息队列组件中半事务消息以及轮询检查机制,保证本地事务和消息生产两个动作的原子性,但不具备事务的逆向回滚能力。使用mq,本地事务包裹消息投递的方式处理事务。

2024-04-27 18:37:00 955

原创 【Web框架】4.GRPC基于etcd做服务注册与发现

客户端首先取得服务端的节点 endpoint 列表,基于一定的负载均衡策略选择到特定的 endpoint,直连发起请求.grpc负载均衡策略:pick_first选第一个(默认);round_robin轮询。常用的负载均衡策略:随机、轮询、加权随机、加权轮询、源地址哈希法、最小连接数法。

2024-04-27 18:20:16 666

原创 【k8s】2.k8s通信原理

kube-proxy 监听 service 和 endpoint 的变化,当有 service 创建时,所有节点的 kube-proxy 在节点上随机选择一个端口,在 iptables 中追加一条,把访问 service 的请求重定向到这个端口的,并监听这个端口的连接请求。pause 容器会创建一个网络命名空间,其他容器加入到 puase 容器中共享 pause 的网络,一个 pod 中所有的进出流量都是通过 pause 容器完成的,通过 localhost 相互通信。(封包解包有性能开销)

2024-04-27 18:04:14 2303 1

原创 【k8s】1.k8s架构

分为两大部分:master节点:负责提供API通信接口,集群的管理、调度、数据存储node节点:负责容器的运行,运行的生命周期管理。

2024-04-27 17:26:12 314 1

原创 【go-zero框架】2.服务注册与发现

本篇讨论etcd的服务注册与发现方式~

2024-04-27 17:20:02 593

原创 【docker】2.docker网络

每一个docker容器拥有自己的网络命名空间,那么容器之间是如何通信的呢?docker容器有4种通信方式:bridge模式(默认)host模式container模式none模式。

2024-04-19 21:50:57 806

原创 【go-zero框架】1.goctl工具

go-zero框架与goctl工具

2024-04-18 18:43:17 407

原创 【go的测试】2.性能测试

性能测试,benchmark,pprof,abtest

2024-04-09 22:17:59 772

原创 【go的测试】1.错误测试

1. go的几种测试1. go的几种测试错误测试:模糊测试 fuzzingmockmonkey性能测试:基准性能测试 benchmarkpprofab测试其他第三方工具本章总结的是几种错误测试,性能测试见下节。2. go test 命令参数3. Fuzzing 模糊测试(1)Fuzzing 模糊测试(随机测试)一种基于随机输入的自动化测试技术。Fuzzing不需要像单元测试那样使用预先定义好的数据集作为程序输入,而是会通过数据构造引擎自行构造或基于开发人员提供的初始数据。

2024-04-09 21:55:01 322

原创 【Web框架】3.GRPC原理

RPCRPC1. rpc协议rpc远程过程调用,是一套协议,基于这套协议规范来实现的框架都可以称为 rpc 框架,常见的 Dubbo、Thrift 和 gRPC。本地方法调用的形式:对于调用方来说,调用 rpc 方法和调用本地方法并没有明显区别。保存服务端地址信息请求编码:将客户端请求方法名、参数等打包,序列化发送请求到服务端(grpc用的是http2方式发送的)接收请求:包含要调用的方法名、参数、其他元数据,并解码调用本地方法:将请求中的参数传递给本地方法,并等待执行。

2024-03-27 23:06:23 896

原创 【Web框架】2.Gin框架

为了能快速找到并组合完整的路由,GIN 在添加路由的同时,会在每个节点中添加 Priority 这个属性。Context 是通过中间件来传递的,在处理 HTTP 请求时,Gin 会依次执行注册的中间件,每个中间件可以对 Context 进行一些操作,然后通过Next() 将 Context 传递给下一个中间件。会将注册的中间件函数HandlerFunc 添加到路由组的函数链HandlersChain中,后续路由组下新注册的 handler 都会在前缀中拼上这部分公共的 handlers。

2024-03-27 22:49:45 944

原创 【Web框架】1.go的net/http标准库

调用链:Post()->Client.Post()->Client.Do()->Client.send()->Transport.RoundTrip()若无可用连接,通过 queueForDial 异步创建一个新的连接,并通过接收一个ready channel的方式,等待连接创建完成。Transport.dialConn:调用 Transport.dial 创建 tcp 连接,并启动异步。persistConn.roundTrip:通过 tcp 连接完成与服务端的交互。for + Accept 阻塞。

2024-03-27 22:39:43 920

原创 【etcd】3.lease租约

在v2版本:没有lease概念,ttl属性携带在key上,etcd client为每个key/ttl创建一个http连接,定时发送请求给etcd server。当ttl短(续期频繁)、key多时,对性能有很大影响。v3版本:将ttl属性绑定在lease上,多个key可以复用一个lease,且将http优化为grpc连接,多路复用流式传输,一个连接可以为多个租约续期,减少了连接数。KeepAlive()——永久续期,客户端只需调用一次,并监听返回值channel,若被closed表示租约被中断。

2024-03-26 17:41:57 1081

原创 【etcd】2.mvcc与etcd watch

4. 读源码1. MVCCMVCC(Multi-Version Concurrency Control)多版本并发控制:一种机制,用于实现分布式系统中的并发控制。集群的版本号Revision:逻辑时间戳,全局单调递增,任何 key 的增删改都会使其自增key的版本号CreateRevision:创建 key 时集群的 Revision, 直到删除前都不变ModRevision:修改 key 时集群的 Revision, key 更新时会自增Version:初始为1,更新时自增。

2024-03-26 17:22:08 994

原创 【docker】1.docker的虚拟化原理

docker的虚拟化原理,namespace命名空间,control group资源隔离,unionFS联合文件系统

2024-03-24 20:19:56 690

学习资料 golang的GMP调度模型

视频教程+笔记+ppt

2023-11-02

基于稀疏表示的人脸表情识别程序

基于稀疏表示的人脸表情识别matlab程序,用KSVD构建稀疏表示字典,OMP算法重构信号,实现表情的识别。

2018-06-30

利用模糊算法进行边缘检测的例子

使用模糊理论做的边缘检测的matlab小例子,可以时间简单的图像边缘检测。

2018-06-30

NSGA-2 matlab 实例

NSGA-II非支配排序遗传算法的matlab实例,完整程序可直接运行

2018-06-30

android界面——图片轮播

android简单的界面,包括图片轮播,图片滑动

2016-01-19

android界面-图片轮播VeiwPager

android界面,包含简单的图片轮播,图片滚动等

2016-01-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除