Kubernetes 外部 etcd 集群的快速 Docker Compose 部署指南

news2024/9/20 22:45:48

一、背景

在高可用 Kubernetes 部署中,需要单独部署外部 etcd 集群,而不是使用 kubeadm 默认在 master 节点上部署的 etcd。以下是关于这一配置场景的详细记录。

二、etcd简介

etcd 是一个高可用的分布式键值存储系统,主要用于存储和管理配置信息、服务发现信息以及其他重要的元数据。etcd 是由 CoreOS 开发的,基于 Raft 共识算法来保证数据的一致性和可靠性。

2.1 etcd 关键特点

  • 分布式:etcd 运行在多个节点上,通过 Raft 协议确保数据一致性。
  • 高可用性:即使部分节点出现故障,etcd 也能继续提供服务。
  • 一致性保证:使用 Raft 协议来确保数据的一致性,支持强一致性读写。
  • 键值存储:数据以键值对的形式存储,适合存储配置和元数据。
  • 支持事务:支持原子操作,如事务操作来保证数据的正确性。

2.2 etcd 主要功能

  • 分布式键值存储:etcd 是一个高可用的分布式键值存储系统,支持高效的键值对存储和读取,并提供强一致性保证。
  • 一致性保证:etcd 使用 Raft 协议确保数据一致性,即使部分节点故障,数据仍然保持一致。
  • 高可用性:etcd 通过数据复制到多个节点提供高可用性和容错能力,只要大多数节点正常,数据依然可用。
  • 事务支持:etcd 支持原子操作和事务,确保对多个键值对的更改安全一致。
  • 观察和通知:etcd 支持事件监听和观察功能,客户端可以订阅键值变化,适合动态配置更新。
  • 持久化存储:etcd 将数据持久化到磁盘,确保在节点重启或故障时数据不丢失。
  • 分布式锁:etcd 提供分布式锁,支持节点间的协调和同步,常用于确保资源唯一性或任务协调。
  • 范围查询:etcd 支持对键值对的范围查询,便于批量检索数据。
  • API 接口:etcd 提供 HTTP/gRPC API,支持基本的 CRUD 操作、事务和观察功能。

这些功能使 etcd 成为一个强大且可靠的分布式键值存储系统,适合用于需要高一致性和高可用性的场景,特别是在 Kubernetes 这样的集群管理系统中。

2.3 etcd 在 Kubernetes 中使用场景

K8S-3主3从-单独etcd集群.png

在 Kubernetes (K8S) 集群中,etcd 扮演着至关重要的角色。它主要用于存储和管理 Kubernetes 的所有集群状态信息和配置数据。以下是 etcd 在 Kubernetes 中的一些关键使用场景:

  • 集群状态存储:Kubernetes 的所有集群状态、配置信息、资源定义等都存储在 etcd 中。包括 Pod、Service、ConfigMap、Secret 等对象的状态和配置都被存储在 etcd 中。

  • 高可用性配置:提供高可用性和容错能力,保证即使在集群中的一些节点失效的情况下,Kubernetes 也能继续运行和提供服务。

  • 数据一致性保证: 使用 Raft 协议确保数据的一致性,这对于 Kubernetes 来说是非常重要的,因为它需要确保所有操作和状态在集群中的一致性。

  • 服务发现:Kubernetes 的服务发现机制依赖于 etcd 存储服务的状态和信息。etcd 记录服务的 IP 地址和端口信息,允许其他组件进行服务发现。

  • 动态配置管理:Kubernetes 使用 etcd 来管理配置变化,比如部署新的应用版本或调整资源配置。etcd 的事务支持使得配置更改能够被安全地提交和应用。

  • 审计和恢复:etcd 的持久化存储允许 Kubernetes 在发生故障或恢复操作时能够重建集群状态。etcd 的备份和恢复机制是确保 Kubernetes 集群数据安全的重要手段。

三、使用docker-compose快速部署etcd

  • 参考官方文档:https://github.com/etcd-io/etcd/releases

3.1 etcd单节点部署

PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd

3.1.1 环境准备

机器IP主机名etcd版本docker 版本docker-compose版本
172.22.33.213etcdv3.3.820.10.18v2.10.2

