etcd教程-快速入門使用(截圖實操)集群搭建 + 原理解釋

大家好,我是此林。

etcd 是一個高可用的鍵值對存儲系統,常用于分布式系統中保存配置、服務發現和協調信息。它是 CNCF 旗下的項目之一,也是 Kubernetes 的核心組件之一,用來存儲集群狀態。

可以說,云原生場景下經常使用到 etcd,一般我們會把 etcd 作為注冊中心來使用。

1. etcd 是什么?

etcd 單詞可以拆分成 etc + d,etc 就是 Linux 里的 /etc 目錄,d 就是 distribution,代表分布式。

  • 使用 Raft 一致性算法保證分布式系統數據一致性(強一致性、保障了CP)

  • 提供 鍵值對存儲接口(KV)

  • 支持 Watch 機制(監聽鍵變化)

  • 提供 Lease / TTL(用于臨時鍵,比如服務注冊)

2. etcd 常見使用場景

場景說明
配置中心分布式系統中的配置動態變更通知
服務發現服務注冊自己的信息,客戶端從 etcd 查詢
分布式鎖利用 etcd 的原子操作實現分布式鎖
領導選舉通過 Lease 和 Watch 實現 leader 的自動選舉和變更通知
Kubernetes 存儲K8s 所有 API 對象最終存儲在 etcd 中

3. etcd 安裝

這里使用版本 3.5.21。

Release v3.5.21 · etcd-io/etcd

下載完成后,上傳到 Linux 服務器,使用下面的命令解壓。

tar -zxvf etcd-v3.5.21-linux-amd64.tar.gz

進入目錄后,其實最核心的也就是三個二進制可執行文件,etcd(主服務Server端),etcdctl(etcd客戶端連接工具),etcdutl(etcd工具集)。

其他都是些文檔。

把這三個二進制文件復制到 /usr/local/bin 里。

# 創建目標目錄(如果不存在)
sudo mkdir -p /usr/local/bin# 賦予可執行權限
chmod +x etcd etcdctl etcdutl# 復制到系統路徑
sudo cp etcd etcdctl etcdutl /usr/local/bin/

?配置環境變量,/usr/local/bin 加入 /etc/profile 文件末尾。

 vim /etc/profile

文件末尾有這一行就行。

export PATH=$PATH:/usr/local/bin

使環境變量生效。

source /etc/profile

4. 快速開始

輸入 etcd 啟動 etcd 服務端。

打開另一個終端,輸入命令:

etcdctl put greeting "hello, etcd"etcdctl get greeting

當然,也可以格式化輸出為 json。

etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo

?輸出:

{"header":{"cluster_id":289318470931837780,"member_id":14947050114012957595,"revision":3,"raft_term":4,
"kvs":[{"key":"Zm9v","create_revision":2,"mod_revision":3,"version":2,"value":"SGVsbG8gV29ybGQh"}]}}

看到這里,恭喜你,已經 etcd 入門了!?

5. 角色用戶配置

下面是官方文檔給出的配置示例,不急,我們慢慢來看。

1.?設置環境變量

export ETCDCTL_API=3           
# 設置使用 etcdctl 的 v3 API(新版 etcd 默認使用 v3)
# 這個只在當前shell生效,重啟會失效,永久設置要在/etc/profile里ENDPOINTS=localhost:2379       
# 設置 etcd 訪問地址(如果是集群也可寫多個:127.0.0.1:2379,127.0.0.2:2379)

2.?創建 root 角色并查看

etcdctl --endpoints=${ENDPOINTS} role add root
# 添加一個名為 root 的角色etcdctl --endpoints=${ENDPOINTS} role get root
# 查看 root 角色的權限信息(剛創建時是空的)

可以發現,root 角色有鍵值對讀寫權限。?

3.?創建 root 用戶并綁定 root 角色

etcdctl --endpoints=${ENDPOINTS} user add root
# 添加一個用戶 root(執行后會提示你輸入密碼)etcdctl --endpoints=${ENDPOINTS} user grant-role root root
# 給用戶 root 分配 root 角色etcdctl --endpoints=${ENDPOINTS} user get root
# 查看用戶 root 的角色信息

