python直連etcd以及其應用:在 python 中,有幾個庫可以用於與 etcd 進行互動,其中最常用的是 etcd3
和 python-etcd
。
1、etcd3的介紹
# 安裝 pip install etcd3 # 方法 # 連線到 etcd 伺服器 etcd3.client(host, port) # 設定鍵值 put(key, value) # 獲取鍵值 get(key) # 刪除鍵值 delete(key) # 獲取以指定字首開頭的所有鍵值 get_prefix(prefix) # 刪除以指定字首開頭的所有鍵值 delete_prefix(prefix) # 監聽鍵值變化 watch(key)
應用場景-服務註冊與發現:服務註冊是指服務例項在啟動時,將自己的網路地址(IP 和埠)註冊到服務註冊中心(如 etcd)。註冊中心維護了一個服務例項的目錄,客戶端可以透過查詢註冊中心來發現可用的服務例項。服務發現是指客戶端從服務註冊中心獲取可用的服務例項列表,以便進行請求路由。當某個服務例項不可用或增加新的例項時,服務註冊中心會相應地更新註冊資訊。
詳細業務步驟
-
服務啟動時註冊
- 服務例項啟動時,將自身的網路地址(IP 和埠)註冊到 etcd 中。
- 服務例項使用一個唯一的服務 ID 進行註冊,以便後續管理。
-
服務發現
- 客戶端查詢 etcd 獲取可用的服務例項列表。
- 客戶端根據獲取的服務例項資訊進行負載均衡和請求路由。
我們現在可以使用 etcd3 庫,實現來為我們的 my_service
的服務進行服務註冊和發現。
import etcd3 import socket import uuid def register_service(service_name, host, port): etcd = etcd3.client() service_id = str(uuid.uuid4()) key = f'/services/{service_name}/{service_id}' value = f'{host}:{port}' etcd.put(key, value) print(f'Service {service_name} registered with ID {service_id} at {host}:{port}') return service_id def unregister_service(service_name, service_id): etcd = etcd3.client() key = f'/services/{service_name}/{service_id}' etcd.delete(key) print(f'Service {service_name} unregistered with ID {service_id}') # 獲取本機IP地址 hostname = socket.gethostname() host_ip = socket.gethostbyname(hostname) # 註冊服務 service_id = register_service('my_service', host_ip, 8080) # 停止服務時取消註冊 # unregister_service('my_service', service_id) def discover_services(service_name): etcd = etcd3.client() instances = etcd.get_prefix(f'/services/{service_name}') services = [] for value, metadata in instances: service_info = value.decode('utf-8') services.append(service_info) return services # 發現服務 services = discover_services('my_service') print(f'Discovered services: {services}')