Ubuntu22.04 - etcd的安装和使用

目录

  • 介绍
  • 安装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的客户端

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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973770.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对学习编程语言的一些理解

目录 一、代码运行的过程 二、跨平台的实现 1&#xff09;C/C 2&#xff09;C# 3&#xff09;Java 三、总结 一、代码运行的过程 开发程序无论使用何种编程语言&#xff0c;至少都需要经历编码、编译、连接和运行这么4个过程&#xff0c;C语言是这样&#xff0c;Java语言…

【知识】深度学习中,应该先zero_grad还是先backward?

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 抛出问题 各大GPT的回答 ChatGPT-4o ChatGPT-o3-mini-high Kimi-长思考 Deepseek-R1 Grok3 Pytorch官方教程中 抛出问题 以下哪种方式是…

kafka消费能力压测:使用官方工具

背景 在之前的业务场景中&#xff0c;我们发现Kafka的实际消费能力远低于预期。尽管我们使用了kafka-go组件并进行了相关测试&#xff0c;测试情况见《kafka-go:性能测试》这篇文章。但并未能准确找出消费能力低下的原因。 我们曾怀疑这可能是由我的电脑网络带宽问题或Kafka部…

蓝桥云客 路径之谜

11.路径之谜 - 蓝桥云课 路径之谜 题目描述 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是nn个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&…

Oracle 深入理解Lock和Latch ,解析访问数据块全流程

Oracle 锁机制介绍 根据保护对象的不同&#xff0c;单实例Oracle数据库锁可以分为以下几大类&#xff1a; DML lock&#xff08;data locks&#xff0c;数据锁&#xff09;&#xff1a;用于保护数据的完整性&#xff1b; DDL lock&#xff08;dictionary locks&#xff0c;字典…

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…

DOS网络安全

ping -t 不间断地ping目标主机&#xff0c;直到用户用ctrlc键强行终止。经常用来排除网络故障 -l 定制ping信息包的容量,最大上限是65500字节 -n 向远程主机发送的数据 包个数&#xff0c;默认是4。 语法&#xff1a; ping 参数 IP地址 netstat -a 显示所有连接…

QML Component 与 Loader 结合动态加载组件

在实际项目中&#xff0c;有时候我们写好一个组件&#xff0c;但不是立即加载出来&#xff0c;而是触发某些条件后才动态的加载显示出来&#xff0c;当处理完某些操作后&#xff0c;再次将其关闭掉&#xff1b; 这样的需求&#xff0c;可以使用 Component 包裹着组件&#xff…

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键&#xff0c;主要涉及到两个方面&#xff1a;确保 F1 键作为标准功能键工作 和 在 Snipaste 中设置 F1 为快捷键。 因为 Mac 默认情况下&#xff0c;F1-F12 键通常用作控制屏幕亮度、音量等系统功能的快捷键…

vue3学习1

vite是新的官方构建工具&#xff0c;构建速度比webpack更快 vue项目的入口文件是index.html&#xff0c;一般在这里引入src/main.js&#xff0c;并且设置好容器#app App.vue放的是根组件&#xff0c;components里放分支组件 vue组件中写三种标签&#xff0c;template & s…

istio实现灰度发布,A/B发布, Kiali网格可视化(二)

代码发布是软件开发生命周期中的一个重要环节&#xff0c;确保新功能和修复能够顺利上线。以下是几种常见的代码发布流程。在学习灰度发布之前。我们首先回忆下代码发布常用的几种方法。 A/B&#xff08;蓝绿&#xff09;发布&#xff1a; 蓝绿部署是一种通过维护两套独立的环…

MySQL日志undo log、redo log和binlog详解

MySQL 日志&#xff1a;undo log、redo log、binlog 有什么用&#xff1f; 一、前言 在MySQL数据库中&#xff0c;undo log、redo log和binlog这三种日志扮演着至关重要的角色&#xff0c;它们各自承担着不同的功能&#xff0c;共同保障了数据库的正常运行和数据的完整性。了解…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…

电力通信物联网应用,国密网关守护电力数据安全

电力国密网关是用于保护电力调度数据网路由器和电力系统的局域网之间通信安全的电力专用网关机&#xff0c;主要为上下级控制系统之间的广域网通信提供认证与加密服务&#xff0c;实现数据传输的机密性、完整性。 国密算法网关功能特点 身份认证&#xff1a;对接入的设备和用户…

overflow-x: auto 使用鼠标实现横向滚动,区分触摸板和鼠标滚动事件的方法

假设一个 div 的滚动只设置了 overflow-x: auto 我们发现使用鼠标的滚轮是无法左右滚动的&#xff0c;但是使用笔记本电脑的触摸板&#xff0c;或者在移动设备上是可以滚动的。所以我们需要兼容一下鼠标的横向滚动功能。 我们可以监控 wheel 事件&#xff0c;然后根据位置来计…

基于STM32单片机的智能蔬菜大棚温湿度监测系统设计

引言 在现代农业生产中&#xff0c;温湿度、光照强度和土壤湿度等环境因素对植物的生长起着至关重要的作用。智能蔬菜大棚正是基于这些因素&#xff0c;通过自动化控制和远程监控技术&#xff0c;实现对植物生长环境的精准管理&#xff0c;最终提升蔬菜的产量和质量。本文介绍…

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

新一代MPP数据库:StarRocks

文章目录 1.StarRocks简介2.StarRocks 在数据生态的定位3.StartRocks的使用场景3.1 实时数据仓库3.2 高并发查询3.3 日志与事件分析3.4 物联网&#xff08;IoT&#xff09;数据分析3.5 金融风控与实时监控3.6 数据湖查询加速3.7 A/B 测试与实验分析 4.StarRocks与MySQL比较4.1 …

利用 OpenCV 进行棋盘检测与透视变换

利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域&#xff0c;棋盘检测与透视变换是一个常见的任务&#xff0c;广泛应用于 摄像机标定、文档扫描、增强现实&#xff08;AR&#xff09; 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测&#xff0c;并…