一文详解docker swarm

news2024/11/27 20:30:13

文章目录

  • 1、简介
    • 1.1、涉及到哪些概念?
    • 1.2、需要注意什么?
  • 2、集群管理
    • 2.1、创建集群
    • 2.2、将节点加入集群
    • 2.3、查看集群状态。
    • 2.4、将节点从集群中移除
    • 2.5、更新集群
    • 2.6、锁定/解锁集群
  • 3、节点管理
  • 4、服务部署
    • 4.1、准备
    • 4.2、服务管理
      • 4.2.1、常用命令
      • 4.2.2、在集群上部署应用
      • 4.2.3、在集群上部署一个带更新策略和回滚策略的应用
      • 4.2.4、更新服务
      • 4.2.5、回滚服务
  • 5、结合docker-compose.yml部署
    • 5.1、部署应用
    • 5.2、语法说明

1、简介

Docker Swarm 是Docker官方的跨节点的容器编排工具。用户只需要在单一的管理节点上操作,即可管理集群下的所有节点和容器。

主要解决问题:

  1. 解决docker server的集群化管理和部署。
  2. Swarm通过对Docker宿主机上添加的标签信息来将宿主机资源进行细粒度分区,通过分区来帮助用户将容器部署到目标宿主机上,同样通过分区方式还能提供更多的资源调度策略扩展。

单对单的Docker宿主机使用方式:
在这里插入图片描述
单对多的Docker宿主机使用方式:
在这里插入图片描述
swarm能做什么:

  1. 管理节点高可用,原生支持管理节点高可用,采用raft共识算法来支撑管理节点高可用。
  2. 应用程序高可用,支持服务伸缩,滚动更新和应用回滚等部署策略。

1.1、涉及到哪些概念?

(1)docker的两种模式,单引擎模式和swarm集群模式。

  • 单引擎模式,docker server没有加入任何集群,且自身也没有加入初始化为swarm 节点,简单的说就是我们平时所操作的孤立的docker server。
  • swarm模式,当docker server 加入到任意swarm集群,或者通过docker swarm init初始化swarm集群时,docker server会自动切换到swarm 集群模式。

(2)swarm集群中节点分类,分为:manager(管理节点)、node(工作节点)

  • manager:是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求以及调度Node进行具体工作。manager 本身也是一个node节点。
  • Node:接受manager调度,对容器进行创建、扩容和销毁等具体操作。

(3)raft共识算法,是实现分布式共识的一种算法,主要用来管理日志复制的一致性。

  • 当Docker引擎在swarm模式下运行时,manager节点实现Raft一致性算法来管理全局集群状态。
  • Docker swarm模式之所以使用一致性算法,是为了确保集群中负责管理和调度任务的所有manager节点都存储相同的一致状态。
  • 在整个集群中具有相同的一致状态意味着,如果出现故障,任何管理器节点都可以拾取任务并将服务恢复到稳定状态。例如,如果负责在集群中调度任务的领导管理器意外死亡,则任何其他管理器都可以选择调度任务并重新平衡任务以匹配所需状态。
  • 使用一致性算法在分布式系统中复制日志的系统需要特别小心。它们通过要求大多数节点在值上达成一致,确保集群状态在出现故障时保持一致。
  • Raft最多可承受(N-1)/2次故障,需要(N/2)+1名成员的多数或法定人数才能就向集群提议的值达成一致。这意味着,在运行Raft的5个管理器集群中,如果3个节点不可用,系统将无法处理更多的请求来安排其他任务。现有任务保持运行,但如果管理器集不正常,调度程序无法重新平衡任务以应对故障。

(4)Swarm管理节点高可用。

  • Swarm管理节点内置有对HA的支持,即使有一个或多个节点发送故障,剩余管理节点也会继续保证Swarm运转。
  • Swarm实现了一种主从方式的多管理节点的HA,即使有多个管理节点也只有一个节点出于活动状态,处于活动状态的节点被称为主节点(leader),而主节点也是唯一一个会对Swarm发送控制命令的节点,如果一个备用管理节点接收到了Swarm命令,则它会将其转发给主节点。

(5)集群管理,集群创建和组织。
(6)节点管理,集群下节点角色信息变更,节点任务情况监控。
(7)服务管理,集群服务部署,服务管理等。

1.2、需要注意什么?

manager节点容错。
manager数量最好设置为奇数个,可以减少脑裂(Split-Brain)出现情况。在网络被划分成2个部分情况下,奇数个manager节点能够较高程度的保证有投票结果的可能性。

不要部署太多的manager节点(通常3到5个)。对于所有共识算法来说,更多的参与节点意味着需要花费更多的时间来达成共识,所以最好部署5个或三个节点。

