python技術簡介(三)

jpx發表於2024-07-20

python直連etcd以及其應用:在 python 中,有幾個庫可以用於與 etcd 進行互動,其中最常用的是 etcd3python-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}')

相關文章