3.1.2 创建etcd 工作目录,编写docker-compose 文件

  • ETCD_NAME 每个节点的 etcd 服务名称
  • ETCD_ADVERTISE_CLIENT_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
  • ETCD_INITIAL_ADVERTISE_PEER_URLS 填写每个 etcd 容器所在节点对外提供服务的 IP
  • ETCD_INITIAL_CLUSTER: ETCD 集群配置包含所有节点的名称和 ETCD_INITIAL_ADVERTISE_PEER_URLS 地址,我这里目前就一个节点
  • ETCD_INITIAL_CLUSTER_STATE:
    • new: 用于首次创建全新 etcd 集群,节点将根据初始配置启动集群。
    • existing: 用于扩展、重启或恢复已有的集群,节点将尝试加入现有集群,而不是重新初始化
$ mkdir -p /home/application/etcd/{data,config}


$ cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'

services:
  etcd:
    container_name: etcd
    image: quay.srebro.site/coreos/etcd:v3.3.8
    environment:
      - ETCD_NAME=etcd
      - ETCD_DATA_DIR=/var/etcd
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.213:2379
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.213:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd=http://172.22.33.213:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
      - ETCD_LOGGER=zap
      - ETCD_LOG_LeveL=info 
    volumes:
      - /home/application/etcd/data:/var/etcd
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - 2379:2379
      - 2380:2380
    restart: always

networks:
  default:
    name: etcd-tier
    driver: bridge
EOF

3.1.3 创建并启动 etcd 服务

$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME                COMMAND                 SERVICE             STATUS              PORTS
etcd                "/usr/local/bin/etcd"   etcd                running             0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp

3.1.4 etcd 服务可用性测试

为了测试 etcd 服务的可用性,需要安装 etcd 客户端工具用于验证测试。

$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x  /usr/local/bin/etcdctl


#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态

$ etcdctl --endpoints=172.22.33.213:2379 --write-out=table endpoint health

+--------------------+--------+------------+-------+
|      ENDPOINT      | HEALTH |    TOOK    | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.213:2379 |   true | 3.035915ms |       |
+--------------------+--------+------------+-------+



#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息

$ etcdctl  --endpoints=172.22.33.213:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.213:2379 | 8e9e05c52164694d |   3.3.8 |   26 MB |      true |      false |         2 |     659422 |                  0 |        |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+



#使用 etcdctl 工具验证测试 member

$ etcdctl  --endpoints=172.22.33.213:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
|        ID        | STATUS  | NAME |      PEER ADDRS       |       CLIENT ADDRS        | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.213:2379 |      false |
+------------------+---------+------+-----------------------+---------------------------+------------+


# etcdctl 工具验证测试数据读写
$ etcdctl  --endpoints=172.22.33.213:2379  put srebro.cn yyds
OK
$ etcdctl  --endpoints=172.22.33.213:2379 get srebro.cn
srebro.cn
yyds

3.2 etcd集群部署

PS: 请勿在K8S 集群中的机器上 使用docker-compose 去部署etcd集群 ,可能会存在子网冲突; 在条件允许的情况下,我们还是申请机器去单独部署etcd集群

3.2.1 环境准备

机器IP主机名etcd版本docker 版本docker-compose版本
172.22.33.210etcd-01v3.3.820.10.18v2.10.2
172.22.33.211etcd-02v3.3.820.10.18v2.10.2
172.22.33.212etcd-03v3.3.820.10.18v2.10.2

3.2.2 修改主机名,添加hosts解析

在每台主机上执行

设置主机名:
$ hostnamectl set-hostname etcd-01
$ hostnamectl set-hostname etcd-02
$ hostnamectl set-hostname etcd-03


#在所有节点添加hosts:
$ cat >> /etc/hosts << EOF
172.22.33.210 etcd-01
172.22.33.212 etcd-02
172.22.33.212 etcd-03
EOF

3.2.3 创建etcd 工作目录,编写docker-compose 文件

172.22.33.210 etcd-01 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}


cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'

services:
  etcd:
    container_name: etcd
    image: quay.srebro.site/coreos/etcd:v3.3.8
    environment:
      - ETCD_NAME=etcd01
      - ETCD_DATA_DIR=/var/etcd
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.210:2379
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.210:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
      - ETCD_LOGGER=zap
      - ETCD_LOG_LeveL=info      
    volumes:
      - /home/application/etcd/data:/var/etcd
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - 2379:2379
      - 2380:2380
    restart: always

