Docker三剑客——Docekr Swarm

news2025/1/23 1:05:46

目录

 一、概述

二、Swarm 的核心概念

1. Node(节点)

2. Service(服务)

3. Task(任务)

三、Swarm 服务的运行部分

1. 工作节点

2. 服务、任务和容器

3. 任务和调度

4. 副本服务和全局服务

四、Swarm 的调度策略

1. Spread

2. Binpack

3. Random

五、创建Swarm集群过程

六、Docker Swarm常用管理命令

1. docker swarm 集群管理命令

2. docker node 集群节点管理命令

3. docker service 集群服务管理命令

七、Swarm 集群的部署

1. 部署环境准备

2. 下载Swarm镜像

3. 创建 Swarm 并初始化

4. 查看当前的信息

5. 将node1和node2加入集群

6. 查看集群节点状态

7. Swarm集群的web管理

 八、Docker Swarm部署服务实战

1. 创建网络

2. 创建服务

 3. 在线动态扩容服务

4. 节点故障处理


官方文档地址:How nodes work | Docker Swarm

 

 一、概述

        Docker SwarmDocker Compose都是 Docker 容器的编排技术。两者的区别在于:Docker Compose 是一个能在单台服务器主机创建多个容器的工具,而Docker Swarm 则可以在多台服务器主机上创建容器集群。

        Swarm 是基于 Docker 平台实现的集群技术,可以通过几条简单的指令快速的创建一个Docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。

        Swarm 也是目前 Docker 官方唯一指定的容器集群管理工具,其主要作用是把若干台Docker 主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

        Swarm Kubernetes 比较类似,但是更加轻便,功能也相对少一点。Swarm 集群提供给用户管理集群内所有容器的操作接口与使用Docker主机基本相同。

二、Swarm 的核心概念

1. Node(节点)

        Node 是一个已加入 Docker Swarm 集群中的容器示例。 

2. Service(服务)

        Service主要在工作节点上执行任务,创建服务时,需要指定容器的镜像。

3. Task(任务)

        Task 是在容器中执行的命令。

三、Swarm 服务的运行部分

        Swarm 服务的工作及运行包括以下4部分:

1. 工作节点

        工作节点是运行服务的主机或服务器

2. 服务、任务和容器

        当服务部署到集群时,管理者将服务定义为服务所需的状态,然后将服务调试为一个或多个副本任务,这些任务在集群的节点上时独立运行的。

        容器是一个独立的进程。在Swarm模型中,每个任务调用一个容器。任务类似于插槽,调度器将容器放入插槽中。一旦容器运行,调度器就认为此任务处于运行状态。如果容器的健康监测出现问题,则任务也将终止。

3. 任务和调度

        任务是集群内调度的原子单位。当创建或更新服务所需的服务状态时,协调者通过调度任务来实现这些所需的状态。

        任务是一个单向机制,通过分配、准备、运行等状态单独运行。如果任务失败,协调者将删除任务以及容器,然后更新服务所需的状态重新创建一个新的任务来替代它。

4. 副本服务和全局服务

        副本服务与全局服务是服务部署的两种类型。

        对于副本服务,指定要运行的相同任务的数量,每个副本都具有相同的内容。

        全局服务是在每个节点上运行一个任务的服务,不需要预先指定任务数量。   

四、Swarm 的调度策略

        Swarm 在 scheduler 节点(leader节点)运行容器时,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有 Spread,Binpack,Random。

1. Spread

        在同等条件下,Spread 策略会选择运行容器最少的那个节点来运行新的容器。使用Spread 策略会使得容器均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了,只会损失少部分的容器。

2. Binpack

        Binpack策略可以最大化的避免容器碎片化,就是说 Binpack 策略尽可能地把还未使用的节点留给需要更大空间的容器运行,把容器运行在一个节点上面。

3. Random

        Random 策略时随机选择一个节点来运行容器,一般用作调试。

五、创建Swarm集群过程

        一个Swarm集群的创建需要经历以下三个过程:

(1)发现Docker集群中的各个节点,收集节点状态和角色信息,并监视节点状态的变化。

(2)初始化内部调度(scheduler)模块。

(3)创建并启动API监听服务模块。

        一旦创建好这个集群,就可以用“docker service” 命令批量对集群内的容器进行操作。在启动容器后,Docker会根据当前每个Swarm节点的负载进行判断,在负载最优的节点上运行这个任务,用“docker service ls” “docker service ps + taskId” 可以看到任务运行在哪个节点上。

