【云原生 | Kubernetes 系列】--Gitops持续交付 ArgoCD自动同步策略

news2024/11/28 4:43:30

1. ArgoCD自动同步策略

自动同步策略允许ArgoCD在检测到GitRepo与实际状态之间存在差异时,自动启动同步操作.

Prune Resource(自动修剪):在集群上某个资源在GitRepo中找不到对应的配置时,自动删除集群上的该资源
Self Heal(自愈): 因各种原因(如手动修改)集群上资源的实时状态而导致与GitRepo不匹配时,自动将实际状态与GitRepo的期望状态同步.

  1. 自动同步仅发生在应用处于OutOfSync状态时,ArgoCD并不会对处于Synced或Error状态的Applicationzhix自动同步
  2. 对于GitRepo上的一次提交,自动同步仅会执行一次,除非同时启用Self-Heal机制.
  3. 启用了自动同步的Application不支持RollBack.

请添加图片描述

2. ArgoCD Sync Options

用于禁用或启用同步过程中的某些特性

  1. ApplyOutOfSyncOnly.仅对于那些OutOfSync状态的资源执行同步操作,可以加速同步过程
  2. PrunePropagationPolicy,资源修剪传播策略,默认使用foreground策略,还能选择background和orphan
  3. PruneLast,在同步操作的最后再执行修剪操作,即使它资源已经部署且转为健康状态后再进行Prue
  4. Replace,对资源的修改,以replace方式进行,而非默认的apply.先删除后创建,apply以补丁方式覆盖更新
  5. FailOnSharedResource,默认的同步操作不会考虑GitRepo中定义的资源是否已经被其他Application所使用.将该选项设置为true,意味着在发现资源已经被其他Application所使用时,则将同步状态设置为fail.当删除或修剪碰到共享资源时,将状态改为false,即不进行修改
  6. RespectIgnoreDifferences,在同步阶段忽略期望状态的字段
  7. CreateNamespace,创建缺失的名称空间
  8. Validation,是否执行资源规范格式的校验,相当于"kubectl apply --validate={true|false}" ,默认为true.

请添加图片描述

3. 通过Cli修改同步方式

将guestbook的同步方式设置为自动

# argocd app get guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://argocd.intra.com/applications/guestbook
Repo:               http://192.168.31.199/root/argocd-example-apps.git
Target:             
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        <none>		# 此处sync是none状态
Sync Status:        Synced to  (58982ea)
Health Status:      Healthy

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH   HOOK  MESSAGE
       Service     default    guestbook-ui  Synced  Healthy        service/guestbook-ui created
apps   Deployment  default    guestbook-ui  Synced  Healthy        deployment.apps/guestbook-ui created
# argocd app set guestbook --sync-policy aut

通过命令行可以看到此时guestbook的同步方式已经变更为了自动

# argocd app get guestbook
Name:               argocd/guestbook
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://argocd.intra.com/applications/guestbook
Repo:               http://192.168.31.199/root/argocd-example-apps.git
Target:             
Path:               guestbook
SyncWindow:         Sync Allowed
Sync Policy:        Automated
Sync Status:        Synced to  (58982ea)
Health Status:      Healthy

GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH   HOOK  MESSAGE
       Service     default    guestbook-ui  Synced  Healthy        service/guestbook-ui created
apps   Deployment  default    guestbook-ui  Synced  Healthy        deployment.apps/guestbook-ui created

自动修剪

argocd app set guestbook --auto-prune

自动修复

argocd app set guestbook --self-heal

禁止修剪特定的资源

metadata:
  annotations:
    argocd.argoproj.io/sync-options:Prunc=false

禁用kubectl验证

metadata:
  annotations:
    argocd.argoproj.io/sync-options:Validate=false

有选择的同步

argocd app set guestbook --sync-option ApplyOutOfSyncOnly=true

资源修剪传播策略

argocd app set guestbook --sync-option PrunePropagationPolicy={foreground|background|orphan}

是否同步完成后再进行修剪

argocd app set guestbook --sync-option PruneLast=true

是否replace资源而非执行apply