4.?創建 role0 角色并設置權限,創建 user0 用戶并賦予角色

etcdctl --endpoints=${ENDPOINTS} role add role0
# 添加一個角色 role0etcdctl --endpoints=${ENDPOINTS} role grant-permission role0 readwrite foo
# 給角色 role0 授予對 key "foo" 的讀寫權限(readwrite)
# 你也可以設定范圍權限,例如:--prefixetcdctl --endpoints=${ENDPOINTS} user add user0
# 添加用戶 user0,會提示輸入密碼etcdctl --endpoints=${ENDPOINTS} user grant-role user0 role0
# 將角色 role0 分配給用戶 user0

?這里,我們使用?grant-permission 對 role0 的權限進行了修改,role0 只有對 key "foo" 才有讀寫權限

5.?啟用認證

etcdctl --endpoints=${ENDPOINTS} auth enable
# 啟用 etcd 的認證功能
# 啟用后,所有的讀寫請求必須提供用戶名和密碼,否則會被拒絕

6.?權限驗證測試

etcdctl --endpoints=${ENDPOINTS} --user=user0:123 put foo bar
# 使用 user0 用戶(密碼是 123)寫入 key "foo",寫入成功(因為具有讀寫權限)etcdctl --endpoints=${ENDPOINTS} get foo
# 不帶用戶名直接訪問 key "foo",失敗(因為認證開啟了,默認匿名用戶無權限)etcdctl --endpoints=${ENDPOINTS} --user=user0:123 get foo
# 使用 user0 讀取 key "foo",成功(因為擁有讀權限)etcdctl --endpoints=${ENDPOINTS} --user=user0:123 get foo1
# 使用 user0 讀取 key "foo1",失敗(權限只對 foo 有效,foo1 不在授權范圍)

可以看到,user0 對 key foo1,沒有讀寫權限。

上面這個示例建議親手去敲一遍,有助于快速理解角色-用戶模型

6. 集群搭建

6.1. 方法一:靜態集群配置(推薦用于生產)

在 /etc/etcd 目錄下創建三個配置文件(這里就用一臺機器上不同端口來模擬集群)

etcd-node1.yaml

name: node1
data-dir: /tmp/etcd1listen-peer-urls: http://127.0.0.1:2380
listen-client-urls: http://127.0.0.1:2379initial-advertise-peer-urls: http://127.0.0.1:2380
advertise-client-urls: http://127.0.0.1:2379initial-cluster: node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380
initial-cluster-token: local-etcd-cluster
initial-cluster-state: new

etcd-node2.yaml

name: node2
data-dir: /tmp/etcd2listen-peer-urls: http://127.0.0.1:3380
listen-client-urls: http://127.0.0.1:3379initial-advertise-peer-urls: http://127.0.0.1:3380
advertise-client-urls: http://127.0.0.1:3379initial-cluster: node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380
initial-cluster-token: local-etcd-cluster
initial-cluster-state: new

etcd-node3.yaml

name: node3
data-dir: /tmp/etcd3listen-peer-urls: http://127.0.0.1:4380
listen-client-urls: http://127.0.0.1:4379initial-advertise-peer-urls: http://127.0.0.1:4380
advertise-client-urls: http://127.0.0.1:4379initial-cluster: node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380
initial-cluster-token: local-etcd-cluster
initial-cluster-state: new

集群啟動?

etcd --config-file=/etc/etcd/etcd-node1.yaml

在每個終端分別執行命令。

參數說明:

1. initial-cluster-token: local-etcd-cluster

etcd 集群的初始化 token,用于標識一個新的集群。所有節點必須使用相同的 token 才能加入該集群。

2. initial-cluster-state: new

指定 etcd 是啟動一個新的集群(new),還是加入一個已有的集群(existing)。
new:表示初始化新的 etcd 集群(初次部署)
existing:表示已有集群的成員(用于節點重啟或擴容)

3.?name: node3

分別為三個 etcd 節點指定唯一的名稱,后面用于集群識別。

4.?data-dir: /tmp/etcd3

數據存儲目錄,etcd會在此目錄保存所有數據