六、Docker Swarm常用管理命令

1. docker swarm 集群管理命令

参数说明
init初始化集群
join

将某个节点加入集群

join-token管理加入令牌
leave

从集群中将某个节点删除,强制删除参数为 --force

update更新集群
unlock解锁集群

2. docker node 集群节点管理命令

参数说明
demote将集群中一个或多个节点降级
inspect显示集群中一个或多个节点的详细信息
ls列出集群中所有节点
promote将集群中一个或多个节点提升为管理节点
rm从集群中删除停止的节点,强制删除 --force
ps列出集群中一个或多个节点上运行的任务
update更新节点

3. docker service 集群服务管理命令

参数说明
create创建一个新的服务
inspect列出一个或多个服务的详细信息
ps列出一个或多个服务中的任务信息
ls列出所有服务
rm删除一个或多个服务
scale扩展一个或多个服务
update更新服务

七、Swarm 集群的部署

1. 部署环境准备

准备三台服务器,服务器规划如下表:

服务器角色服务器IP备注
Swarm 集群管理节点192.168.65.130主机名:manager
Swarm 集群节点192.168.65.129主机名:node1
Swarm 集群节点192.168.65.128主机名:node2

修改服务器主机名,配置hosts文件:

[root@manager ~]# cat >>/etc/hosts<<EOF
> 192.168.65.130 manager
> 192.168.65.129 node1
> 192.168.65.128 node2
> EOF
[root@manager ~]# tail -3 /etc/hosts
192.168.65.130 manager
192.168.65.129 node1
192.168.65.128 node2

测试能否ping通node1和node2节点:

[root@manager ~]# ping node1
PING node1 (192.168.65.129) 56(84) bytes of data.
64 bytes from node1 (192.168.65.129): icmp_seq=1 ttl=64 time=1.11 ms
64 bytes from node1 (192.168.65.129): icmp_seq=2 ttl=64 time=1.58 ms
64 bytes from node1 (192.168.65.129): icmp_seq=3 ttl=64 time=0.466 ms
^C
--- node1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 0.466/1.056/1.587/0.460 ms
[root@manager ~]# ping node2
PING node2 (192.168.65.128) 56(84) bytes of data.
64 bytes from node2 (192.168.65.128): icmp_seq=1 ttl=64 time=0.942 ms
64 bytes from node2 (192.168.65.128): icmp_seq=2 ttl=64 time=0.512 ms
64 bytes from node2 (192.168.65.128): icmp_seq=3 ttl=64 time=0.577 ms
^C
--- node2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.512/0.677/0.942/0.189 ms

node1和node2节点的 hosts 配置和上面一致。

2. 下载Swarm镜像

所有节点都需要下载Swarm镜像:

[root@manager ~]# docker pull swarm