argocd app set guestbook --sync-option Replace={true|false}

若存在共享资源,是否将同步置为Fail

argocd app set guestbook --sync-option FailOnSharedResource={true|false}

是否忽略差异

argocd app set guestbook --sync-option RespectIgnoreDifferences={true|false}

是否自动创建命名空间

argocd app set guestbook --sync-option CreateNamespace={true|false}

4. ArgoCD CLI回滚

查看项目的历史版本

# argocd app  history argocd/spring-boot-helloworld 
ID  DATE                           REVISION
0   2022-11-18 16:22:17 +0800 CST  HEAD (d3f19ac)
1   2022-11-18 16:35:43 +0800 CST  HEAD (bbf73a3)
2   2022-11-18 16:45:39 +0800 CST  HEAD (b82bb4a)

回滚前需要先将sync-policy的自动关闭

# argocd app set  argocd/spring-boot-helloworld   --sync-policy none
# argocd app rollback argocd/spring-boot-helloworld --prune 1
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME      STATUS   HEALTH        HOOK  MESSAGE
2022-11-21T12:20:49+08:00          Namespace                        helloworld      Synced                       
2022-11-21T12:20:49+08:00            Service  helloworld  spring-boot-helloworld    Synced  Healthy              
2022-11-21T12:20:49+08:00   apps  Deployment  helloworld  spring-boot-helloworld    Synced  Healthy              
2022-11-21T12:20:51+08:00          Namespace                        helloworld      Synced                       namespace/helloworld unchanged
2022-11-21T12:20:51+08:00            Service  helloworld  spring-boot-helloworld    Synced  Healthy              service/spring-boot-helloworld unchanged
2022-11-21T12:20:51+08:00   apps  Deployment  helloworld  spring-boot-helloworld    Synced  Healthy              deployment.apps/spring-boot-helloworld configured
2022-11-21T12:20:51+08:00   apps  Deployment  helloworld  spring-boot-helloworld  OutOfSync  Progressing              deployment.apps/spring-boot-helloworld configured

Name:               argocd/spring-boot-helloworld
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          
URL:                https://argocd.intra.com/applications/argocd/spring-boot-helloworld
Repo:               http://192.168.31.199/root/spring-boot-helloworld-deployment.git
Target:             HEAD
Path:               kubernetes
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from HEAD (b82bb4a)
Health Status:      Progressing

Operation:          Sync
Sync Revision:      bbf73a31cb13c11dc9d82717119bc03df7aac040
Phase:              Succeeded
Start:              2022-11-21 12:20:48 +0800 CST
Finished:           2022-11-21 12:20:51 +0800 CST
Duration:           3s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE   NAME                    STATUS     HEALTH       HOOK  MESSAGE
       Namespace               helloworld              Synced                        namespace/helloworld unchanged
       Service     helloworld  spring-boot-helloworld  Synced     Healthy            service/spring-boot-helloworld unchanged
apps   Deployment  helloworld  spring-boot-helloworld  OutOfSync  Progressing        deployment.apps/spring-boot-helloworld configured

此时同步状态就会显示OutOfSync

请添加图片描述

再将自动同步打开,此时又会被同步到最新状态

# argocd app set  argocd/spring-boot-helloworld   --sync-policy auto

请添加图片描述

5. ArgoCD上添加Application

argocd app create guestbook --repo http://192.168.31.199/root/spring-boot-helloWorld.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

参数含义

参数含义
–repoGit仓库Url
–pathGit Repository中含有配置文件的子目录路径
–directory-recurse对目录进行递归
–revision string要使用revision通常是指源码branch,tag,commit和Helm chart版本
-f,–file string部署Application用到的配置文件路径或URL
–release-name string配置为Helm Charts时,为其指定release的名称
–project string隶属于Project,默认为default
–dest-server string目标K8s集群的API Server URL
–dest-namespace目标名称空间

6. 将Repository添加到ArgoCD

一般私有仓库需要进行添加,公有仓库一般不需要添加

请添加图片描述

请添加图片描述

命令行添加

argocd repo add --password 

管理GitRepo常用参数