networks:
  default:
    name: etcd-tier
    driver: bridge
EOF

172.22.33.211 etcd-02 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}


cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'

services:
  etcd:
    container_name: etcd
    image: quay.srebro.site/coreos/etcd:v3.3.8
    environment:
      - ETCD_NAME=etcd02
      - ETCD_DATA_DIR=/var/etcd
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.211:2379
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.211:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
      - ETCD_LOGGER=zap
      - ETCD_LOG_LeveL=info      
    volumes:
      - /home/application/etcd/data:/var/etcd
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - 2379:2379
      - 2380:2380
    restart: always

networks:
  default:
    name: etcd-tier
    driver: bridge
EOF

172.22.33.212 etcd-03 主机上
每个节点内容不一样,需要分别编写。

mkdir -p /home/application/etcd/{data,config}


cat  >> /home/application/etcd/docker-compose.yaml << EOF
version: '3'

services:
  etcd:
    container_name: etcd
    image: quay.srebro.site/coreos/etcd:v3.3.8
    environment:
      - ETCD_NAME=etcd03
      - ETCD_DATA_DIR=/var/etcd
      - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
      - ETCD_ADVERTISE_CLIENT_URLS=http://172.22.33.212:2379
      - ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
      - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.22.33.212:2380
      - ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
      - ETCD_INITIAL_CLUSTER=etcd01=http://172.22.33.210:2380,etcd02=http://172.22.33.211:2380,etcd03=http://172.22.33.212:2380
      - ETCD_INITIAL_CLUSTER_STATE=new
      - ETCD_LOGGER=zap
      - ETCD_LOG_LeveL=info      
    volumes:
      - /home/application/etcd/data:/var/etcd
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - 2379:2379
      - 2380:2380
    restart: always

networks:
  default:
    name: etcd-tier
    driver: bridge

EOF

3.2.4 创建并启动 etcd 服务

每台机器依次启动etcd 服务

$ cd /home/application/etcd/
$ docker-compose up -d
$ docker-compose ps
NAME                COMMAND                 SERVICE             STATUS              PORTS
etcd                "/usr/local/bin/etcd"   etcd                running             0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp

3.2.5 etcd 集群服务可用性测试

为了测试 etcd 集群服务的可用性,需要安装 etcd 客户端工具用于验证测试。

$ wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
$ tar -xf etcd-v3.5.15-linux-amd64.tar.gz
$ cp etcd-v3.5.15-linux-amd64/etcdctl /usr/local/bin
$ chmod +x  /usr/local/bin/etcdctl


#使用 etcdctl 工具快速检查指定的 etcd 节点(或节点集)的健康状态

$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint health

+--------------------+--------+------------+-------+
|      ENDPOINT      | HEALTH |    TOOK    | ERROR |
+--------------------+--------+------------+-------+
| 172.22.33.210:2379 |   true | 3.035915ms |       |
| 172.22.33.211:2379 |   true | 3.035915ms |       |
| 172.22.33.212:2379 |   true | 3.035915ms |       |
+--------------------+--------+------------+-------+



#使用 etcdctl 工具查看指定 etcd 节点(或节点集)当前的详细状态信息

$ etcdctl --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table endpoint status
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT      |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.22.33.210:2379 | 8e9e05c52164694d |   3.3.8 |   26 MB |      true |      false |         2 |     659422 |                  0 |        |
| 172.22.33.211:2379 | 0e95c521fdoi69ac |   3.3.8 |   26 MB |      false|     false |          2 |     659422 |                  0 |        |
| 172.22.33.212:2379 | pe9e05dfbrt64680 |   3.3.8 |   26 MB |      false|     false |          2 |     659422 |                  0 |        |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+




#使用 etcdctl 工具验证测试 member

$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 --write-out=table member list
+------------------+---------+------+-----------------------+---------------------------+------------+
|        ID        | STATUS  | NAME |      PEER ADDRS       |       CLIENT ADDRS        | IS LEARNER |
+------------------+---------+------+-----------------------+---------------------------+------------+
| 8e9e05c52164694d | started | etcd | http://localhost:2380 | http://172.22.33.210:2379 |      true |
| 0e95c521fdoi69ac | started | etcd | http://localhost:2380 | http://172.22.33.211:2379 |      false|
| pe9e05dfbrt64680 | started | etcd | http://localhost:2380 | http://172.22.33.212:2379 |      false|
+------------------+---------+------+-----------------------+---------------------------+------------+


