『亚马逊云科技产品测评』活动征文| 基于etcd实现服务发现

提示:授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道

背景

etcd 是一个分布式 Key-Value 存储系统,它具有高度可用、一致性和高可靠性等特点。它可以帮助分布式系统实现数据存储、同步和管理等功能。在很多场景中,etcd 都可以发挥重要作用。今天我们就在服务器上安装和配置下etcd,可以让我们以后更好的在云环境中构建和管理分布式系统。

环境准备

这里我们部署在云服务器上去。首先需要创建一个云服务器实例。这里我们以亚马逊云服务器为例。

首先我们登录到AWS网站上,进入到AWS管理控制台。

从最近访问中点击Lightsail,进入Lightsail控制台。

在这里插入图片描述

创建一个Lightsail服务实例是很简单的,我们只需要按以下步骤执行就可以:

  • 选择实例地区
  • 选择实例镜像
  • 配置实例秘钥
  • 选择实例计划
  • 定义实例名称

上面步骤的大部分我们都可以使用默认项,除非你要特别的需求。我们主要需要设置的只有实例的镜像及实例的计划。

我这里其他项都选择使用默认项,主要也只配置了镜像及计划。

在这里插入图片描述
实例计划这里,AWS对新用户有免费使用的额度。可以免费使用3个月的Lightsail服务,只有标记了“First 3 months free”才能免费使用,我还是新用户,这里我选择最高免费额度的计划。

在这里插入图片描述
点击创建之后,我们就创建好了一个实例。
在这里插入图片描述

etcd安装

官方文档:https://etcd.io/docs/,学习的时候,官方文档永远是首选

etcd在生产环境中一般推荐集群方式部署,三个节点的集群就可以实现高可用。我们这里只是安装使用演示,所以主要是单节点的安装和使用。

安装预构建的二进制文件

我们从 https://github.com/etcd-io/etcd/releases/ 下载v3.5.0压缩存档文件。

我们执行下面的命令下载etcd

wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gztar -zvxf etcd-v3.5.0-linux-amd64.tar.gz  sudo mv etcd-v3.5.0-linux-amd64 /opt/etcd-3.5.0

我们进入到安装的目录看下解压后的文件

在这里插入图片描述
其中etcd是server端,etcdctl是客户端,操作之后会生成一个default.etcd,主要用来存储etct数据。

启动一个单节点的etcd服务,只需要运行etcd命令就行。

我们在当前目录下运行以下命令

./etcd 

启动成功后,出现如下所以:
在这里插入图片描述

从上面的截图中我们可以看到启动节点的名称默认为default。

data-dir 保存日志和快照的目录,默认为当前工作目录default.etcd/目录下。

我们采用这种方式启动的etcd只是一个程序,如果启动etcd的窗口被关闭的话则etcd便会被关闭

所以接下来我们使用systemctl 来管理启动etcd服务

使用systemctl 来管理启动etcd服务

1、建立相关目录

sudo mkdir -p /opt/etcd-3.5.0/config/

2、创建配置文件 /opt/etcd-3.5.0/config/etcd.conf.yml

# 节点名称
name: 'etcd-node'# 数据目录
data-dir: /opt/etcd-3.5.0/etcd-data# 快照设置
snapshot-count: 10000# 心跳间隔
heartbeat-interval: 100# 通讯和客户端监听地址
listen-peer-urls: http://0.0.0.0:2380
listen-client-urls: http://0.0.0.0:2379# 初始集群配置
initial-advertise-peer-urls: http://0.0.0.0:2380
initial-cluster: etcd-node=http://0.0.0.0:2380
initial-cluster-token: etcd-cluster-1
initial-cluster-state: new# 启用详细日志
log-level: debug
log-dir: /opt/etcd-3.5.0/logs
log-file: etcd.log
log-max-size: 100
log-backups: 3
log-format: text# 压缩设置
auto-compaction-mode: periodic
auto-compaction-retention: "1"

3、创建systemed配置文件 /etc/systemd/system/etcd.service

[Unit]
Description=etcd key-value store
Documentation=https://etcd.io/docs/
After=network.target[Service]
CPUAccounting=true
MemoryAccounting=true
CPUQuota=200%
MemoryLimit=1G
Type=notify
ExecStart=/opt/etcd-3.5.0/etcd  --config-file=/opt/etcd-3.5.0/config/etcd.conf.yml
Restart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target

我们创建好文件之后,我们重新加载 systemd 单元文件
启动etcd,并且检查下etcd的状态