参数含义
–name当前Repo的名称
–ssh-private-key-path用于访问GitRepo的SSH私钥文件路径
–insecure-ignore-host-key不校验host key
–insecure-skip-server-verification不校验host key和server cerificate
–username string用户名
–password string密码
–project stringRepo所属的Project
–type stringRepo的类型

管理Cluster

argocd cluster add context-intra --kubeconfig=.kube/config
参数含义
–nameCluster的名称
–in-clusterArgoCD自身运行在Kubernetes集群,访问地址为https://kubernetes.default.svc
–kubeconfig string使用指定的kubeconfig文件
–namespace stringArray
–project string所属的Project
–service-account string使用的ServiceAccount

7. 创建一个application

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: spring-boot-helloworld
  namespace: argocd
spec:
  project: default
  source:
    repoURL: http://192.168.31.199/root/spring-boot-helloworld-deployment.git 
    targetRevision: HEAD
    path: kubernetes
  destination:
    server: https://kubernetes.default.svc
    namespace: helloworld
  syncPolicy:
    automated: 
      prune: true # 是否修剪
      selfHeal: true  #是否自愈
      allowEmpty: false # 是否允许空资源
    syncOptions:
    - Validate=false  # 是否校验
    - CreateNamespace=true  # 是否自动创建命名空间
    - PrunePropagationPolicy=foreground
    - PruneLast=true # 增改后是否做Prun操作
    retry:  # 重试策略
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

删除原有app,然后新增spring-boot-helloworld app

# argocd app list
NAME                           CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                              PATH        TARGET
argocd/guestbook               https://kubernetes.default.svc  default    default  Synced  Healthy  Auto        <none>      http://192.168.31.199/root/argocd-example-apps.git                guestbook   
argocd/spring-boot-helloworld  https://kubernetes.default.svc             default  Synced  Healthy  Auto        <none>      http://192.168.31.199/root/spring-boot-helloworld-deployment.git  kubernetes  HEAD

# argocd app delete argocd/spring-boot-helloworld
Are you sure you want to delete 'argocd/spring-boot-helloworld' and all its resources? [y/n] y
application 'argocd/spring-boot-helloworld' deleted
# argocd app list
NAME              CLUSTER                         NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                                PATH       TARGET
argocd/guestbook  https://kubernetes.default.svc  default    default  Synced  Healthy  Auto        <none>      http://192.168.31.199/root/argocd-example-apps.git  guestbook  
# kubectl apply -f 01-application-helloworld.yaml 
application.argoproj.io/spring-boot-helloworld created

请添加图片描述

请添加图片描述

8. 基于Project CRD创建项目

Project负责为Application提供逻辑分组.主要功能如下:

  1. 限制可以部署的内容(指定受信任的Git Source仓库)通过黑,白名单实现.
  2. 限制Application可以部署到的目标位置(指定目标Cluster和Namespace)
  3. 限制能够及不能够部署的对象类型
  4. 定义Project Role,从而为Application提供RBAC机制,以绑定到OIDC组成JWT Token

ArgoCD的默认项目

​ default Project由ArgoCD自动部署,它允许用户按需修改,但不能被删除

白名单方式

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: default
  namespace: argocd
spec:
  clusterResourceWhitelist:
  - group: "*"
    kind: "*"
  destinations:
  - namespace: "*"
    server: "*"
  sourceRepos:
  - "*"

黑名单

spec:
  clusterResourceBlacklist:

9. ApplicationSet

ApplicationSet CRD用于定义可自动生成Application的模板,从而能够在monorepo(单个Repo中定义了多个ArgoCD Application)或多个Repo,以及跨大量Cluster的场景中自动化管理ArgoCD Application

ApplicationSet CRD需要同其专用的ApplicationSet控制器支撑实现

ApplicationSet可以提供

  1. 目标Cluster的模板化,从而能够在单个资源配置文件中适配部署到多个kubernetes集群
  2. 源Git配置仓库的模板化
  3. 较好地支持monorepo