# 監聽peer通信的URL(集群節點間內部通信)
listen-peer-urls: http://127.0.0.1:4380# 監聽客戶端請求的URL(應用程序連接etcd的地址)
listen-client-urls: http://127.0.0.1:4379# 向集群其他節點宣告的peer通信地址
# 必須可從其他節點訪問,通常與listen-peer-urls一致
initial-advertise-peer-urls: http://127.0.0.1:4380# 向客戶端宣告的服務地址
# 必須可從客戶端訪問,通常與listen-client-urls一致
advertise-client-urls: http://127.0.0.1:4379# 初始集群配置(集群所有節點的通信地址)
initial-cluster: node1=http://127.0.0.1:2380,node2=http://127.0.0.1:3380,node3=http://127.0.0.1:4380

6.2?方法二:基于 discovery token 的動態發現(適合臨時集群)

簡單來說,方法二適合部署時不提前知道所有成員 IP 的情況。

這里的 discovery URL 每次使用都要新生成(不可復用)!

具體可以參考官方文檔,這里不多演示。

How to Set Up a Demo etcd Cluster | etcd

curl https://discovery.etcd.io/new?size=3
https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92# grab this token
TOKEN=token-01
CLUSTER_STATE=new
NAME_1=machine-1
NAME_2=machine-2
NAME_3=machine-3
HOST_1=10.240.0.17
HOST_2=10.240.0.18
HOST_3=10.240.0.19
DISCOVERY=https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
etcd --data-dir=data.etcd --name ${THIS_NAME} \--initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \--advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \--discovery ${DISCOVERY} \--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
etcd --data-dir=data.etcd --name ${THIS_NAME} \--initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \--advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \--discovery ${DISCOVERY} \--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
etcd --data-dir=data.etcd --name ${THIS_NAME} \--initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \--advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \--discovery ${DISCOVERY} \--initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}

現在 etcd 啟動了,開始測試吧!

export ETCDCTL_API=3
ENDPOINTS=127.0.0.1:2379,127.0.0.1:3379,127.0.0.1:4379etcdctl --endpoints=$ENDPOINTS endpoint status --write-out=table

可以看到,測試成功了,列出了所有節點。node1 是 leader,node2和node3是 follower。

6.3. 集群模式:Raft 共識算法

etcd 是一個 強一致性(strongly consistent) 的分布式鍵值存儲系統,但它不是傳統意義上的主從結構,而是基于 Raft 共識算法 構建的。

etcd 集群基于 Raft 算法,每個節點(member)在某一時刻的角色可能是以下之一:

角色含義
Leader當前集群的主節點,負責接收客戶端寫請求,并將數據復制給 Follower。整個集群 只能有一個 Leader
Follower普通成員節點,響應來自 Leader 的日志復制和心跳,不能單獨處理寫入。
Candidate

候選者,用于發起 Leader 選舉的過渡角色。

這個就解決了傳統主從集群模式下主節點宕機了,整個集群就不可用的問題。etcd 集群可以自動進行故障恢復,自動投票選出新的 master 節點。

etcd 的一致性模型是:

線性一致性(Linearizability):所有客戶端看到的順序與 Raft 日志順序一致。

也就是說:

  • 所有寫操作必須通過 Leader;

  • Leader 會將寫請求復制到多數派(超過半數)節點,才會被“提交”(解決了集群腦裂)

etcd(Raft)傳統主從
節點角色Leader + Follower + CandidateMaster + Slave
容錯方式多數節點存活即可服務(如 3 節點需 ≥2 存活)Master 掛了要人工或腳本切換
數據復制同步復制,多數派一致后才提交主寫從讀,通常異步復制
一致性強一致性(線性一致)最終一致性(可能存在延遲)

再看下之前的圖:

