K8s之Deployment控制器入门到深入详解

news2024/11/15 17:32:46

文章目录

    • 一、Deployment 高级控制器理论
      • 1、Deployment控制器介绍
      • 2、Deployment工作原理
    • 二、Deployment YAML编写及参数解释
      • 1、整体Deployment YAML资源清单内容:
      • 2、核心参数解释:
      • 3、Deployment更新策略:
      • 4、Deployment更新策略百分比方式计算公式:
    • 三、实战案例:
      • 1、Deployment部署WEB站点
      • 2、Deployment针对WEB站点扩缩容
      • 3、Deployment针对WEB站点滚动更新
      • 4、Deployment针对WEB站点回滚版本
    • 四、蓝绿部署发布
      • 1、蓝绿部署介绍
      • 2、案例:实现蓝绿部署
    • 五、金丝雀(灰度)部署
      • 2、金丝雀部署介绍
      • 3、案例:实现金丝雀部署
    • 五、总结

一、Deployment 高级控制器理论

官方中文参考文档:

1、Deployment控制器介绍

Deployment是ReplicaSet的高级别抽象,ReplicaSet控制器有的功能Deployment全部具备,ReplicaSet没有的Deployment也具备比如,它提供了滚动升级和回滚的功能。Deployment是控制多个ReplicaSet,从而可以实现无缝升级和回滚。

Deployment控制器特点:

  • 选择器:ReplicaSet使用标签选择器来选择要管理的Pod副本。
  • 伸缩性:Deployment高级控制器可以根据负载自动伸缩容器数量,以满足应用程序的需求。
  • 自我修复:Deployment高级控制器可以监控容器的健康状况,并在容器出现故障时自动重启或替换容器。
  • 负载均衡:Deployment高级控制器可以通过负载均衡算法,将请求分发到不同的容器实例上,以提高应用程序的性能和可用性。
  • 版本控制:Deployment可以指定多个ReplicaSet,每个ReplicaSet可以控制不同版本的Pod,从而实现灰度发布和回滚。
  • 声明式:指直接修改资源清单yaml文件,然后通过 apply ,就可以更改资源。

2、Deployment工作原理

Deployment控制器建立在ReplicaSet控制器之上,管理多个ReplicaSet,每次更新镜像版本,都会生成一个新的ReplicaSet,把旧的ReplicaSet替换掉,多个ReplicaSet同时存在,但只运行一个ReplicaSet。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oihJ8ed8-1685790124572)(D:\MD归档文档\IMG\image-20230602095346882.png)]

如上图所示:ReplicaSet V1版本控制了三个Pod,ReplicaSet V1版本删除一个Pod,会在ReplicaSet V2版本新建一个Pod,以此类推,直到ReplicaSet V2版本完全替换完。

如果ReplicaSet V2版本更新上去存在问题,还可以回滚,Deployment建立在ReplicaSet之上,多个ReplicaSet组成一个Deployment,但只有一个ReplicaSet处于活跃状态。

二、Deployment YAML编写及参数解释

使用explain命令查看定义 可以查看 deployment控制器字段说明:

kubectl explain deployment

1、整体Deployment YAML资源清单内容:

cat demo-deployment.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deployment-1
  labels:
    env: uat
spec:
  replicas: 3
  minReadySeconds: 10  # 更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了
  paused:  # 暂停,当更新Pod时,先暂停,而不是立马更新
  progressDeadlineSeconds: 60 # 更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作 
  strategy:
    rollingUpdate:        # 滚动更新,定义滚动更新方式,也就是pod能多几个,少几个
      maxSurge: 20%       # 允许更新中,最多超过Pod数值
      maxUnavailable: 20% # 允许更新中,最多允许几个不可用
  selector:
    matchLabels:
      app: demo-nginx
  template:
    metadata: 
      labels:
        app: demo-nginx
    spec:
      containers:
      - name: demo-nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        startupProbe:      # 启动探测
          tcpSocket:
            port: 80
        livenessProbe:     # 存活探测 
          httpGet:
            port: 80
            path: /index.html
        readinessProbe:    # 就绪探测
          httpGet:
            port: 80
            path: "/index.html"