Raft最多可承受(N-1)/2次故障,需要(N/2)+1名成员的多数或法定人数才能就向集群提议的值达成一致。
在这里插入图片描述

2、集群管理

2.1、创建集群

  1. 不包含在任何Swarm中的Docker节点,该Docker节点被称为运行于单引擎(Single-Engine)模式,一旦加入Swarm集群,则切换为Swarm模式。
  2. docker swarm init 会通知Docker来初始化一个新的Swarm,并且将自身设置为第一个管理节点。同时也会使该节点开启Swarm模式。
  3. –advertise-addr IP:2377 指定其他节点用来连接到当前管理节点的IP和端口,这一指令是可选的,当节点有多个IP时,可以指定其中一个。
  4. –listen-addr 指定用于承载Swarm流量的IP和端口,其设置通常与–advertise-addr相匹配,但是当节点上有多个IP的时候,可用于指定具体某个IP。
  5. –autolock 启用管理器自动锁定(需要解锁密钥才能启动已停止的管理器)。
  6. –force-new-cluster 强制从当前状态创建新群集。
docker swarm init

2.2、将节点加入集群

(1)生成join-token。

# 生成work节点 join-token
docker swarm join-token worker
# 生成manager节点 join-token
docker swarm join-token manager

示例:

fly@fly:~/wokspace$ docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4zxv2c1ntyjoum1m3x8u6juej6kciexc05f30j9vsvr0hoieg4-19o9myylkb7bg1fb1jqcr1xcf 192.168.11.72:2377

(2)加入集群。

# 此命令为 join-token 命令执行结果,在相应的节点执行该结果即可加入到集群
docker swarm join --token SWMTKN-1-4zxv2c1ntyjoum1m3x8u6juej6kciexc05f30j9vsvr0hoieg4-19o9myylkb7bg1fb1jqcr1xcf 192.168.11.72:2377

2.3、查看集群状态。

docker info

在这里插入图片描述

2.4、将节点从集群中移除

(1)将节点从集群中移除 (只能移除worker节点)。

docker swarm leave

(2)将节点从集群中强制移除(包括manager节点)。

docker swarm leave -f

2.5、更新集群

更新集群的部分参数

docker swarm update --autolock=false

2.6、锁定/解锁集群

  • 重启一个旧的管理节点或者进行备份恢复可能对集群造成影响,一个旧的管理节点重新接入Swarm会自动解密并获得Raft数据库中长时间序列的访问权,这会带来安全隐患。进行备份恢复可能会抹掉最新的Swarm配置。
  • 为了规避上述问题,Docker提供自动锁机制来锁定Swarm,这会强制要求重启的管理节点在提供一个集群解锁码之后才有权重新接入集群(也可以防止原来的主节点宕机后重新接入集群,和当前主节点一起成为双主,双主也是一种脑裂问题)。

(1)设置为自动锁定集群。

# 设置为自动锁定集群
docker swarm update --autolock=true

(2)当集群设置为 --autolock后,可以通过该命令查询解锁集群的秘钥。

# 当集群设置为 --autolock后,可以通过该命令查询解锁集群的秘钥
# 该节点必须为集群有效的管理节点
docker swarm unlock-key

(3)重启管理节点,集群将被自动锁定。

# 重启管理节点,集群将被自动锁定
service docker restart

(4)重启后的管理节点必须提供解锁码后才能重新接入集群。

# 重启后的管理节点必须提供解锁码后才能重新接入集群
docker swarm unlock

3、节点管理

# 查看参数帮助
docker node -h
# 命令说明:
# 降级节点
demote Demote one or more nodes from manager in the swarm
# 查看节点详情
inspect Display detailed information on one or more nodes
# 查看所有节点
ls List nodes in the swarm
# 升级节点
promote Promote one or more nodes to manager in the swarm
# 查看节点上运行的任务,默认当前节点
ps List tasks running on one or more nodes, defaults to current node
# 删除节点
rm Remove one or more nodes from the swarm
# 更新节点
update Update a node
  • demote:降级节点。
  • inspect:查看节点详情。
  • ls:查看所有节点。
  • promote:升级节点。
  • ps:查看节点上运行的任务,默认当前节点。
  • rm:删除节点。
  • update:更新节点。

(1) 查看集群节点列表。

fly@fly:~/wokspace$ docker node ls

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
re12imh3gr7d1dudrw1gkm9f7 *   fly        Ready     Active         Leader           20.10.12

(2)升级或降级节点。

