etcd-cpp-apiv3 二次封裝

接口介紹

頭文件

#include <etcd/Client.hpp>
#include <etcd/KeepAlive.hpp>
#include <etcd/Response.hpp>
#include <etcd/SyncClient.hpp>
#include <etcd/Value.hpp>
#include <etcd/Watcher.hpp>

下面從功能介紹幾個類的概念

Value :保存鍵值對的 key 和 value

Event:記錄鍵值對是否改變或者被刪除的狀態

Response :etcd 服務器向客戶端的響應
KeepAlive : 客戶端向 etcd 保活數據
Client? : 客戶端類
Watcher : 檢測 etcd 服務器上鍵值對是否發生改變
下面是接口
namespace etcd {
class Value {bool is_dir();//判斷是否是一個目錄std::string const& key() //鍵值對的 key 值std::string const& as_string()//鍵值對的 val 值int64_t lease() //用于創建租約的響應中,返回租約 ID
}
//etcd 會監控所管理的數據的變化,一旦數據產生變化會通知客戶端
//在通知客戶端的時候,會返回改變前的數據和改變后的數據
class Event {enum class EventType {PUT, //鍵值對新增或數據發生改變DELETE_,//鍵值對被刪除INVALID,};enum EventType event_type() const Value& kv()const Value& prev_kv()
} 
class Response {bool is_ok()std::string const& error_message()Value const& value()//當前的數值 或者 一個請求的處理結果Value const& prev_value()//之前的數值Value const& value(int index)//std::vector<Event> const& events();//觸發的事件
} 
class KeepAlive {KeepAlive(Client const& client, int ttl, int64_t lease_id = 
0);//返回租約 IDint64_t Lease();//停止保活動作void Cancel();
} 
class Client {// etcd_url: "http://127.0.0.1:2379"Client(std::string const& etcd_url,std::string const& load_balancer = "round_robin");//Put a new key-value pair 新增一個鍵值對pplx::task<Response> put(std::string const& key, std::string const& value);//新增帶有租約的鍵值對 (一定時間后,如果沒有續租,數據自動刪除)pplx::task<Response> put(std::string const& key, std::string const& value,const int64_t leaseId);//獲取一個指定 key 目錄下的數據列表pplx::task<Response> ls(std::string const& key);
//創建并獲取一個存活 ttl 時間的租約pplx::task<Response> leasegrant(int ttl);//獲取一個租約保活對象,其參數 ttl 表示租約有效時間pplx::task<std::shared_ptr<KeepAlive>> leasekeepalive(int 
ttl);//撤銷一個指定的租約pplx::task<Response> leaserevoke(int64_t lease_id);//數據鎖pplx::task<Response> lock(std::string const& key);
} 
class Watcher {Watcher(Client const& client, std::string const& key, //要監控的鍵值對 keystd::function<void(Response)> callback, //發生改變后的回調bool recursive = false); //是否遞歸監控目錄下的所有數據改變Watcher(std::string const& address, std::string const& key,std::function<void(Response)> callback, bool recursive = false);//阻塞等待,直到監控任務被停止bool Wait();bool Cancel();
}

二次封裝

????????設計兩個類?Register??Discover? ,Register? 用來向 etcd 服務器注冊鍵值對,它會向 etcd 服務器申請一個租約ID,負責數據保活。Discover?查看服務器鍵值對,并檢測鍵值對是否被改變或刪除。

? ? ? ??Register? 類只需封裝?Client?KeepAlive 類即可,通過KeepAlive 得到租約ID 并且向服務器不斷進行保活,Client?::put? 向 etcd 服務器添加或更改鍵值對。代碼如下

class Register
{public://構造,傳入 etcd 服務器地址Register(const std::string& url = "http://127.0.0.1:2379"):_client_ptr(std::make_shared<etcd::Client>(url)),_keep_alive_ptr(std::make_shared<etcd::KeepAlive>(*(_client_ptr.get()), 3)),_lease_id(_keep_alive_ptr->Lease()){}//析構,撤銷指定租約~Register(){_client_ptr->leaserevoke(_lease_id);}//向 etcd 添加服務void put(const std::string& key, const std::string& value){if(false == _client_ptr->put(key, value, _lease_id).get().is_ok()){LOG_ERROR("etcd 添加服務失敗 {} : {}", key, value);}else{LOG_INFO("etcd 添加服務成功 {} : {}", key, value);}}private:std::shared_ptr<etcd::Client> _client_ptr;          //客戶端實體  std::shared_ptr<etcd::KeepAlive> _keep_alive_ptr;   //保活int64_t _lease_id;                                  //租約ID
};  

????????Discover?封裝?Client?和?Watcher ,檢測 etcd 服務器鍵值對的變化。同時設置兩個回調函數當鍵值對改變時,調用回調函數。

class Discover
{using notify_callback = std::function<void(std::string, std::string)>;public://四個參數為: etcd 服務器地址, 根目錄, 服務添加回調,服務刪除回調Discover(std::string url, std::string base_dir, notify_callback put_cb, notify_callback del_cd):_client_ptr(std::make_shared<etcd::Client>(url)),_watcher_ptr(std::make_shared<etcd::Watcher>(*(_client_ptr.get()), base_dir, std::bind(&Discover::callback, this, std::placeholders::_1), true)),_put_cb(put_cb),_del_cb(del_cd){//ls查看根目錄下所有服務etcd::Response response = _client_ptr->ls(base_dir).get();if(false == response.is_ok()){LOG_ERROR("獲取服務失敗 {}", base_dir);}else{for(int i = 0; i < response.keys().size(); i++){if(_put_cb) _put_cb(response.value(i).key(), response.value(i).as_string());LOG_INFO("上線了 {} : {} 服務", response.value(i).key(), response.value(i).as_string());}}//監控根目錄下服務_watcher_ptr->Wait();}~Discover(){_watcher_ptr->Cancel();}private:void callback(const etcd::Response& resp){if(false == resp.is_ok()){LOG_ERROR("監控服務失敗" );return;}else{for(const etcd::Event& ev : resp.events()){if(ev.event_type() == etcd::Event::EventType::PUT){LOG_INFO("服務發生改變 {} : {} ---> {} : {}", ev.prev_kv().key(), ev.prev_kv().as_string(), ev.kv().key(), ev.kv().as_string());if(_put_cb) _put_cb(ev.kv().key(), ev.kv().as_string());}else if(ev.event_type() == etcd::Event::EventType::DELETE_){LOG_INFO("下線了服務 {} : {}", ev.prev_kv().key(), ev.prev_kv().as_string());if(_del_cb) _del_cb(ev.prev_kv().key(), ev.prev_kv().as_string());}}            }}private:std::shared_ptr<etcd::Client> _client_ptr;          //客戶端實體  std::shared_ptr<etcd::Watcher> _watcher_ptr;        //監控服務notify_callback _put_cb;notify_callback _del_cb;
};

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

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

相關文章

【網絡與系統安全】強制訪問控制——Biba模型

一、模型定義與目標 提出背景&#xff1a;1977年由Ken Biba提出&#xff0c;是首個完整性安全模型&#xff0c;與BLP模型形成對偶&#xff08;BLP關注機密性&#xff0c;Biba關注完整性&#xff09;。核心目標&#xff1a;防止低完整性信息污染高完整性信息&#xff0c;避免未授…

從架構抽象到表達范式:如何正確理解系統架構中的 4C 模型20250704

&#x1f9e9; 從架構抽象到表達范式&#xff1a;如何正確理解系統架構中的 4C 模型&#xff1f; “4C”到底是架構的組成結構&#xff0c;還是架構圖的表現方式&#xff1f;這類看似細節的問題&#xff0c;其實直擊了我們在系統設計中認知、表達與落地之間的張力。 &#x1f5…

Debian10安裝Mysql5.7.44 筆記250707

Debian10安裝Mysql5.7.44 筆記250707 1?? 參考 1 在Debian 10 (Buster) 上安裝 MySQL 5.7.44 的步驟如下&#xff1a; 1. 添加 MySQL APT 倉庫 MySQL 官方提供了包含特定版本的倉庫&#xff1a; # 下載倉庫配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.28…

20250706-6-Docker 快速入門(上)-鏡像是什么?_筆記

一、鏡像是什么&#xfeff;1. 一個分層存儲的文件&#xff0c;不是一個單一的文件分層結構: 與傳統ISO文件不同&#xff0c;Docker鏡像由多個文件組成&#xff0c;采用分層存儲機制存儲優勢: 每層可獨立復用&#xff0c;顯著減少磁盤空間占用&#xff0c;例如基礎層可被多個鏡…

[SystemVerilog] Clocking

SystemVerilog Clocking用法詳解 SystemVerilog 的 clocking 塊&#xff08;Clocking Block&#xff09;是一種專門用于定義信號時序行為的構造&#xff0c;主要用于驗證環境&#xff08;如 UVM&#xff09;中&#xff0c;以精確控制信號的采樣和驅動時序。clocking 塊通過將信…

kong網關基于header分流灰度發布

kong網關基于header分流灰度發布 在現代微服務架構中&#xff0c;灰度發布&#xff08;Canary Release&#xff09;已經成為一種常用且安全的上線策略。它允許我們將新版本的功能僅暴露給一小部分用戶&#xff0c;從而在保證系統穩定性的同時收集反饋、驗證效果、規避風險。而作…

Go語言gin框架原理

在gin框架中&#xff0c;最關鍵的就是前綴樹&#xff0c;是很重要的。gin框架本質上是在http包的基礎之上&#xff0c;對其的一個二次封裝。這里借鑒一下小徐先生的圖&#xff0c;可能當前版本的gin可能內容有所改變&#xff0c;但大致思想還是這樣。gin框架所做的就是提供一個…

4、Sending Messages

本節介紹如何發送消息。Using KafkaTemplate本節介紹如何使用KafkaTemplate發送消息。OverviewKafkaTemplate封裝了一個生產者&#xff0c;并提供了向Kafka主題發送數據的便利方法。以下列表顯示了KafkaTemplate的相關方法&#xff1a;CompletableFuture<SendResult<K, V…

CSS長度單位問題

在 CSS 中&#xff0c;100px 的邏輯長度在不同分辨率的手機屏幕上是否表現一致&#xff0c;取決于 設備的像素密度&#xff08;devicePixelRatio&#xff09; 和 視口&#xff08;viewport&#xff09;的縮放設置。以下是詳細分析&#xff1a;1. 核心概念 CSS 像素&#xff08;…

基于Java+SpringBoot的圖書管理系統

源碼編號&#xff1a;S606源碼名稱&#xff1a;基于SpringBoot的圖書管理系統用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員數據庫表數量&#xff1a;12 張表主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven運行環境&#xff1a;Windows/Mac、JDK1.8及以…

XTOM工業級藍光三維掃描儀用于筆記本電腦背板模具全尺寸檢測

鎂合金具有密度小、強度高、耐腐蝕性好等優點&#xff0c;成為筆記本電腦外殼主流材料。沖壓模具作為批量生產筆記本電腦鎂合金背板的核心工具&#xff0c;其精度直接決定了產品的尺寸一致性、結構可靠性與外觀品質。微米級模具誤差可能在沖壓過程中被放大至毫米級&#xff08;…

運維打鐵: MongoDB 數據庫集群搭建與管理

文章目錄思維導圖一、集群基礎概念1. 分片集群2. 副本集二、集群搭建1. 環境準備2. 配置副本集步驟 1&#xff1a;修改配置文件步驟 2&#xff1a;啟動 MongoDB 服務步驟 3&#xff1a;初始化副本集3. 配置分片集群步驟 1&#xff1a;配置配置服務器副本集步驟 2&#xff1a;啟…

HCIP-Datacom Core Technology V1.0_5 OSPF特殊區域及其他特性

在前面的章節中&#xff0c;OSPF可以劃分區域&#xff0c;減輕單區域里面LSDB的規模&#xff0c;從而減輕路由器的負荷&#xff0c;雖然OSPF能夠劃分區域&#xff0c;但是依舊需要維護域間路由和外部路由&#xff0c;這樣隨著網絡規模的不斷擴大&#xff0c;路由器所維護的LSDB…

實時開發IDE部署指南

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xff…

深入解析 RAGFlow:文件上傳到知識庫的完整流程

在 RAGFlow 這樣的檢索增強生成&#xff08;RAG&#xff09;系統中&#xff0c;知識庫是其核心。用戶上傳的文檔如何高效、可靠地轉化為可檢索的知識&#xff0c;是系統穩定運行的關鍵。今天&#xff0c;我們就來深入探討 RAGFlow 中文件上傳到知識庫的完整流程&#xff0c;揭秘…

cad_recognition 筆記

Hubch/cad_recognition | DeepWiki https://github.com/Hubch/cad_recognition winget install python.python.3.10 python -m venv venv micromamba activate ./venv pip install paddleocr2.9.0 pip install poetry pip install moviepy1.0.3 下次要用conda建環境 或者…

基于odoo17的設計模式詳解---構建模式

大家好&#xff0c;我是你的Odoo技術伙伴。在Odoo開發中&#xff0c;創建一個簡單的記錄可能只需要一行 self.env[res.partner].create({name: New Partner})。但如果我們要創建一個復雜的對象&#xff0c;比如一個包含了特定上下文、具有多個可選配置、并且需要執行一系列關聯…

暑假算法日記第四天

目標?&#xff1a;刷完靈神專題訓練算法題單 階段目標&#x1f4cc;&#xff1a;【算法題單】滑動窗口與雙指針 LeetCode題目:2953. 統計完全子字符串1016. 子串能表示從 1 到 N 數字的二進制串其他: 今日總結 往期打卡 2953. 統計完全子字符串 跳轉: 2953. 統計完全子字符串…

Linux 常用命令大全(2025簡明版)

&#x1f9ed; 一、文件和目錄操作命令說明ls列出目錄內容ls -l以列表形式顯示&#xff08;含權限&#xff09;cd /path切換目錄pwd顯示當前路徑mkdir dir創建目錄mkdir -p dir/subdir遞歸創建目錄rm file刪除文件rm -r dir刪除目錄&#xff08;遞歸&#xff09;rm -rf dir強制…

React Ref 指南:原理、實現與實踐

前言 React Ref&#xff08;引用&#xff09;是React中一個強大而重要的概念&#xff0c;它為我們提供了直接訪問DOM元素或組件實例的能力。雖然React推崇聲明式編程和數據驅動的理念&#xff0c;但在某些場景下&#xff0c;我們仍需要直接操作DOM或訪問組件實例。本文將深入探…