2、核心参数解释:

  • spec.minReadySeconds:更新场景,等待时间,如果没有设置K8S会假设该容器启动起来后就提供服务了。
  • spec.paused: 暂停,当更新Pod时,先暂停,而不是立马更新,后面金丝雀发布要用到
  • spec.progressDeadlineSeconds:更新场景,等待时间超过此值,状态标记False,并说明原因,但是它并不会阻止 Deployment 继续进行卡住后面的操作
  • spec.strategy.rollingUpdate:滚动更新,定义滚动更新方式,也就是pod能多几个,少几个
  • spec.strategy.rollingUpdate.maxSurge:指定在更新期间可以创建的新Pod的最大数量。例如,如果maxSurge设置为1,而Deployment中有3个Pod,则在更新期间可以创建4个Pod,其中3个是旧的Pod,1个是新的Pod。
  • spec.strategy.rollingUpdate.maxUnavailable:指定在更新期间可以同时停止的旧Pod的最大数量。例如,如果maxUnavailable设置为1,而Deployment中有3个Pod,则在更新期间可以停止2个Pod,其中1个是旧的Pod,1个是新的Pod。

3、Deployment更新策略:

Deployment目前支持两种更新策略

  • Recreate:重建式更新,把Pod全部删除,在重新创建,风险很大,不建议使用

  • rollingUpdate:滚动式更新,批量替换更新,平滑升级,用户无感知

4、Deployment更新策略百分比方式计算公式:

假设有5个副本,最多一个不可用,就表示最少有4个可用

  • maxSurge: 25% 5*25%=1.25(~=2) 5+2=7个可用
  • maxUnavailable: 25% 5%25%=1.25(~=1) 5-1=4个不可用

三、实战案例:

1、Deployment部署WEB站点

WEB站点镜像下载:

导入镜像:

ctr -n=k8s.io images import  k8s_web.tar.gz

资源清单如下:

cat web-deployment.yaml 

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    env: uat
spec:
  replicas: 5
  minReadySeconds: 10  
  progressDeadlineSeconds: 60 
  strategy:
    rollingUpdate:
      maxSurge: 20%       
      maxUnavailable: 20% 
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata: 
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: web:v1
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: /index.html
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"

执行YAML清单文件:

kubectl apply -f web-deployment.yaml

查看创建出来的资源:

kubectl get pod,rs -l app=web-nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dy1yG9Tx-1685790124573)(D:\MD归档文档\IMG\image-20230602113208393.png)]

访问WEB网站:

podIp=$(kubectl get pod -l app=web-nginx|awk NR==2|awk '{print $1}')
kubectl describe pod  ${podIp}|grep -w IP:|awk NR==1|awk '{print $NF}'

curl 10.244.235.214
web version = V1

2、Deployment针对WEB站点扩缩容

扩容,将副本扩容至 7,根据上面YAML修改spec.replicas=7

修改完成后重新执行apply:

kubectl apply -f web-deployment.yaml

查看Pod数量:

kubectl get pods -l app=web-nginx|tail -n +2|wc -l

缩容,将副本缩容至 3,根据上面YAML修改spec.replicas=3

修改完成后重新执行apply:

kubectl apply -f web-deployment.yaml

查看Pod数量:

kubectl get pods -l app=web-nginx|tail -n +2|wc -l

3、Deployment针对WEB站点滚动更新

滚动更新是一种自动化较高的更新方式,即一批一批的更新Pod资源,用户体验比较平滑。滚动更新使用 spec.strategy.rollingUpdate 字段来定义。

基于上面YAML资源清单进行滚动更新,更换镜像版本为V2 YAML如下:

cat web-deployment.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deployment
  labels:
    env: uat
spec:
  replicas: 5
  minReadySeconds: 10  
  progressDeadlineSeconds: 60 
  strategy:
    rollingUpdate:
      maxSurge: 30%         # 5*30%=1.5(~=2), 2+5=7,更新期间最多创建7个Pod 
      maxUnavailable: 20%   # 5*20%=1, 1-5=4,更新期间最多停止4个Pod
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata: 
      labels:
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: web:v2    # 版本更新
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: /index.html
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"

执行YAML文件:

kubectl apply -f web-deployment.yaml

访问WEB网站:

podIp=$(kubectl get pod -l app=web-nginx|awk NR==2|awk '{print $1}')
kubectl describe pod  ${podIp}|grep -w IP:|awk NR==1|awk '{print $NF}'

curl 10.244.235.236
web version = V2

可以看到WEB网站内容更新至V2版本了

4、Deployment针对WEB站点回滚版本

查看历史版本:

kubectl rollout history deployment web-deployment

回滚版本:回滚到V1 版本

kubectl rollout undo deployment web-deployment --to-revision=1

访问WEB网站:

podIp=$(kubectl get pod -l app=web-nginx|awk NR==2|awk '{print $1}')
kubectl describe pod  ${podIp}|grep -w IP:|awk NR==1|awk '{print $NF}'

curl 10.244.235.231
web version = V1

可以看到WEB网站内容更新至V1版本了

四、蓝绿部署发布

1、蓝绿部署介绍

蓝绿部署中,需要有两套系统,一套是正在提供服务系统,标记为 绿色,另一套是准备发布的系统,标记为 蓝色,两套系统功能完善,只有 绿色 对外提供服务、蓝色用来发布前测试,测试无问题直接可以系统更新为 蓝色。

切换后一段时间内,蓝绿两套系统并存,观察蓝色系统确实无问题之后,将其进行删除,将资源回收。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7dooZhRI-1685790124573)(D:\MD归档文档\IMG\image-20230603152442649.png)]

  • 优点:两套系统指只需要更改路由或者切换DNS服务器,风险小,效率高。
  • 缺点:两套系统并存,占用资源大。

2、案例:实现蓝绿部署

K8S不支持蓝绿部署,需要我们来进行规划,创建不同的Deployment、不同的Service来实现不同流量的切换!

  • 创建绿色系统(第一版)YAML如下:
cat green-demo.yaml 

---
apiVersion: v1
kind: Namespace
metadata:
  name: blue-green-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: green-app
  namespace: blue-green-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: green-app
  template:
    metadata:
      name: green-app
      labels: 
        app: green-app
    spec:
      containers:
      - name: green-app
        image: web:v1
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: "/index.html"
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"

创建Service 代理绿色(第一版)系统:

cat blue-green-svc.yaml

---
apiVersion: v1
kind: Service
metadata:
  name: blue-green-svc
  namespace: blue-green-demo
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30010
    name: http
  selector:
    app: green-app

执行YAML文件:

kubectl apply -f green-demo.yaml 
kubectl apply -f blue-green-svc.yaml

查看创建资源:

kubectl get pod,svc -n blue-green-demo

浏览器访问 IP:30010

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0DHEjbW-1685790124574)(D:\MD归档文档\IMG\image-20230603155422091.png)]

  • 创建蓝色系统(第二版)YAML如下
cat blue-deom.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue-app
  namespace: blue-green-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: blue-app
  template:
    metadata:
      name: blue-app
      labels: 
        app: blue-app
    spec:
      containers:
      - name: blue-app
        image: web:v2
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: "/index.html"
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"

执行YAML资源清单文件:

kubectl apply -f  blue-deom.yaml
  • 进行切换

只需要修改 Service 中选择标签即可。Service修改如下:

cat blue-green-svc.yaml 
---
apiVersion: v1
kind: Service
metadata:
  name: blue-green-svc
  namespace: blue-green-demo
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30010
    name: http
  selector:
    app: blue-app  # 关联蓝色系统Pod标签

执行YAML文件:

kubectl apply -f  blue-green-svc.yaml

浏览器刷新访问页面:

链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6vHwXIlj-1685790124574)(D:\MD归档文档\IMG\image-20230603163353356.png)]

回滚也是一样,只需要修改Service更改代理Pod标签即可了!

五、金丝雀(灰度)部署

2、金丝雀部署介绍

金丝雀部署又称为灰度部署,它允许在生产环境中逐步推出新版本,以确保新版本的稳定性和可靠性。在金丝雀发布中,新版本应用程序只会在一小部分用户中进行测试,如果没有问题,就会逐步扩大范围,直到所有用户都在使用新版本。这种方法可以减少新版本应用程序出现问题的风险,同时也可以确保用户的体验不会受到太大影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J76TQuiy-1685790124574)(D:\MD归档文档\IMG\image-20230603180036402.png)]

  • 优点:灵活、自定义策略,可以根据流量或内容进行金丝雀部署,出现问题不会影响全网用户。

  • 缺点:没有覆盖全网用户,出现问题不好排查。

3、案例:实现金丝雀部署

首先创建Deployment资源,使用web:V1 镜像

cat deploy-demo.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-demo
spec:
  replicas: 5
  selector:
    matchLabels:
      app: web-nginx
  template:
    metadata:
      name: nginx
      labels: 
        app: web-nginx
    spec:
      containers:
      - name: web-nginx
        image: web:v1
        imagePullPolicy: IfNotPresent
        startupProbe:
          tcpSocket:
            port: 80
        livenessProbe:
          httpGet:
            port: 80
            path: "/index.html"
        readinessProbe:
          httpGet:
            port: 80
            path: "/index.html"