字段名稱說明示例值重要性
??ID??節點的唯一標識符(16進制格式)84724583e7fe06d8用于識別集群中的特定節點
??VERSION??etcd 服務器版本號3.5.21集群所有節點版本應一致
??DB SIZE??后端數據庫的物理大小20 kB監控存儲增長的關鍵指標
??IS LEADER??當前是否為領導者節點true/false集群健康關鍵指標(必須有且只有一個leader)
??IS LEARNER??是否為學習者節點(非投票成員)false學習者節點不參與選舉,用于災備或讀擴展
??RAFT TERM??當前任期號(每次選舉遞增)2數值越大表示集群經歷的領導選舉次數越多
??RAFT INDEX??當前最高日志條目索引號9表示寫入操作的序列號
??RAFT APPLIED INDEX??已應用到狀態機的最高日志索引9應與RAFT INDEX接近,差值大表示有未應用的操作
??ERRORS??節點錯誤信息(為空表示正常)``出現內容時表示節點異常

7. 其他功能特性

7.1 prefix 前綴

1. 通過 prefix 前綴查找 key

2. 通過 --preifx 刪除 key

etcdctl --endpoints=$ENDPOINTS put k1 value1
etcdctl --endpoints=$ENDPOINTS put k2 value2
etcdctl --endpoints=$ENDPOINTS del k --prefix

7.2 etcd 事務

因為 etcd 本身就是 raft 強一致性的中間件,保證了 CAP 理論里的 CP。etcd 無論單機還是集群都支持事務,它內部使用了 MVCC 多版本并發控制機制。

Redis 保證了 CAP 理論里的 AP,屬于最終一致性

Redis 通過 multi + watch 命令并?不能保障事務,Redis 官方文檔里說 Redis 設計就是為了高性能,一致性保障并不是最主要的。

  1. ??MULTI+WATCH?的缺陷??

    • 僅提供樂觀鎖(CAS),若?WATCH?的鍵被其他客戶端修改,事務會失敗。
    • 無回滾機制,失敗后需手動重試。

所以 Redis 里實現事務只能通過 Lua 腳本?來實現。

  1. ??Lua 腳本的原子性??

    • 雖然單線程執行 Lua 能保證原子性,但:不支持跨鍵事務(所有操作必須在同一個腳本中)
    • 也就是說 cluster 分片集群模式下,lua 腳本可能無法保障事務。

場景舉例:

你要同時更新一個用戶的郵箱和手機號

# 插入數據
etcdctl put /users/12345/email "old.address@johndoe.com"
etcdctl put /users/12345/phone "123-456-7890"
# 開啟事務
etcdctl txn --interactivecompares:
# 這里除了用value(),也可以使用version()版本號機制
value("/users/12345/email") = "old.address@johndoe.com"success requests (get, put, delete):
put /users/12345/email "new.address@johndoe.com"
put /users/12345/phone "098-765-4321"failure requests (get, put, delete):
get /users/12345/email

測試:?

1. Atomicity(原子性)

事務是原子的,要么所有操作都成功,要么一個都不執行。

只有 value("/users/12345/email") 等于?"old.address@johndoe.com"時,郵箱和手機號才會一起更新。 如果不是,則不會更新任何內容。

這保證了不會出現只更新了一半字段的尷尬情況

2.?Consistency(一致性)

3. 注意點:避免在同一事務中對同一個 key 多次 put

? 錯誤示例:

# compares:
value(counter) = "1"# success requests:
put counter 2
put counter 3   # 同一個事務里又對 counter 執行一次 put,會導致沖突或不可預期結果

這種情況雖然可能不會報錯,但有時你不知道最終會落哪個值。etcd 沒法保證順序處理多次對同一個 key 的寫入。

? 正確方式:

每個事務里對同一個 key 最多只能 put 一次。

7.3. watch 實時監聽 key

etcdctl watch stock1

7.4. 設置 lease 租約

類似 redis 的 TTL 機制,但更強大(支持一個 leaseID 多鍵綁定、續租等)。

# 1. 創建一個 TTL=300秒 的租約(返回 Lease ID)
etcdctl lease grant 300
→ lease 2be7547fbc6a5afa granted with TTL(300s)# 2. 將鍵值對 "sample=value" 綁定到這個租約
etcdctl put sample value --lease=2be7547fbc6a5afa# 3. 獲取鍵值對(此時可以正常讀取)
etcdctl get sample
→ sample
→ value# 4. 手動續租(保持 Lease 存活,即重置為300秒)
etcdctl lease keep-alive 2be7547fbc6a5afa# 5. 主動撤銷租約(立即刪除所有關聯的鍵)
etcdctl lease revoke 2be7547fbc6a5afa# 6. 等待 300秒后(或撤銷后),鍵值對自動消失
etcdctl get sample
→ (無輸出,鍵已被刪除)

