Ubuntu22.04 - etcd的安装和使用

news/2025/2/22 5:28:08

目录

  • 介绍
  • 安装Etcd
  • 安装etcd的客户端
  • 使用

介绍

Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接watch 功能,能够及时收到数据变化通知,相较于 Zookeeper 框架更加轻量化。以下是关于 etcd 的安装与使用方法的详细介绍。

安装Etcd

Etcd 是一个分布式键值存储,通常用于服务发现和配置管理。
1.安装Etcd
sudo apt-get install etcd
2.节点配置
vi /etc/default/etcd
这是服务器监听的地址
在这里插入图片描述
在这里插入图片描述
3.启动etcd服务
systemctl start etcd
4. 运行验证
etcdctl put mykey "this is awesome"
如果出现报错:
在这里插入图片描述
则 vi /etc/profile在末尾声明环境变量ETCDCTL_API=3以确定etcd版本
在这里插入图片描述
完毕后, 加载配置文件source /etc/profile, 并重新执行测试指令
在这里插入图片描述

etcd_25">安装etcd的客户端

etcd-cpp-apiv3: etcd-cpp-apiv3 是一个 etcd 的 C++版本客户端 API。它依赖于 mipsasm, boost, protobuf, gRPC, cpprestsdk 等库。

依赖安装:
sudo apt-get install libboost-all-dev libssl-dev
sudo apt-get install libprotobuf-dev protobuf-compiler-grpc
sudo apt-get install libgrpc-dev libgrpc++-dev
sudo apt-get install libcpprest-dev

去github上下载https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3.git
在这里插入图片描述
依次执行:
unzip etcd-cpp-apiv3-master.zip
cd etcd-cpp-apiv3-master
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make -j$(nproc) && sudo make install

使用

示例:
put.cc文件

#include <etcd/Client.hpp>
#include <etcd/KeepAlive.hpp>
#include <etcd/Response.hpp>
#include <thread>

int main(int argc, char* argv[])
{
    std::string etcd_host = "http://127.0.0.1:2379";
    // 实例化客户端对象
    etcd::Client client(etcd_host);


    // 获取/创建租约保活对象 -- 能指定有效时长的租约
    auto keep_alive = client.leasekeepalive(3).get();
    //leasekeepalive会创建一个keepalive对象(创建对象的时候, 会自动有一个ID)
    //为什么还要get? pplx::task<std::shared_ptr<KeepAlive>> leasekeepalive(int ttl); 返回一个task, task取到里面的类型需要用get
    //auto 的类型为智能指针

    // 获取租约ID
    auto lease_id = keep_alive->Lease();
    // 向etcd新增数据
    auto resp = client.put("/service/user", "127.0.0.1:8080", lease_id).get();//pplx::task<Response> put(...)
    /*
    class Response{
        bool is_ok()
        std::string const& error_message()
        Value const& value()//当前的数值 或者 一个请求的处理结果
        Value const& prev_value()//之前的数值
        Value const& value(int index)
    };
    */
    if(resp.is_ok() == false) {
        std::cout << "新增数据失败: " << resp.error_message() << std::endl;
        return -1;
    }
    //keepalive会和etcd服务端建立长连接, 创建一个ID, 并一直发送心跳包, 发送ttl秒, 然后客户端拿着这个ID去put, 这样就建立起了联系
    //如果服务器没接收到心跳包了, 则会将有这个ID的数据删除

    auto resp2 = client.put("/service/friend", "127.0.0.1:9090").get();
    if (resp2.is_ok() == false) {
        std::cout << "新增数据失败: " << resp2.error_message() << std::endl;
        return -1;
    }

    std::this_thread::sleep_for(std::chrono::seconds(10)); //阻塞休息10s
    return 0;
}

get.cc文件

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

void callback(const etcd::Response& resp){
    if (resp.is_ok() == false) {
        std::cout << "收到一个错误的事件通知:" << resp.error_message() << std::endl;
        return;
    }
    for (auto const& ev : resp.events()) {
        if (ev.event_type() == etcd::Event::EventType::PUT) {
            std::cout << "服务信息发生了改变:\n";
            std::cout << "当前的值: " << ev.kv().key() << "-" << ev.kv().as_string() << std::endl;
            std::cout << "原来的值: " << ev.prev_kv().key() << "-" << ev.prev_kv().as_string() << std::endl;
        } else if (ev.event_type() == etcd::Event::EventType::DELETE_) {
            std::cout << "服务信息下线被删除:\n";
            std::cout << "当前的值: " << ev.kv().key() << "-" << ev.kv().as_string() << std::endl;
            std::cout << "原来的值: " << ev.prev_kv().key() << "-" << ev.prev_kv().as_string() << std::endl;
        }
    }
}

int main(int argc, char* argv[])
{
    std::string etcd_host = "http://127.0.0.1:2379";
    // 实例化客户端对象
    etcd::Client client(etcd_host); //pplx::task<Response> ls


    // 获取制定的键值对信息
    auto resp = client.ls("/service").get();            //key也分为目录     key1/a/111    key1/b/111  key/a/111/222
    if (resp.is_ok() == false) {
        std::cout << "获取键值对数据失败: " << resp.error_message() << std::endl;
        return -1;
    }

    int sz = resp.keys().size();
    for (int i = 0; i < sz; ++i) {
        std::cout << resp.value(i).as_string() << "可以提供" << resp.key(i) << "服务\n";
    }
    // 实例化一个键值对事件监控对象
    auto watcher = etcd::Watcher(client, "/service", callback, true);
    watcher.Wait();     //会一直循环
    return 0;
}

运行:
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5861628.html

相关文章

【MySQL】第八弹---全面解析数据库表的增删改查操作:从创建到检索、排序与分页

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1 表的增删改查 1.1 Create 1.1.1 单行数据 全列插入 1.1.2 多行数据 指定列插入 1.1.3 插入否则更新 1.1.4 替…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

Spring Boot 入门 与 无法解析符号 springframework 的解决

Spring Boot 入门的关键步骤 1 创建 Maven 工程 操作目的&#xff1a; 通过 Maven 工程来管理项目依赖&#xff0c;Spring Boot 本身就依赖 Maven 或 Gradle 来简化依赖管理。 操作方法&#xff1a; 打开 IDEA&#xff08;IntelliJ IDEA&#xff09;。点击 New Project&#…

索引的优缺点与常见类型详解

索引是数据库优化的核心工具&#xff0c;但盲目使用可能适得其反。本文将系统梳理索引的缺点、常见类型及适用场景&#xff0c;助你避开常见陷阱。 一、索引的缺点 虽然索引能加速查询&#xff0c;但并非“免费午餐”&#xff0c;需警惕以下代价&#xff1a; 1. 存储空间开销…

机器视觉3D中,深度图与点云图数据对比分析

在机器视觉3D中,深度图(Depth Map)和点云图(Point Cloud)是两种不同的数据表示形式,主要区别如下: 数据维度与结构 深度图 二维矩阵:每个像素存储对应场景中某一点的深度值(即到相机的距离)。 坐标系:基于图像坐标系(2D),每个像素的坐标是 (u, v),对应的深度值为…

网络安全:DeepSeek已经在自动的挖掘漏洞

大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…

【Java 优选算法】位运算

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 基础位运算符: &: 有 0 就是 0 | : 有 1 就是 1 ^ :相同为0,相异为1(无进位相加) 1.给一个数 n, 确定它的二进制表示中的第x位是 0 还是 1 . 使用公式(n >> x) &…

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…