---
apiVersion: v1
kind: Service
metadata:
  name: deploy-demo-svc
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30011
    name: http
  selector:
    app: web-nginx

执行YAML文件:

kubectl apply -f deploy-demo.yaml 

版本更新,进行金丝雀发布 版本更新为V2,更新的时候使用 pause 暂停更新

kubectl set image deployment deploy-demo web-nginx=web:v2 && kubectl rollout pause deployment deploy-demo

上面命令语法解释:

# 更新镜像为web:v2
kubectl set image deployment {deploy控制器名称} {容器名称}=web:v2 

浏览器访问:刷新页面会出现不同的页面,因为只更新了一部分

如果经过测试新版本无问题,可以使用 解除暂停,使其所有都更新为web:v2 版本

kubectl rollout resume deployment deploy-demo

五、总结

  • Deployment高级控制器建立在ReplicaSet之上,每次更新镜像版本,都会生成一个新的ReplicaSet,把旧的ReplicaSet替换掉,多个ReplicaSet同时存在,但只运行一个ReplicaSet。

  • Deployment扩缩容:直接修改replicas字段值,重新apply

  • Deployment滚动升级:使用字spec.strategy段定义升级策略,目前支持两种升级策略:

    • rollingUpdate滚动更新:批量替换更新,平滑升级,用户无感知。
    • Recreate重建试更新:把Pod全部删除,在重新创建,风险很大,不建议使用。
  • Deployment版本回滚:使用rollout history 查看历史版本,使用rollout undo .... --to-revision=x指定回滚版本。

  • 蓝绿发布:创建两套系统,利用修改Service关联Pod标签负载到对应系统。

  • 金丝雀发布:只更新一小部分Pod,如果没问题,在进行全部更新,如果有问题不会影响全部用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/605623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网穿透技术

文章目录 前言1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 转载自内…

测试必会 | 通过容器化 Python Web 应用掌握 Docker 容器核心技能

【摘要】 当多个窗口同时 attach 到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其它的窗口也会阻塞。attach 必须是登陆到一个已经运行的容器里,如果从这个容器中 exit 退出的话,会导致容器…

HNU-操作系统OS-实验Lab8

OS_Lab8_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 实验目的 通过完成本次实验,希望能达到以下目标 了解基本的文件系统系统调用的实现方法;了解一个基于索引节点组织方式的Simple FS文件系统的设计与实现;了解文件系统抽…

Ace Admin前端框架笔记一概要与布局介绍

简要 Ace Admin官网 Dashboard - Ace Admin Ace Admin Git GitHub - bopoda/ace: Twitter bootstrap 3 admin template 下载地址:https://download.csdn.net/download/ok060/87843670 Ace是一款轻量且功能丰富的管理模板,干净且易于使用。 当前版本…

计组 第二章错题 2.2 运算方法和运算电路

选D 地址寄存器MAR是存储器部件 访存时暂存访存地址 符号位不变 附加位是符号位的扩展 选B A:检查加减 B:对 因为两个符号位一样 D:需要两个 存储单元把信号同时传给两个单元 用双符号位的方法 同0异1 符号相同 0 正 不同 为1 负 逻辑一样 原…

目标检测第三篇:基于SSD的目标检测算法

文章目录 SSD简介网络搭建卷积块下采样块主干网多层特征提起层输出头 数据处理形成训练TXTDatasetDataLoaderAnchors生成先验框匹配先验框位置 offset 损失函数训练代码及参考 SSD简介 SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提…

软件测试新人害怕不过试用期,教你几招使你安稳度过!!!

对于很多刚步入职场的新人来说,害怕自己试用期过不了,被辞退。别的行业我可能不知道该如何帮大家应对,但在测试行业我希望还是能给大家带俩一点帮助,希望大家能安稳度过试用期,并且成功入行。 保持初心,安稳…

零基础开发小程序第四课-查看功能开发

目录 1 创建页面2 搭建页面3 创建数据4 数据绑定5 页面传参6 预览发布总结 本篇是我们零基础入门课的第四篇,前三篇我们介绍了创建项目、列表功能、新增功能,本篇我们介绍一下查看详情功能的开发。 1 创建页面 打开Zion开发工具,点击已经创建…

Python Struct 库之 pack 和 unpack 详解