7.5. 分布式鎖

# 客戶端1
etcdctl lock lock1# 客戶端2,此時會阻塞,直到客戶端1釋放鎖
etcdctl lock lock1

7.6. 健康檢測

etcdctl endpoint status (--endpoints=$ENDPOINTS|--cluster)etcdctl endpoint health (--endpoints=$ENDPOINTS|--cluster)

關于etcd的分享就到這里了。

我是此林,關注我吧,帶你看不一樣的世界!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86227.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenSSL 混合加密

openssl 中文網: https://www.openssl.net.cn/ 目錄 對稱加密特點常見算法案例(使用 AES) 非對稱加密特點常見算法案例(使用 RSA) 混合加密場景加密(使用 AES)解密 總結 對稱加密 特點 加密和解…

AI驅動的DevOps運維與云服務部署自動化

引言 當前,云計算和DevOps實踐讓開發者能夠管理成百上千臺服務器和容器,但隨之而來的運維復雜度也急劇提升。運維工程師經常需要部署多環境應用、維護大規模云主機、排查集群故障等任務。這些任務不僅涉及繁瑣的腳本編寫和命令行操作,還需要對…

Spring Boot動態數據源切換:優雅實現多數據源管理

在復雜的企業應用中,多數據源管理是常見需求。本文將介紹如何基于Spring Boot實現優雅的動態數據源切換方案,通過自定義注解和AOP實現透明化切換。 核心設計思路 通過三層結構實現數據源動態路由: 1. 注解層:聲明式標記數據源 2…

如何挑選一款1588PTP時鐘同步服務器?

在當今數字化程度極高的時代,高精度時間同步對于眾多關鍵領域的高效、穩定運行起著決定性作用。PTP(精確時間協議)時鐘作為實現高精度時間同步的核心設備,其性能優劣直接關乎系統整體表現。挑選一款合適的 ptp網絡同步時鐘&#x…

Harmony狀態管理 @Local和@Param

深入理解ArkUI中的Param與Local裝飾器 引言 在ArkUI的狀態管理系統中,Param和Local是兩個核心裝飾器,它們分別用于處理組件間的數據傳遞和組件內部狀態管理。本文將詳細介紹這兩個裝飾器的使用場景、特性差異以及最佳實踐。 Param裝飾器:組…

物聯網攝像頭模塊的應用場景

一、智慧城市治理 ?智能交通優化? ?動態信號控制?:杭州部署20萬物聯網攝像頭,實時分析車流密度并聯動1200個紅綠燈,早高峰通行效率提升40%。 ?違規行為識別?:搭載GB/T28181協議的攝像頭AI抓拍交通違章,車牌識…

k8s Ingress、Service配置各樣例大全