# etcdctl 工具验证测试数据读写
$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379  put srebro.cn hello
OK
$ etcdctl  --endpoints=172.22.33.210:2379,172.22.33.211:2379,172.22.33.212:2379 get srebro.cn
srebro.cn
hello

四、kubeadm 使用集群外etcd,部署K8S集群

kubeadm 安装过程省略,直接贴上kubeadm-init.yaml 配置文件;主要查看etcd 那块的配置;

另外需要注意,ETCD 集群 与 apiservice 之间通信,是否采用TLS 加密,我上面部署的etcd集群实则是没有采用TLS 加密的

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 35sesk.5tm3tqc66tzlse8c
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.22.33.220
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  certSANs:
  - kubernetes
  - kubernetes.default
  - kubernetes.default.svc
  - kubernetes.default.svc.cluster.local
  - 172.22.33.220
  - 112.11.11.11
  - k8s.srebro.cn
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.22.33.220:6443
controllerManager: {}
dns: {}
etcd:
  external:
    endpoints:
    - "http://172.22.33.210:2379"
    - "http://172.22.33.211:2379"
    - "http://172.22.33.212:2379"
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.24.9
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}
  • 不使用TLS 加密 ,需要配置如下内容:

image-20240825162139075

  • 如果需要使用TLS 加密 ,需要配置如下内容:

image-20240825162058429

五、参考

  • https://cloud.tencent.com/developer/article/2394695

来源于srebro.cn
© 版权声明
文章版权归作者所有,未经允许请勿转载。

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

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

相关文章

使用Qt+Visual Stuidio写一个简单的音乐播放器(1)

1.使用QMediaPlayer播放音乐 第三步:在代码头部加上: #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 QMediaPlayer类是一个高级媒体播放类。它可以用来播放歌曲、电…

leetcode 893. Groups of Special-Equivalent Strings

原题链接 You are given an array of strings of the same length words. In one move, you can swap any two even indexed characters or any two odd indexed characters of a string words[i]. Two strings words[i] and words[j] are special-equivalent if after any …

力扣: 设计链表

文章目录 需求代码结尾 需求 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 p…

Java 的数组详解

数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据&#xff0c;按照一定的先后次序排列组合而成 其中&#xff0c;每一个数据称作一个数组元素&#xff0c;每个数组元素可以通过一个下标(编号、标记)来访问它&#xff0c;下标是从 0 开始的&#xf…

100套动画PPT模版分享

100套动画PPT模板 目录下载链接 目录 下载链接 「动画模板」链接&#xff1a;https://pan.quark.cn/s/73ea2523f198 点击下载

中小型企业如何管理文档?8款工具来帮你

文章介绍了以下几个工具&#xff1a;PingCode、Worktile、氚云、泛微、中通天鸿、Tower、知因智慧、SharePoint。 在中小型互联网企业中&#xff0c;文档知识库的管理常常让人头疼。团队成员散布在不同的地点&#xff0c;文档分散在各种工具中&#xff0c;查找信息变得异常困难…

Linux启动流程和Systemd特性

文章目录 内核设计流派linux启动流程1.硬件加电自检2.启动加载器bootloader3.加载kernel4.init初始化5.用户终端启动 systemdsystemd特性systemd的unitunit配置文件 systemctl管理系统服务service unit服务状态 service unit文件格式Unit段Service段Install段 内核设计流派 1.…

资源第二篇:bundle 的config.json 文件内容的解析

简介 本篇文章主要是对bundle包的核心文件config.json 的分析。config.json记录着整个bundle包的具体信息&#xff0c;并通过config.json 去解析整个bundle包。 bundle 目录下的文件结构 import 存放所有的json。场景、预制体、texture2D配置等jsonnative 存放所有的实际资源…

分子属性梯度引导的3D分子生成扩散模型 TAGMOL - 评测

TAGMoL 是一个基于分子属性条件引导扩散的 3D 分子生成模型&#xff0c;适合在给定靶标蛋白质的情况下&#xff0c;可以生成一系列满足目标特性&#xff08;分子属性&#xff0c;binding affinity&#xff09;的候选分子。 一、背景介绍 TAGMoL 来源于新德里 Molecule AI, 以及…