# 降级一个或多个节点
docker node demote <NODE>
# 通过修改单个节点的role属性,来降级节点
docker node update --role worker <NODE>
# 升级一个或多个节点
docker node promote <NODE>
# 通过修改单个节点的role属性,来升级节点
docker node update --role manager <NODE>

(3)更改节点状态。

# 更改节点状态
docker node update --availability active|pause|drain <NODE>
# active: 正常
# pause:挂起
# drain:排除
  1. 正常节点,可正常部署应用。
  2. 挂起节点,已经部署的应用不会发生变化,新应用将不会部署到该节点。
  3. 排除节点,已经部署在该节点的应用会被调度到其他节点。

(4)删除节点。

# 只能删除已关闭服务的工作节点
docker node rm <node>
# 只能强制删除工作节点
docker node rm -f <node>

注意:管理节点的删除只能先将管理节点降级为工作节点,再执行删除动作。

# 停止docker server
sudo service docker stop

4、服务部署

4.1、准备

(1)拉取代码,获取tag。

# 拉取代码
git clone https://gitee.com/long-xu/helloworld.git
# 进入代码目录
cd helloworld
# fetch
git fetch origin

(2)镜像制作。

# 切换到1.0.0 tag
git checkout 1.0.0
# 构建1.0.0镜像
docker build -f Dockerfile -t hello:1.0.0 .
# 切换到1.0.1 tag
git checkout 1.0.1
# 构建1.0.1镜像
docker build -f Dockerfile -t hello:1.0.1 .

(3)将镜像推送到仓库(这里使用公共仓库作为演示)。

# 登录注册中心
docker login

(4)为镜像重新打tag(格式:用户名/仓库名:tag)。

docker tag hello:1.0.0 long-xu/hello:1.0.0
docker push long-xu/hello:1.0.0
docker tag hello:1.0.1 long-xu/hello:1.0.1
docker push long-xu/hello:1.0.1

(5) 登录https://hub.docker.com/ 查看镜像情况。
在这里插入图片描述

4.2、服务管理

docker service -h

4.2.1、常用命令

# 创建一个服务
create 		Create a new service
# 查看服务详细信息
inspect 	Display detailed information on one or more services
# 查看服务日志
logs 		Fetch the logs of a service or task
# 列出所有服务
ls 			List services
# 列出一个或多个服务的任务列表
ps 			List the tasks of one or more services
# 删除一个或多个服务
rm 			Remove one or more services
# 回滚
rollback 	Revert changes to a service's configuration
# 弹性伸缩一个或多个服务
scale 		Scale one or multiple replicated services
# 更新服务
update 		Update a service

4.2.2、在集群上部署应用

(1)部署一个副本数量。

docker service create --name myhello --publish published=81,target=80 --replicas 3 long-xu/hello:1.0.0
# 若是采用私有注册中心请加上 --with-registry-auth 选项

(2)查看服务下的任务(容器)。

docker service ps myhello

(3) 查看节点下的任务(容器)

docker node ps <NODE>

(4)访问集群中任意节点(包括没有运行任务的节点)对应的端口号均能访问到应用程序,swarm为集群实现了负载均衡

curl http://localhost:81/ping

(5)查看service详细信息。

docker service inspect myhello

(6)查看service日志。

docker service logs myhello

(7)伸缩服务。

docker service scale myhello=5

(8) 修改节点状态,查看任务部署情况。

docker node update --availability active|pause|drain <NODE>

4.2.3、在集群上部署一个带更新策略和回滚策略的应用

(1)部署应用。

docker service create \
--name myhello1 \
--publish published=82,target=80 \
--replicas 20 \
--update-delay 5s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-parallelism 2 \
--rollback-monitor 10s \
--rollback-max-failure-ratio 0.2 \
long-xu/hello:1.0.0
# 若是采用私有注册中心请加上 --with-registry-auth 选项
#--update-delay 5s :每个容器依次更新,间隔5s
# --update-parallelism 2 : 每次允许两个服务一起更新
#--update-failure-action continue : 更新失败后的动作是继续
# --rollback-parallelism 2 : 回滚时允许两个一起
# --rollback-monitor 10s :回滚监控时间10s
# --rollback-max-failure-ratio 0.2 : 回滚失败率20%

(2) 检查部署后的应用设置项是否都有被成功设置。

# 查看并打印友好的详细信息
docker service inspect --pretty myhello1

注意:查看详细信息时,详细信息中时间单位为ns(纳秒)。友好格式下,时间单位为(s)。

(3)更新未设置成功的项。

docker service update --update-delay 5s --rollback-monitor 10s myhello1

(4)访问服务。

curl http://localhost:82/ping
curl http://localhost:82/ping/v1.0.1