目錄 壹、k8s Ingress 樣例大全🔧 一、基礎路由與 TLS 終止🔄 二、高級路由控制1. **URL 重寫**(適用后端服務路徑與入口路徑不一致)2. **多路徑路由到不同服務** 🚦 三、流量治理策略1. **金絲雀發布(灰度…

領域驅動設計(DDD)【10】之DDD戰術模式:工廠模式與表意接口模式

文章目錄 引言:DDD戰術模式的重要性一、DDD中的工廠模式1.1 工廠模式的核心概念1.2 工廠模式的三種實現方式1.2.1 簡單工廠方法1.2.2 工廠類1.2.3 抽象工廠模式 1.3 工廠模式的適用場景1.4 實際案例:電商訂單系統 二、表意接口模式2.1 表意接口2.2 表意接…

鴻蒙ArkTS---登錄邏輯,數據持久化,ArkUI,網絡請求等基礎內容記錄

該內容是在【博學谷】學習過程中的代碼記錄,如有任何問題請與作者聯系。 也歡迎同在學習鴻蒙開發的小伙伴的留言,一同學習,一同進步。 功能實現(只記錄代碼,沒有相關配置,跑不起來)&#xff…

沒有公網ip可以實現跨網p2p互通嗎?內網讓公網直連訪問常用工具

沒有公網IP的情況下仍然可以實現P2P通信,但需要借助NAT穿透技術或類似nat123同端口映射等第三方工具實現內網穿透?。???? 一、什么是P2P通信? P2P網絡(Peer-to-Peer Network)是一種去中心化的網絡架構,其中每個…

云服務器安裝寶塔面板(BT Panel)

安裝寶塔面板(BT Panel)是很多服務器管理員常用的操作,尤其適合用于管理網站、數據庫、FTP等。以下是基于 Linux 系統(推薦 CentOS 或 Ubuntu)的寶塔面板安裝步驟。 安裝前準備 云服務器一臺 可以訂購服務器 海外云主…

mongoose解析http字段值

最近在使用mongoose開發嵌入式web后端時,會遇到要解析js前端發送過來的http消息,比如傳遞用戶名,密碼過來,后端要解析出來并判斷是否登錄成功。 前端http有兩種組裝字段的方式。 第一種是 $.ajax({url: /upgradePackage,method: P…

高德地圖地址解析獲取經緯度失敗原因JSAPI

高德地圖地址解析獲取經緯度失敗原因JSAPI 地圖加載的時候老是報異常碼,地圖是可以加載出來的,但是在地圖上的操作老是有異常碼,找了好久不知道什么問題,異常碼會報兩種,一種是說什么key的問題,但是我當時…

極速JavaScript:全面性能優化實戰指南

在現代Web開發中,JavaScript性能直接影響用戶體驗。一個優化良好的應用能帶來更流暢的交互、更快的加載速度和更低的資源消耗。本文將深入探討實用的JavaScript性能優化技術,幫助您打造高性能Web應用。 一、性能瓶頸分析與診斷工具 性能問題的常見來源&…

【開源模型】高考數學139分!小米MiMo開源模型:7B參數突出重圍

小米 MiMo:7 B 參數撬動推理巔峰,開源模型的技術突圍 70 億參數超越 320 億對手,高考數學 139 分的背后是訓練策略的全面革新。 2025 年 4 月 30 日,小米開源的首個推理大模型 Xiaomi MiMo-7 B 橫空出世,以??僅 7 B …

用vscode破解最新typora1.10.8

1.下載格式化插件防止打開文件一團亂 1)下載vscode: Download Visual Studio Code - Mac, Linux, Windows 2)vscode下載中文插件重啟 如果沒變中文,在vscode界面按下: ctrl shift p 調出命令行 再輸入&#xff…

在 CI/CD 流程中使用 Jenkins 與 Docker 集成

在 CI/CD 流程中,Jenkins 與 Docker 的集成可以實現自動構建、測試、打包、發布容器鏡像,并部署到測試/生產環境。下面是從概念到落地操作的完整集成方案。 一、常見的集成方式有哪些? 方式描述1?? Jenkins 主機安裝 DockerJenkins 可以直…

閑庭信步使用SV搭建圖像測試平臺:第十課——繼續說說類

(本系列只需要modelsim即可完成數字圖像的處理,每個工程都搭建了全自動化的仿真環境,只需要雙擊top_tb.bat文件就可以完成整個的仿真,大大降低了初學者的門檻!!!!如需要該系列的工程…

如何改進復雜推理 - 從提示詞設計入手

引言(動機) 在使用大語言模型(如 GPT-4、Claude、DeepSeek 等)構建智能問答、輔助決策或復雜任務代理系統時,可能遇到這些問題: 模型回答跳步驟、思路混亂同樣問題,模型表現高度不穩定新任務一…

如何解決和各個經銷商不同軟件對接的問題?湯臣案例分享

一、項目背景 湯臣倍健作為健康產品行業的領軍企業,其營銷云系統與全國經銷商 ERP 系統的數據無縫對接,對于提升業務運營效率和營銷精準度至關重要。傳統數據集成方法在面對經銷商 ERP 系統的多樣性和復雜性時,暴露出諸多問題,如…