sudo systemctl daemon-reloadsudo systemctl start etcdsudo systemctl status etcd

在这里插入图片描述

使用etcd

etcd为我们提供提供了一个命令行客户端—etcdctl,供用户直接跟etcd服务打交道,而无需基于 HTTP API方式。可以方便我们在对服务进行测试或者手动修改数据库内容。我们刚才查看etcd目录中也看到etcdctl

我们可以运行 ./etcdctl -h 查看 etcdctl的用法

在这里插入图片描述
etcd在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),我们可以指定键为单独的名字比如:test,也指定为目录结构如:/test/info
在这里插入图片描述

服务注册与发现

在ETCD中,每个服务都可以在ETCD中存储自己的注册信息,包括服务的名称、IP地址和端口号等。其他服务可以通过查询ETCD来获取这些注册信息,从而找到并连接其他服务。这种服务注册和发现的方式可以帮助我们构建高可用的分布式系统。

下面我们就使用PHP语言来实现下:

首先我们先安装了etcd的PHP客户端库。可以使用Composer安装

composer require start-point/etcd-php

创建Service类:

创建一个Service类,EtcdService.php,并在其中添加服务注册和发现的方法:

<?phpnamespace app\common\service;use Etcd\Client;class EtcdService
{private $etcdServer;private $client;public function __construct($etcdServer){$this->etcdServer = $etcdServer;$this->client = new Client($this->etcdServer);}public function registerService($serviceName, $serviceAddress){$this->client->put("/services/$serviceName", $serviceAddress);return "Service registered: $serviceName at $serviceAddress";}public function discoverService($serviceName){$response = $this->client->get("/services/$serviceName");$serviceAddress = $response['kvs'][0]['value'];return "Service discovered: $serviceName at $serviceAddress";}
}

在Controller中使用:

<?phpnamespace app\controller;use app\BaseController;
use app\common\service\EtcdService;class Index extends BaseController
{public function register(){// 这里的地址换成你的etcd$etcdService = new EtcdService('http://localhost:2379');$result = $etcdService->registerService('my-service', 'http://localhost:8080');return $result;}public function discover(){$etcdService = new EtcdService('http://localhost:2379');$result = $etcdService->discoverService('my-service');return $result;}}

我们访问下,可以看到已经写入和访问了

在这里插入图片描述
在这里插入图片描述

这里只是一个很基本的示例,实际中我们需要更好的代码结构和错误处理

总结

在本文中我们介绍了如何使用Lightsail在云服务器上快速的安装etcd和简单的使用,使用Lightsail我们可以快速的构建一个测试环境。
这里只介绍了使用预购建的二进制文件安装,其实我们可以通过Docker容器更加轻松的部署etcd,这个等以后有时间在写

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地址定位不准确的情况研究

在互联网的浩瀚海洋中&#xff0c;每一台连接到网络的设备都被赋予了一个独特的标识符&#xff0c;这就是IP地址。它就像是我们在线身份的一部分&#xff0c;帮助我们与他人进行通信&#xff0c;获取信息&#xff0c;以及享受各种网络服务。然而&#xff0c;由于各种原因&#…

【LVS实战】04 LVS+Keepalived实现负载均衡高可用

一、介绍 Keepalived 是一个用于 Linux 平台的高可用性软件。它实现了虚拟路由器冗余协议 (VRRP) 和健康检查功能&#xff0c;可以用于确保在多台服务器之间提供服务的高可用性。Keepalived 可以检测服务器的故障&#xff0c;并在主服务器宕机时&#xff0c;自动将备份服务器提…

哈希表及其基础(java详解)

目录 一、哈希表基础 二、哈希函数的设计 哈希函数的设计原则 三、java中的hashCode 基本数据类型的hashCode使用 自定义类型的hashCode使用 需要注意 四、哈希冲突的处理 链地址法Seperate Chaining 五、实现属于我们自己的哈希表 六、哈希表的动态空间处理和复杂…

10、外观模式(Facade Pattern,不常用)

外观模式&#xff08;Facade Pattern&#xff09;也叫作门面模式&#xff0c;通过一个门面&#xff08;Facade&#xff09;向客户端提供一个访问系统的统一接口&#xff0c;客户端无须关心和知晓系统内部各子模块&#xff08;系统&#xff09;之间的复杂关系&#xff0c;其主要…

vscode插件离线下载

离线下载插件地址&#xff1a;https://marketplace.visualstudio.com/VSCode

SQL server 基线安全加固操作

目录 账号管理、认证授权 ELK-Mssql-01-01-01 ELK-Mssql-01-01-02 ELK-Mssql-01-01-03 ​​​​​​​ ELK-Mssql-01-01-04 ​​​​​​​ ELK-Mssql-01-01-05 ​​​​​​​ELK-Mssql-01-01-06 日志配置 ELK-Mssql-02-01-01 通信协议 ELK-Mssql-03-01-01 ​​​​​…

【i.MX6ULL】linux驱动bh1750模块

I2C-BH1750 1、设备地址 引脚说明 VCC5VGNDGNDSCLPB6SDAPB7ADDRVCC/GND bh1750设备的地址由引脚 ADDR 来决定 ADDR接GND 当ADDR引脚接地时设备bh1750的地址为&#xff1a;0x23(7bit) ADDR接VCC 当ADDR引脚接地时设备bh1750的地址为&#xff1a;0x5c(7bit) 2、工作模式 …

基于深度学习CRNN的水表读数识别系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着科技的不断发展&#xff0c;深度学习技术在各个领域都取得了显著的成果。其中&#xff0c;基于深度学习的图像识别技术在计算机视觉领域具有重要的应用价值。…

Linux 多线程(C语言) 备查

基础 1&#xff09;线程在运行态和就绪态不停的切换。 2&#xff09;每个线程都有自己的栈区和寄存器 1&#xff09;进程是资源分配的最小单位&#xff0c;线程是操作系统调度执行的最小单位 2&#xff09;线程的上下文切换的速度比进程快得多 3&#xff09;从应用程序A中启用应…

制作一个RISC-V的操作系统四-嵌入式开发介绍

文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上&#xff0c;或者说运行到硬件上 交叉编译 简单理解交叉编译来说…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了极为重要的角色&#xff0c;连接着应用的各个部分。对API进行自动化测试能够提高测试效率&#xff0c;降低错误&#xff0c;确保软件产品的质量。本文将通过实…

LeetCode 每日一题 Day 5【Hard】

2646. 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 b~i ~之间存在一条边。 每个节点都关…

OpenResty入门与实践:下载安装、环境变量、常用命令及案例解析

文章目录 一、Openresty下载安装二、设置环境变量三、常用命令四、入门案例五、实践案例1、lua-nginx-module1&#xff09;入门案例2&#xff09;获取Nginx uri中的单一变量3&#xff09;获取Nginx uri中的所有变量 2、Nginx缓存1&#xff09;Nginx全局共享内存缓存2&#xff0…

使用 MITRE ATTCK® 框架缓解网络安全威胁

什么是MITRE ATT&CK框架 MITRE Adversarial Tactics&#xff0c; Techniques&#xff0c; and Common Knowledge&#xff08;ATT&CK&#xff09;是一个威胁建模框架&#xff0c;用于对攻击者用来入侵企业、云和工业控制系统&#xff08;ICS&#xff09;并发起网络攻击…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展&#xff0c;简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习&#xff08;parallel federated learning&#xff0c;PFL&#xff09;&#xff0c;通过调换中心节点聚合和广播的顺序。本文…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…

Spring Boot与Mybatis基础配置(手动写增删改查)

一、 配置 1.新建项目 1.项目基础配置 解释&#xff1a;记得把这个改成start.aliyun.com要不没有java8也就是jdk1.8 2.项目依赖配置 2.配置maven 配置前&#xff1a; 配置后&#xff1a; 3.创建子项目并配置父子项目pom.xml 配置父pom.xml 声明当前项目不是要打成jar包的…

反序列化漏洞详解(二)

目录 pop链前置知识&#xff0c;魔术方法触发规则 pop构造链解释&#xff08;开始烧脑了&#xff09; 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识&#xff0c;魔术方法触…

学习UnitTest框架,轻松打造无懈可击的代码!

一、什么是UnitTest&#xff1f; 1、介绍 unittest是Python自带的一个单元测试框架&#xff0c;它可以做单元测试&#xff0c;也能用于编写和运行重复的测试工作。 它给自动化测试用例开发和执行提供了丰富的断言方法&#xff0c;判断测试用例是否通过&#xff0c;并最终生成…

纯js实现录屏并保存视频到本地的尝试

前言&#xff1a;先了解下&#xff1a;navigator.mediaDevices&#xff0c;mediaDevices 是 Navigator 只读属性&#xff0c;返回一个 MediaDevices 对象&#xff0c;该对象可提供对相机和麦克风等媒体输入设备的连接访问&#xff0c;也包括屏幕共享。 const media navigator…