ApplicationSet控制器负责生成Application,ApplicationSet控制器生成或更新Application资源
生成或更新Application资源是有Application控制器确保期望状态和实际状态的一致
ApplicationSet控制器仅负责确保ApplicationSet资源的期望状态与实际状态的一致

请添加图片描述

AS CRD资源定义–>AS控制器–>Apps CRD —> Application Controller -->目标集群上创建

9.2 ApplicationSet CRD资源规范

在ApplicationSet CRD的spec下可以定义以下三个字段

  1. generators

​ 定义负责生成参数的生成器,这些参数会被用于template字段中定义的模板
​ 生成器的关键作用在于,他们是模板参数的数据源
​ ApplicationSet支持多种不同类型的generator

  1. syncPolicy

​ 资源同步策略,仅支持一个布尔类型字段preserverResourcesOnDeletion

  1. template

​ Application资源模板,配置格式与Application规范相同,但它包含有一些参数化的配置
​ 通过将这些参数替换为generators生成的值,完成模板的实例化

9.3 ApplicationSet多环境适配

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: helloworld
  namespace: argocd
spec:
  generators:
  - list:
      elements:
      - environment: dev
      - environment: staging
      - environment: prod
  template:
    metadata:
      name: '{{environment}}-guestbook'
    spec:
      project: default
      source:
        repoURL: http://192.168.31.199/root/spring-boot-helloworld-deployment.git
        targetRevision: HEAD
        path: helloworld/{{environment}}
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{environment}}'
      syncPolicy:
        automated: 
          prune: true
          selfHeal: true
          allowEmpty: false
        syncOptions:
        - Validate=false
        - CreateNamespace=true
        - PrunePropagationPolicy=foreground
        - PruneLast=true
        retry:
          limit: 5
          backoff:
            duration: 5s
            factor: 2
            maxDuration: 3m
  syncPolicy:
    preserveResourcesOnDeletion: false  # 是否在资源删除是保留

部署

# kubectl apply -f 02-applicationset-demo.yaml 
applicationset.argoproj.io/helloworld created

此时分别在3个命名空间完成创建

# kubectl get pods -n dev
NAME                                      READY   STATUS    RESTARTS   AGE
spring-boot-helloworld-78596987bc-pqtbv   1/1     Running   0          29s
# kubectl get pods -n prod
NAME                                     READY   STATUS    RESTARTS   AGE
spring-boot-helloworld-9fbc44457-5g8tt   1/1     Running   0          34s
spring-boot-helloworld-9fbc44457-jxcm2   1/1     Running   0          34s
spring-boot-helloworld-9fbc44457-s6jpj   1/1     Running   0          34s
# kubectl get pods -n staging
NAME                                     READY   STATUS    RESTARTS   AGE
spring-boot-helloworld-9fbc44457-pp74b   1/1     Running   0          39s
# argocd appset list
NAME        NAMESPACE  PROJECT  SYNCPOLICY                                                     CONDITIONS                                                                                                                                                                                                                                     REPO                                                              PATH                        TARGET
helloworld  argocd     default  &ApplicationSetSyncPolicy{PreserveResourcesOnDeletion:false,}  [{ParametersGenerated Successfully generated parameters for all Applications 2022-11-22 11:40:34 +0800 CST True ParametersGenerated} {ResourcesUpToDate ApplicationSet up to date 2022-11-22 11:40:34 +0800 CST True ApplicationSetUpToDate}]  http://192.168.31.199/root/spring-boot-helloworld-deployment.git  helloworld/{{environment}}  HEAD

请添加图片描述

决定不同版本具体区别的是在git仓库helloworld/prod,helloworld/dev,helloworld/staging/下的配置

# cat prod/02-deployment.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: spring-boot-helloworld
  labels:
    app: spring-boot-helloworld
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-boot-helloworld
  template:
    metadata:
      name: spring-boot-helloworld
      labels:
        app: spring-boot-helloworld
    spec:
      containers:
      - name: spring-boot-helloworld
        image: ikubernetes/spring-boot-helloworld:v0.8.0
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          requests:
            cpu: 50m
            memory: 32Mi