4.2.4、更新服务

(1)启动更新。

docker service update --image long-xu/hello:1.0.1 myhello1
# 若是采用私有注册中心请加上 --with-registry-auth 选项

在这里插入图片描述
(2)访问服务。

curl http://localhost:82/ping
curl http://localhost:82/ping/v1.0.1

4.2.5、回滚服务

(1)启动回滚(策略是失败后回滚,目前没有失败的情况,我们手动回滚)。

docker service update --rollback myhello1

在这里插入图片描述

5、结合docker-compose.yml部署

5.1、部署应用

(1)常用命令:

# 部署或更新 stack
deploy 		Deploy a new stack or update an existing stack
# 查看 stack 列表
ls 			List stacks
# 查看 stack 的任务列表
ps 			List the tasks in the stack
# 删除 stack
rm 			Remove one or more stacks
# 查看stack 中的服务列表
services 	List the services in the stack

(2)docker-compose.yml 文件。

version: "3.7"
  services:
    myhello2:
      image: long-xu/hello:1.0.0
      ports:
	    - "83:80"
	  depends_on:
	    - redis
	  deploy:
	    mode: replicated
	    replicas: 20
	    endpoint_mode: vip
	    rollback_config:
		  parallelism: 2
		  delay: 10s
		  monitor: 10s
		  max_failure_ratio: 0.2
	    update_config:
		  parallelism: 2
		  delay: 5s
		  failure_action: continue
	redis:
	  image: redis:alpine
	  deploy:
		mode: replicated
		replicas: 6
		endpoint_mode: dnsrr
		labels:
		  description: "This redis service label"
		resources:
		  limits:
			cpus: '0.50'
			memory: 50M
		  reservations:
			cpus: '0.25'
			memory: 20M
	  restart_policy:
		condition: on-failure
		delay: 5s
		max_attempts: 3
		window: 120s

(3)部署stack。

docker stack deploy -c docker-compose.yml mystack

(4)查看服务详情。

# 查看并打印友好的详细信息
docker service inspect --pretty mystack_myhello2
docker service inspect --pretty mystack_redis

5.2、语法说明

注意:仅支持 V3.4 及更高版本。

(1)endpoint_mode:访问集群服务的方式。

endpoint_mode: vip
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。

(2)labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的labels。

(3)mode:指定服务提供的模式。

  • replicated:复制服务,复制指定服务到集群的机器上。
  • global:全局服务,服务将部署至集群的每个节点。
  • replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。

(4)resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

(5)restart_policy:配置如何在退出容器时重新启动容器。

  • condition:可选 none,on-failure 或者 any(默认值:any)。
  • delay:设置多久之后重启(默认值:0)。
  • max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
  • window:设置容器重启超时时间(默认值:0)。

(6)rollback_config:配置在更新失败的情况下应如何回滚服务。

  • parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
  • delay:每个容器组回滚之间等待的时间(默认为0s)
  • failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
  • monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
  • max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
  • order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚),默认 stop-first 。

(7)update_config:配置应如何更新服务,对于配置滚动更新很有用。
同rollback_config。

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

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

相关文章

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

为 Spring Boot 项目配置 Logback 日志

关于 Logback 日志系统是一个线上项目必备的素质之一&#xff0c;代表性的日志框架 Log4j、SLF4J、Logback 这哥仨竟然是亲兄弟&#xff0c;他们有一个亲爹&#xff0c;那就是巨佬 Ceki Gulcu。 由于 Spring Boot 的默认日志框架选用的 Logback&#xff0c;再加上 Log4j2 之前…

[网络安全 渗透实验 01]基于MSF框架渗透攻击Win7主机系统的设计与实现

基于MSF框架渗透攻击Win7主机系统的设计与实现 文章目录 基于MSF框架渗透攻击Win7主机系统的设计与实现[Warning] 写在前面1. 实验要求2. 实验环境搭建2.1 攻击机&#xff08;Linux kali&#xff09;的下载与安装2.2 靶机&#xff08;Windows 7 Enterprise with Service Pack 1…

AI赋能—EasyCVR视频融合平台为春节人员流动保驾护航

春节期间&#xff0c;如景区、商场、车站等公共场所的人流量激增&#xff0c;人员密集度大。在此情况下&#xff0c;监控客流量可以及时发现人群聚集、过度拥挤等安全隐患&#xff0c;防止发生安全事故。通过实时监测和分析客流量数据&#xff0c;可以及时发现安全隐患和拥堵问…

MySQL 可重复读隔离级别,完全解决幻读了吗?