[root@manager ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
swarm        latest    1a5eb59a410f   2 years ago   12.7MB

3. 创建 Swarm 并初始化

        执行如下命令,将manager节点加入集群中,同时会产生一个唯一的 token 值,其他节点加入集群的时候需要用到这个token。

--advertise-addr 表示Swarm集群中其他节点使用后面的IP地址与管理节点通信。

下面的输出中也提示了其他节点加入集群的命令:

docker swarm join --token SWMTKN-1-2woh1eb077rtf1q7qp3komnit9gzk7hey7xpdvkeqqy7fmvfxa-3azlbbg466c5ltbxn8fn4z1o3 192.168.65.130:2377
[root@manager ~]# docker swarm init --advertise-addr 192.168.65.130
Swarm initialized: current node (vnesir8jo7gbxihtxfs3kh8di) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2woh1eb077rtf1q7qp3komnit9gzk7hey7xpdvkeqqy7fmvfxa-3azlbbg466c5ltbxn8fn4z1o3 192.168.65.130:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

4. 查看当前的信息

[root@manager ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  scan: Docker Scan (Docker Inc., v0.23.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 20.10.22
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: active
  NodeID: vnesir8jo7gbxihtxfs3kh8di
  Is Manager: true
  ClusterID: fn4adm9k7a7knt79zsx0de7eb
  Managers: 1
  Nodes: 1
  Default Address Pool: 10.0.0.0/8  
  SubnetSize: 24
  Data Path Port: 4789
  Orchestration:
   Task History Retention Limit: 5
  Raft:
   Snapshot Interval: 10000
   Number of Old Snapshots to Retain: 0
   Heartbeat Tick: 1
   Election Tick: 10
  Dispatcher:
   Heartbeat Period: 5 seconds
  CA Configuration:
   Expiry Duration: 3 months
   Force Rotate: 0
  Autolock Managers: false
  Root Rotation In Progress: false
  Node Address: 192.168.65.130
  Manager Addresses:
   192.168.65.130:2377
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9ba4b250366a5ddde94bb7c9d1def331423aa323
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-1160.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.777GiB
 Name: manager
 ID: NZU5:JH77:546X:VTNX:BSXT:UITP:MYHY:6NZ7:YH6Q:PYU2:BBQX:FEHC
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

查看当前集群所有节点: 目前只有管理节点

[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
vnesir8jo7gbxihtxfs3kh8di *   manager    Ready     Active         Leader           20.10.22

5. 将node1和node2加入集群

[root@node1 ~]# docker swarm join --token SWMTKN-1-2woh1eb077rtf1q7qp3komnit9gzk7hey7xpdvkeqqy7fmvfxa-3azlbbg466c5ltbxn8fn4z1o3 192.168.65.130:2377
This node joined a swarm as a worker.
[root@node2 ~]# docker swarm join --token SWMTKN-1-2woh1eb077rtf1q7qp3komnit9gzk7hey7xpdvkeqqy7fmvfxa-3azlbbg466c5ltbxn8fn4z1o3 192.168.65.130:2377
This node joined a swarm as a worker.

6. 查看集群节点状态

Swarm集群中node的AVAILABLITY状态有ActiveDrain

其中:Active状态的节点可以接受管理节点的任务指派,Drain状态的节点会结束任务,但不会接受管理节点的任务指派,节点处于下线状态。

[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
vnesir8jo7gbxihtxfs3kh8di *   manager    Ready     Active         Leader           20.10.22
lq0vgrgtwzlzybpxcfxi03y1n     node1      Ready     Active                          20.10.22
r48mnegbxml056jkk0k9c0ng8     node2      Ready     Active                          20.10.22

切换node2的状态:

切换为 Drain

[root@manager ~]# docker node update --availability drain node2
node2

[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
vnesir8jo7gbxihtxfs3kh8di *   manager    Ready     Active         Leader           20.10.22
lq0vgrgtwzlzybpxcfxi03y1n     node1      Ready     Active                          20.10.22
r48mnegbxml056jkk0k9c0ng8     node2      Ready     Drain                           20.10.22

切换回 Active 

[root@manager ~]# docker node update --availability active node2
node2
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
vnesir8jo7gbxihtxfs3kh8di *   manager    Ready     Active         Leader           20.10.22
lq0vgrgtwzlzybpxcfxi03y1n     node1      Ready     Active                          20.10.22
r48mnegbxml056jkk0k9c0ng8     node2      Ready     Active                          20.10.22

在manager节点上查看状态信息:

[root@manager ~]# docker node inspect self
[
    {
        "ID": "vnesir8jo7gbxihtxfs3kh8di",
        "Version": {
            "Index": 9
        },
        "CreatedAt": "2023-01-09T15:33:39.776148204Z",
        "UpdatedAt": "2023-01-09T15:33:40.292319277Z",
        "Spec": {
            "Labels": {},
            "Role": "manager",
            "Availability": "active"
        },
        "Description": {
            "Hostname": "manager",
            "Platform": {
                "Architecture": "x86_64",
                "OS": "linux"
            },
            "Resources": {
                "NanoCPUs": 2000000000,
                "MemoryBytes": 1907744768
            },
            "Engine": {
                "EngineVersion": "20.10.22",
                "Plugins": [
                    {
                        "Type": "Log",
                        "Name": "awslogs"
                    },
                    {
                        "Type": "Log",
                        "Name": "fluentd"
                    },
                    {
                        "Type": "Log",
                        "Name": "gcplogs"
                    },
                    {
                        "Type": "Log",
                        "Name": "gelf"
                    },
                    {
                        "Type": "Log",
                        "Name": "journald"
                    },
                    {
                        "Type": "Log",
                        "Name": "json-file"
                    },
                    {
                        "Type": "Log",
                        "Name": "local"
                    },
                    {
                        "Type": "Log",
                        "Name": "logentries"
                    },
                    {
                        "Type": "Log",
                        "Name": "splunk"
                    },
                    {
                        "Type": "Log",
                        "Name": "syslog"
                    },
                    {
                        "Type": "Network",
                        "Name": "bridge"
                    },
                    {
                        "Type": "Network",
                        "Name": "host"
                    },
                    {
                        "Type": "Network",
                        "Name": "ipvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "macvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "null"
                    },
                    {
                        "Type": "Network",
                        "Name": "overlay"
                    },
                    {
                        "Type": "Volume",
                        "Name": "local"
                    }
                ]
            },
            "TLSInfo": {
                "TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBazCCARCgAwIBAgIURK49dyMZAJlkF/+KhZ2ZRwk6hHcwCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjMwMTA5MTUyOTAwWhcNNDMwMTA0MTUy\nOTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABI8ig6isgQODWUgSsSSKj2hpK1Ig1V8anqhu7IySfSeZIvNqa5MqNp54pT4z\nwgXuULB66mh6N3JlzJ9tpVN/WmyjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBRKK/w5BkNfYY1tDMhNz8od06a+FTAKBggqhkjO\nPQQDAgNJADBGAiEA/VX4ilaDtBobsqitqJZWQfIQFB8D1ky+gkFSsOTkhJUCIQCR\nu5k9T23i2CgboMdA3Ll9TxrOgF4B+qRgmp3auhXFTw==\n-----END CERTIFICATE-----\n",
                "CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh",
                "CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjyKDqKyBA4NZSBKxJIqPaGkrUiDVXxqeqG7sjJJ9J5ki82prkyo2nnilPjPCBe5QsHrqaHo3cmXMn22lU39abA=="
            }
        },
        "Status": {
            "State": "ready",
            "Addr": "192.168.65.130"
        },
        "ManagerStatus": {
            "Leader": true,
            "Reachability": "reachable",
            "Addr": "192.168.65.130:2377"
        }
    }
]

7. Swarm集群的web管理

部署Web管理(使用portainer):

portainer优缺点:

优点:

(1)支持容器管理和镜像管理

(2)部署配置简单,属于轻量级

(3)基于Docker API,安全性高,支持TLS证书认证

(4)支持权限分配

(5)支持集群

缺点:

(1)功能较弱

(2)容器管理不便

[root@manager ~]# docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Web管理登录:

访问8088端口,需要先创建用户:

点击Swarm菜单,可以看到Swarm集群的状态信息:

 

 八、Docker Swarm部署服务实战

1. 创建网络

部署服务前,先创建几个用于集群内不同主机之间容器通信的网络。

[root@manager ~]# docker network create -d overlay dockernet
19hcx39gaenoermz90zrrsu6v
[root@manager ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
b5f197fd4cf0   bridge            bridge    local
be209a4c60a6   docker_gwbridge   bridge    local
19hcx39gaeno   dockernet         overlay   swarm
34f3db72e609   host              host      local
i6ljilnnt163   ingress           overlay   swarm
21bc223f3cd7   none              null      local

2. 创建服务

创建Nginx服务:

--replicas 指定副本数量

[root@manager ~]# docker service create --replicas 1 --network dockernet --name nginx-cluster -p 80:80 nginx
obrqkh0eewqfnvq5h10ymeuj8
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

列出所有服务:

[root@manager ~]# docker service ls
ID             NAME            MODE         REPLICAS   IMAGE          PORTS
obrqkh0eewqf   nginx-cluster   replicated   1/1        nginx:latest   *:80->80/tcp

列出nginx-cluster服务中的任务信息:

[root@manager ~]# docker service ps nginx-cluster
ID             NAME              IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
xaqvwxeu81i4   nginx-cluster.1   nginx:latest   node1     Running         Running 2 minutes ago 

可以看到在node1上运行,在node1节点查看容器:

[root@node1 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS          PORTS     NAMES
64b58014656d   nginx:latest   "/docker-entrypoint.…"   8 minutes ago        Up 7 minutes    80/tcp    nginx-cluster.1.xaqvwxeu81i4c1wj6ht1jsgcm

 3. 在线动态扩容服务

[root@manager ~]# docker service scale nginx-cluster=5
nginx-cluster scaled to 5
overall progress: 5 out of 5 tasks 
1/5: running   [==================================================>] 
2/5: running   [==================================================>] 
3/5: running   [==================================================>] 
4/5: running   [==================================================>] 
5/5: running   [==================================================>] 
verify: Service converged 

列出nginx-cluster服务中的任务信息:

可以看到服务动态扩容至5个,即5个容器运行着相同的服务,node1上运行着两个,node2上运行着两个。

[root@manager ~]# docker service ps nginx-cluster
ID             NAME              IMAGE          NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
xaqvwxeu81i4   nginx-cluster.1   nginx:latest   node1     Running         Running 9 minutes ago                  
gs7rv8phomso   nginx-cluster.2   nginx:latest   node2     Running         Running about a minute ago             
ziru1c6u7v4b   nginx-cluster.3   nginx:latest   node1     Running         Running 3 minutes ago                  
9zxjl51qs0cd   nginx-cluster.4   nginx:latest   manager   Running         Running about a minute ago             
a2kg9dk0309r   nginx-cluster.5   nginx:latest   node2     Running         Running about a minute ago  

4. 节点故障处理

        如果集群中的节点发生故障,会从Swarm集群中被剔除,然后利用自身的负载均衡及调度功能,将服务调度到其他节点上。

停止node1的其中一个容器:

[root@node1 ~]# docker stop 64b58014656d
64b58014656d

列出nginx-cluster服务中的任务信息:

可以看到在 manager 节点重启了一个容器,来代替刚才挂掉的那个

[root@manager ~]# docker service ps nginx-cluster
ID             NAME                  IMAGE          NODE      DESIRED STATE   CURRENT STATE             ERROR     PORTS
rmca33t8f9k3   nginx-cluster.1       nginx:latest   manager   Running         Running 48 seconds ago              
xaqvwxeu81i4    \_ nginx-cluster.1   nginx:latest   node1     Shutdown        Complete 55 seconds ago             
gs7rv8phomso   nginx-cluster.2       nginx:latest   node2     Running         Running 7 minutes ago               
ziru1c6u7v4b   nginx-cluster.3       nginx:latest   node1     Running         Running 9 minutes ago               
9zxjl51qs0cd   nginx-cluster.4       nginx:latest   manager   Running         Running 7 minutes ago               
a2kg9dk0309r   nginx-cluster.5       nginx:latest   node2     Running         Running 7 minutes ago 

如果需要删除节点上所有容器和任务,可以执行:

[root@manager ~]# docker rm nginx-cluster

以上就是关于Docker Swarm 的介绍。

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

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

相关文章

3. 【prometheus 学习】prometheus数据类型

prometheus 四种数据类型学习及测试 安装 1&#xff09;从官网下载对应版本的二进制压缩包并解压 2&#xff09;新建prometheus.yml 文件&#xff0c;静态指定抓取本机的9091端口&#xff0c;设置采样时间2秒1次&#xff0c;方便一会测试。 scrape_configs:- job_name: defin…

单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改

最近有小伙伴私信我&#xff0c;如下的单细胞UMAP图怎么做&#xff1f;是啥样的图呢&#xff1f;就是UMAP图上其他群是灰色的&#xff0c;只有某个群或者某几个群是标记颜色的&#xff0c;比较突出。其实很简单&#xff0c;一种办法可参考我们之前写过的ggplot做UMAP图&#xf…

uni-app使用蓝牙

目录 前言 连接蓝牙 开启蓝牙适配器 发现蓝牙 连接蓝牙 收发蓝牙数据 获取服务ID 获取特征值 读取蓝牙数据 写蓝牙数据 遇到的坑 获取serviceId的坑 特征值不支持读写 notify成功后立刻写蓝牙数据 工具方法 前言 原因是公司要搞个共享单车给内部员工使用&#…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程&#xff0c;本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型&#xff0c;该数占据32bit空间&#xff0c;可以表示较大范围内的整数和小数。32位浮点数由三部分组成&#xff0c;分别是符…

Java集合List、Set、Map底层源码解析

目录集合介绍MapHashMapLinkedHashMapHashTablePropertiesCollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSet集合介绍 为什么使用集合&#xff1f; 当我们想要保存一组数据时&#xff0c;可以使用到的变量类型有集合和数组。那么就像说一下数组的局限性…

1.9

完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleedit回调…

springboot+xxl-job初体验

在日常开发中经常遇到任务调度的需求&#xff0c;下面体验一下分布式调度xxl-job。 1、常见定时任务的实现方式 Java自带的java.util.Timer类ScheduledExcutorServiceSpringboot自带的EnableScheduling注解Quartz框架Elastic-job框架XXL-JOB框架 下面对xxl-job实现任务调度尝…

【TypeScript】TS进阶-函数重载(七)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

一文读懂电商数字员工究竟是什么?| RPA铺第1期

百度的曦灵&#xff0c;中核的核小智、万科集团数字员工“崔筱盼”都曾在2022年度爆火&#xff0c;数字员工一夜之间成为众多行业追捧的对象&#xff0c;那么&#xff0c;他/她们究竟代表着什么&#xff0c;对企业而言&#xff0c;是噱头大于收益&#xff0c;还是收益大于噱头呢…

简单的客户端服务器(多线程)基于json通信

这是一个客户端和服务器通信的小项目&#xff0c;小编自己手写了一个json工具&#xff0c;测试比jsoncpp&#xff0c;protobuf "效率更高"&#xff08;浅拷贝&#xff09;&#xff0c;改写成深拷贝效率会急剧下降&#xff08;小编能力有限&#xff0c;知识点&#xf…

技术分享 | Spring Boot 异常处理

说到异常处理&#xff0c;我们都知道使用 try-catch 可以捕捉异常&#xff0c;可以 throws 抛出异常。那么在 Spring Boot 中我们如何处理异常&#xff0c;如何更优雅的处理异常&#xff0c;如何全局处理异常。是本章讨论解决的问题。Java 异常类首先让我们简单了解或重新学习下…

Android开发-AS学习(一)

完整项目最精简流程&#xff1a;Android <-> 接口 <-> 数据库Android开发工具&#xff1a;Android Studio项目目录信息&#xff1a;一、控件1.1 TextView基础属性描述layout_width组件的宽度layout_height组件的高度id为TextView设置一个组件idtext设置显示的文本内…

Linux 学习笔记(借鉴黑马程序员Linux课程)

Linux视频课程 简介 Linux诞生于1991年&#xff0c;由林纳斯托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一。 Linux内核和系统发行版 由Linux系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调…

【笑小枫的按步照搬系列】Redis多系统安装(Windows、Linux、Ubuntu)

笑小枫&#x1f495; 欢迎来到笑小枫的世界&#xff0c;喜欢的朋友关注一下我呦&#xff0c;大伙的支持&#xff0c;就是我坚持写下去的动力。 微信公众号&#xff1a;笑小枫 笑小枫个人博客&#xff1a;https://www.xiaoxiaofeng.com Windows 下安装 方式一&#xff1a;https…

HCL(新华三模拟器)如何连接CRT及改界面颜色

我使用的HCL版本是2.1.1官网下载连接&#xff1a;https://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/&#xff0c;一键直达下载官网这个版本可以适配virtualbox的5.2.44的版本&#xff0c;同时支持华为的ensp模拟器…

Spring Security 表单配置(一)

Spring Security 表单配置&#xff08;一&#xff09;工具版本及环境参考资源配置详细说明工具版本及环境 工具&#xff1a; IDEA 2021.3 Maven 3.8.6 JDK 8 Spring Boot 2.7.7 Spring Securiity 5.7.6 参考资源 Spring Security官网: https://docs.spring.io/spring-security…

javaEE 初阶 — 常见的锁策略

文章目录1. 乐观锁 vs 悲观锁2. 互斥锁 vs 读写锁3. 重量级锁 vs 轻量级锁4. 自旋锁 vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. synchronized 是哪种锁8. 相关面试题1. 乐观锁 vs 悲观锁 乐观锁 指的是预测锁竞争不是很激烈&#xff0c;也就是指这里做的…

排列组合两个列表中的元素 product(a,b)

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】排列组合两个列表中的元素product(a,b)关于以下python代码表述错误的一项是?from itertools import producta [1,2,3]b [4,5,6]print("【显示】a",a)print("【显示】b",…

修改Keil开发环境背景(修改为黑色主题)

修改Keil开发背景&#xff08;修改为黑色主题&#xff09;引言步骤总结引言 我们平时在Keil uVision5下开发单片机/嵌入式程序的时候&#xff0c;如果始终用的是官方的主题背景&#xff0c;往往会因为背景太白了&#xff0c;而导致视疲劳。我们使用VSCode往往不会有这种困扰&a…

Python处理字符串 中文(汉字)编码示例

在实际开发中&#xff0c;发现打印Python打印经常出现乱码&#xff0c;大部分都是编码引起&#xff0c;这里只是简单说一下utf-8/ gbk/ unicode编码之间的相互转换问题&#xff1a; utf-8是Unix下的一种通用编码&#xff0c;gbk是win环境下的一种汉字编码&#xff0c;unicode是…