# cat staging/02-deployment.yaml 
kind: Deployment
apiVersion: apps/v1
metadata:
  name: spring-boot-helloworld
  labels:
    app: spring-boot-helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-boot-helloworld
  template:
    metadata:
      name: spring-boot-helloworld
      labels:
        app: spring-boot-helloworld
    spec:
      containers:
      - name: spring-boot-helloworld
        image: ikubernetes/spring-boot-helloworld:v0.8.0
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
        resources:
          requests:
            cpu: 50m
            memory: 32Mi

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

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

相关文章

艾美捷nickases-Cas9内切酶裂解试验展示

核酸内切酶&#xff08;endonuclease&#xff09;在核酸水解酶中&#xff0c;为可水解分子链内部磷酸二酯键生成寡核苷酸的酶&#xff0c;与核酸外切酶相对应。从对底物的特异性来看&#xff0c;可分为DNaseⅠ、DNaseⅡ等分解DNA的酶&#xff1b;RNase、RNaseT1等分解RNA的酶。…

ETF轮动+RSRS择时,加上卡曼滤波:年化48.41%,夏普比1.89

原创文章第112篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 昨天我们设计了一个不错的策略&#xff1a;etf动量轮动大盘择时&#xff1a;年化30%的策略。ETF动量轮动RSRS择时&#xff0c;动量其实一直都有效&#xff0c;如何定义动量可…

java图形验证码到底是怎么生成的?

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 java图形验证码到底是怎么生成的&#xff1f;支持中文、gif、算术等类型 二、实现功能 支持gradle方式的引入 支持maven方式引入 支持jar包下载 支持10种漂亮的内置字体&#xff0c;不依赖系统字体 支持输出…

Codeforces Round #835 (Div. 4) A~G

比赛链接&#xff1a;https://codeforces.com/contest/1760 A. Medium Number 题目大意&#xff1a; t组测试&#xff0c;每组给三个数求中位数。 代码&#xff1a; #include<bits/stdc.h> #define rep(i,a,b) for (register int ia;i<b;i) #define per(i,a,b) …

无人驾驶(二)---室外导航之RTK配置与接入及GPS与UTM坐标转换

1. RTK 概述 RTK 载波相位差分技术&#xff0c;是实时处理两个测量站载波相位观测量的差分方法&#xff0c;将基准站采集的载波相位发给用户接收机&#xff0c;进行求差解算坐标。一般包含流动站 (移动站) 和基准站 (基站) 。本文中RTK定位采用千寻定位&#xff0c; 参考的也是…

39Java System类

目录 System类 1.定义 2.预备知识 3.常用方法 (1).currentTimeMillis返回系统时间 (2).exit终止虚拟机 (3).arraycopy拷贝数组 System类 1.定义 Java System类是一个提供与系统相关的方法 System类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Sy…

外汇天眼:FCA 已向交易应用程序运营商发出警告,要求其停止交易游戏化

英国市场监管机构希望交易应用程序开发商重新考虑关键设计元素。 根据新的研究&#xff0c;游戏化可能会导致类似赌博的行为。 负责监管英国金融市场的金融行为监管局 ( FCA )周一发布了有关交易应用程序设计的市场警告。金融业监管机构担心零售交易越来越像一场游戏&#xff…

A. Row GCD(更相减损术+gcd的性质)

Problem - 1458A - Codeforces 给你两个正整数序列a1,...,an和b1,...,bm。对于每个j1,...,m&#xff0c;求a1bj,...,anbj的最大公除数。 输入 第一行包含两个整数n和m&#xff08;1≤n&#xff0c;m≤2⋅105&#xff09;。 第二行包含n个整数a1,...,an&#xff08;1≤ai≤101…

Linux学习记录——이 基本指令(2)

接着上一篇继续写指令。 man指令 man指令是一个手册功能的指令&#xff0c;可以查看系统内的接口&#xff0c;指令等等&#xff0c;也可以查看一个指令有什么用法。如果是需要查看C语言中的指令&#xff0c;比如printf&#xff0c;就可以man 3 printf。不过man大多数情况是用…

旋转数组的最小数字、二维数组中的查找、调整数组顺序使奇数位于偶数前面