1. 官网解析 首先是官网对于 pack 、 unpack 、calcsize以及Format Strings的描述 1.1 pack、unpack、calcsize struct.pack返回一个bytes对象,其中包含根据格式字符串format打包的值v1, v2,…。参数必须与格式所要求的值完全匹配。 struct.unpack根据…

云原生 HTAP -- Cloud-Native Transactions and Analytics in SingleStore

文章目录 背景1 存算分离2. 统一的表存储 (行列混存)2.1 二级索引2.2 行锁 3. 自适应查询引擎3.1 Segment skipping 实现3.2 Filtering 选择 4 性能总结 背景 上篇看了 PolarDB-IMCI 在HTAP的实践,其中提到了其也有借鉴 SingleStore 的实现思…

openresty离线rpm升级至openresty-1.19.9.1版本

注意:此方法步骤仅本人验证通过,要升级的话,需要做备份 1。系统版本是centos7(Linux version 3.10.0-693.el7.x86_64) 2。默认openresty版本是1.15.8.1 3。本次升级到openresty-1.19.9.1 目前系统是没有连接外网,只能进行rpm离…

网络重置后无法上网,以太网和无线网全部丢失,网络适配器出现“56”错误码

文章目录 一、问题描述电脑系统:电脑问题:解决方案 二、问题过程1. IP问题2.网络重置问题3.电脑无法启动问题 三、解决方案1.卸载2.安全模式检查修复3.软件下载1.CCleaner2.驱动精灵万能网卡版 四、参考链接 一、问题描述 电脑系统: Window…

【MySQL高级篇笔记-索引的创建与设计原则 (中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、索引的声明与使用 1、索引的分类 2、创建索引 1. 创建表的时候创建索引 2. 在已经存在的表上创建索引 3、删除索引 二、MySQL8.0索引新特性 1、支持降序索引 2、 隐藏索引 三、索引的设计原则 1、哪些情况适合创建索引…

Android 应用快捷ShortcutManager与ShortcutManagerCompat详解与实战(二)

一、介绍 之前我已通过一篇文章介绍了应用快捷的接入与Demo。如果还未看过上一篇的文章可以先了解入门。 传送门:Android 应用快捷(shortcut)功能的详解(一)_蜗牛、Z的博客-CSDN博客 有创建自然就会有管理,否则一个完美的方案不应该这么被推荐出来。如何…

红黑树的 概念性质 和 详解实现(插入旋转等)

文章目录 概念满足的条件性质实现红黑树的定义红黑树节点插入操作情况一情况二情况三Insert()总代码 其余操作左右单旋RotateL 左单旋RotateR 右单旋prevCheck 红黑树性质检测isBalance 红黑树平衡判断InOrder 中序遍历 完整代码 概念 红黑树,是一种二叉搜索树&…

HNU-操作系统OS-ucoreLab系列-感悟

谨以此片篇,献给熬夜的8个晚上,以及逝去的时光。 感悟: 今天结束了所有的Lab实验(2023.6.3),感慨万千。 喜是这个实验终于结束了,悲是其实有好多地方我都没有理解。 应该指出,由于验收的助教学长学姐们的宽容,HNU实际上在验收这一块的要求还是比较低的。 但是这个…

第三章 Electron 使用Koa以及Koa-Router

一、Koa是什么 👇 👇 👇 据网上的资料显示,Koa 是下一代的 Node.js 的 Web 框架。是express原班人马打造,同样用于构建服务端web application的。旨在提供一个更小型、更富有表现力、更可靠的 Web 应用和 API 的开发基础。扯这些…

在输入URL后,前端浏览器的工作流程

这是一个经久不衰的面试题,整理一下。 浏览器 浏览器是一个多进程的架构。 主进程:主要适用于界面的显示,用户的交互,子进程管理。 渲染进程:将HTML,css,JS转换成页面,V8引擎以及…

redisson 随笔 0-入门

0. 虽说时运不佳,仍欲提桶跑路 分布式锁的常见实现方案 常用锁的用例 runoob Lua教程 对于分布式锁的实现方案,本文如标题所言,简单梳理了redisson的实现方案 redisson 也是基于redis的多个命令组合来实现的,为保证执行多个命…

项目实战:基于Linux的Flappy bird游戏开发

一、项目介绍 项目总结 1.按下空格键小鸟上升,不按小鸟下落 2.搭建小鸟需要穿过的管道 3.管道自动左移和创建 4.小鸟撞到管道游戏结束 知识储备 1.C语言 2.数据结构-链表 3.Ncurses库 4.信号机制 二、Ncurses库介绍 Ncurses是最早的System V Release 4.0 (…