ESP32 出现 failed to load RF 报错

前言 个人邮箱&#xff1a;zhangyixu02gmail.com 正文 周五我测试程序没有问题&#xff0c;板子放在桌子上就没动过了。周一过来的时候&#xff0c;重新烧录程序&#xff0c;就发现出现如下报错。最终发现是电池过放导致电池损坏功率不够&#xff0c;因此 RF 无法启动&#…

探寻少儿自闭症的解决之道

自闭症&#xff0c;又称孤独症谱系障碍&#xff0c;是一种广泛性发育障碍&#xff0c;给无数家庭带来了沉重的负担。然而&#xff0c;随着科学技术的不断进步和人们对自闭症认识的逐步深入&#xff0c;越来越多的方法和途径正在被探索出来&#xff0c;为自闭症的解决带来了希望…

RocketMQ 与 Spring Cloud Stream之事务消息配置

1 引言 RocketMQ的事务消息设计是为了解决分布式系统中数据一致性的问题。在分布式系统中&#xff0c;由于数据可能分布在不同的服务或节点上&#xff0c;因此需要一种机制来确保数据的最终一致性。事务消息通过引入本地事务和消息状态的关联&#xff0c;确保了消息的发送与本…

【什么是“Binary“二进制文件?】

“Binary”二进制文件是计算机文件的一种形式。部件文件是开发人员编写的源代码文件&#xff0c;还未被编译成可执行的机器代码&#xff0c;通常具有如.c、.cpp、.java 等扩展名。对象文件是部件文件经过编译器编译生成的中间文件&#xff0c;包含了部件文件的机器代码和符号表…

链表OJ题——环形链表2

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 环形链表2 题目描述&#xff1a;在链表有环的基础上&#xff0c;找出环的入口点。 二、解题思路 三、解题代码

移动端爬虫学习记录

免责声明 本文旨在探讨移动端爬虫技术的应用和挑战&#xff0c;仅供教育和研究用途。请确保在合法合规的框架内使用爬虫技术&#xff0c;遵循相关法律法规和网站的使用条款。作者不对因使用本文内容而产生的任何法律或安全问题承担责任。 1、初识移动端爬虫 学习移动端爬虫的原…

.NET 开发的高性能内网穿透工具

目录 前言 什么是NSmartProxy&#xff1f; 项目特点 运行原理 客户端安装 服务端安装 使用案例 项目地址 最后 前言 在许多情况下&#xff0c;我们需要从外部网络访问内部网络中的服务&#xff0c;比如家里的服务器或者公司的内部资源。这时内网穿透工具就可以帮助我们…

【吊打面试官系列-Memcached面试题】什么是二进制协议,我该关注吗?

大家好&#xff0c;我是锋哥。今天分享关于 【什么是二进制协议&#xff0c;我该关注吗&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 什么是二进制协议&#xff0c;我该关注吗&#xff1f; 关于二进制最好的信息当然是二进制协议规范&#xff1a; 1000道 互…

【AI+编程】只需1句提示词0代码生成前端展示效果

最近被Vercel发布的V0 编程效果惊艳到了&#xff0c; 不管是前端开发 还是立志成为全栈工程师的 同学&#xff0c;不可错过。 官网地址&#xff1a;https://v0.dev/chat/ 代码生成工具很多&#xff0c;不管是github copilot、阿里的通义灵码&#xff0c; 腾讯云的AI代码助手…

python 多进程 多线程 程序

这个纯粹为了增加理解&#xff0c;将很多比较好的资料进行归纳总结。 1、理论汇总 并发和并行 image.png 多进程和多线程 同步和异步 同步&#xff1a;所谓同步&#xff0c;就是在发出一个功能调用时&#xff0c;在没有得到结果之前&#xff0c;该调用就不会返回。 异步…

027集—CAD中批量删除多段线重复点、距离过近点——vba代码实现

cad图中多段线存在重复点、或距离过近点&#xff0c;可通过vba插件一键删除。 &#xff08;精度可人工设定&#xff0c;例如精度设置0.001&#xff1a;小于0.001 的点视为重复点&#xff0c;删除此点。&#xff09; 如下图&#xff1a; 如下图&#xff1a; 大量重复点和距离…