文章目录 前言一、什么是幻读&#xff1f;二、快照读是如何避免幻读的&#xff1f;三、当前读是如何避免幻读的&#xff1f;四、幻读被完全解决了吗&#xff1f;场景1场景2 总结 前言 MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」&#xff0c;但是它很大程度上避免幻读…

【Qt学习笔记】(二)信号和槽

信号和槽 1 信号和槽概述2 信号和槽的使用3 可视化生成槽函数4 自定义信号和槽5 带参数的信号和槽6 信号与槽的连接方式7 信号与槽的断开8 使用 Lambda 表达式来定义槽函数 1 信号和槽概述 在Qt中&#xff0c;用户和控件的每次交互过程称为一个事件。比如"用户点击按钮&q…

动网格-网格重构之弹性光顺局部重构法(四)

弹性光顺法的基本特点 弹性光顺法中&#xff0c;网格线类似于弹簧&#xff0c;两端节点(node)作弹性移动 弹性光顺法有如下特点。 (1)节点的数量和节点之间的连接关系均不变&#xff0c;即节点之间的连接属性不变。 (2)单独使用时&#xff0c;仅限于变形非常小的情况&#xff…

Ubuntu-22.04上使用硬解码播放视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备工作1.显卡驱动2.其它必须软件3.查看显卡支持哪些编码格式 二、SMplayer三、VLC总结 前言 现在Ubuntu做的越来越好了&#xff0c;很多人拿它来当主力机…

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展&#xff0c;当前的数据处理需求正以前所未有的规模增长&#xff0c;以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大&#xff0c;并对主机计算资源&#xff08;如内存和CPU&#xff09;造成极大负担&#xff0c;进…

【Tomcat与网络10】Tomcat I/O和线程池的并发调优

前面我们看了提高Tomcat启动速度的措施&#xff0c;这里我们看一下如何提高Tomcat的性能。 Tomcat 的调优涉及 I/O 模型和线程池调优、JVM 内存调优以及网络优化等&#xff0c;今天我们来聊聊 I/O 模型和线程池调优&#xff0c;由于 Web 应用程序跑在 Tomcat 的工作线程中&…

月入过万比打工强,在家就能做steam搬砖项目真的假的

每天都有粉丝私下跟我聊天&#xff0c;讨论Steam搬砖项目到底是不是真的&#xff0c;到底能不能做。你想让我详细说说。那么今天就和大家详细聊聊这个月入过万元的项目。 简单来说&#xff0c;Steam搬砖项目就是在国外蒸汽上采购游戏道具&#xff0c;在国内网易buff平台上销售…

外包干了10个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

面对近期行情大起大落的伦敦银需要关注什么?

近期经常有听到投资者抱怨说&#xff0c;伦敦银价格没有明显趋势&#xff0c;很难做。确实&#xff0c;我们从日线图看&#xff0c;金价处于一个比较宽幅的横盘区间当中&#xff0c;近期的行情也是大涨大跌。投资者认为&#xff0c;面对大起大落的行情无从下手。下面我们就来讨…

【WebGIS实例】(13)MapboxGL+Vue 实现自定义组件地图气泡弹窗 popup

前言 没有前言&#xff0c;直接上代码了 代码 核心方法 const addComponentPopup (component, feature, lnglat, map) > {const popup new mapboxgl.Popup({// anchor: center, // center , top , bottom , left , right , top-left , top-right , bottom-left , and …

【JavaSE篇】——内部类

目录 &#x1f393;内部类 &#x1f388;内部类的分类 &#x1f6a9;实例内部类 一.如何实例内部类对象 二.实例内部类中为什么不能有静态成员变量 &#xff08;用final解决&#xff09; 三.在实例内部类对象时&#xff0c;如何访问外部类当中相同的成员变量&#xff1f;…

MySQL数据库-理论基础

1.1 什么是数据库 数据&#xff1a; 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 数据库&#xff1a; 存储数据的仓库&#xff0c;是长期存放在计算机内、有组织…

Collection和Map集合

Collection分两大类:List和Set List又分为:ArrayList和LinkedList Set分为HashSet和TreeSet List集合特点:添加的元素有序,可重复,有索引 ArrayList和LinkedList:有序,可重复,有索引 Set集合特点:添加的元素是无序,不重复,无索引 HashSet:无序,不重复,无索引 Lin…

Android源码设计模式解析与实战第2版笔记(四)

第三章 自由扩展你的项目–Builder 模式 Builder 模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder 模式的使用场景 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时 多个部件或零件&…

【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】

升级openssl报错&#xff1a; openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候&#xff0c;报上述错误&#xff0c;将编译到的…

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…