文章目录1、 旋转数组的最小数字2、调整数组顺序使奇数位于偶数前面3、二维数组中的查找1、 旋转数组的最小数字 本题考点&#xff1a;核心考点&#xff1a;数组理解&#xff0c;二分查找&#xff0c;临界条件 牛客链接 题目描述&#xff1a; 有一个长度为 n 的非降序数组&am…

简述Spring Bean生命周期

前言 在Spring容器里&#xff0c;Bean的完整生命周期比较长。但是我们必须要掌握它。 Bean周期总览 Bean周期总体如下所示。 接下来会简单讲下各个步骤的主要功能。 Bean实例化 必须步骤。 此步骤主要是实例化一个Bean&#xff0c;例如new一个对象。这个步骤主要是设置be…

运动无线耳机什么牌子好?六款实用性不错的运动耳机推荐

跑步的过程如果没有音乐真的很难继续跑下去&#xff0c;当然&#xff0c;有了音乐的加入&#xff0c;运动过程也变得更加有动力&#xff0c;烦恼的心情也会随着烟消云散。一款好的运动耳机能让我们运动变得更加轻松&#xff0c;什么运动耳机值得大家入手&#xff1f;今天我就来…

计算机毕业设计java+ssm舞蹈管理系统(源码+系统+mysql数据库+Lw文档)

项目介绍 舞蹈管理系统是使用JAVA的SSM技术&#xff0c;MySQL作为数据库开发&#xff0c;用户通过查看舞蹈信息&#xff0c;在线预约课程&#xff0c;实现舞蹈管理。首先对本论文进行分析后&#xff0c;提出平台的相关技术&#xff0c;然后整理系统的需求分析&#xff0c;根据…

_c++11( lambda)

lambda表达式1 C98中的一个例子2 lambda表达式3 lambda表达式语法4 函数对象与lambda表达式1 C98中的一个例子 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。 #include <algorithm> #include <functional> voi…

[附源码]计算机毕业设计JAVA教师业绩考核系统

[附源码]计算机毕业设计JAVA教师业绩考核系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

Sharding-JDBC 基础

Sharding-JDBC 是当当网开源的适用于微服务的分布式数据访问基础类库&#xff0c;完整的实现了分库分表&#xff0c;读写分离和分布式主键功能&#xff0c;并初步实现了柔性事务。 从 2016 年开源至今&#xff0c;在经历了整体架构的数次精炼以及稳定性打磨后&#xff0c;如今…

AQS源码解析 3.lock() unlock() 加锁解锁过程

AQS源码解析 3.lock() & unlock() 加锁解锁过程 Lock() 过程 这里使用 ReentrantLock 的公平锁去看 AQS 的加锁过程。在 ReentrantLock 的实现中&#xff0c;其默认构造的锁是非公平锁。 详细流程图 尝试获取锁 构造节点入队过程 在队列中被挂起 被唤醒重新抢锁的过…

说一下 ArrayList 和 LinkedList 的区别?

本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 提问。 前言 大家好&#xff0c;我是小彭。 在上一篇文章里&#xff0c;我们聊到了基于动态数组 ArrayList 线性表&#xff0c;今天我们来讨论一个基于链表的线性表 —— LinkedList…

JavaScript构造函数和原型:ES5 中的新增方法

ES5 新增方法概述 ES5 中给我们新增了一些方法&#xff0c;可以很方便的操作数组或者字符串&#xff0c;这些方法主要包括&#xff1a; 数组方法 字符串方法 对象方法 数组方法 迭代(遍历)方法&#xff1a;forEach()、map()、filter()、some()、every()&#xff1b; arr…

AVL右旋转思路分析与图解

AVL树右旋转思路分析与图解 其实我们前面讲过了左旋转之后再学习右旋转就会非常的简单了, 因为我们的右旋转相对我们的左旋转只是换了一个方向而已, 那么下面我们就来讲解右旋转的实现 对于数列{10, 12, 8, 9 ,7, 6} , 当我们插入6的时候leftHeight() - rightHeight() > 1…