『亚马逊云科技产品测评』活动征文| 基于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.hqwc.cn/news/232075.html

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

相关文章

Android修行手册 - 一篇文章从0到1搞一个Android Studio插件。

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

Spine深入学习 —— 换装

Spine深入学习————换装 数据对象和实例对象的关系与区别 数据对象是无状态的&#xff0c;可在任意数量的骨架实例间共用。有对应实例数据的数据对象类名称以“Data”结尾&#xff0c;没有对应实例数据的数据对象则没有后缀&#xff0c;如附件、皮肤及动画。 实例对象有许…

大数据Hadoop-HDFS_元数据持久化

大数据Hadoop-HDFS_元数据持久化 &#xff08;1&#xff09;在HDFS第一次格式化后&#xff0c;NameNode&#xff08;即图中的主NameNode&#xff09;就会生成fsimage和editslog两个文件&#xff1b; &#xff08;2&#xff09;备用NameNode&#xff08;即图中的备NameNode&…

什么是供应链攻击?

随着企业越来越依赖技术、连接性和第三方&#xff0c;供应链攻击变得越来越普遍。这些攻击旨在通过供应商和业务合作伙伴损害公司。 供应链攻击可能对企业和组织构成重大威胁&#xff0c;损害其安全以及向客户提供的产品和服务的安全。 在本文中&#xff0c;我们将探讨供应链…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

数据结构 -- 图论之最小生成树

目录 1.最小生成树算法 1.Kruskal算法 2.Prim算法 1.最小生成树算法 定义:最小生成树算法:连通图有n个顶点组成,那么此时的图的每一个点都能相互连接并且边的个数为n-1条,那么此时该图就是最小生成树. 下面量算法有几个共同的特点: 1.只能使用图中权值最小的边来构造生成树 …

Javaweb之Vue组件库Element案例的详细解析

4.4 案例 4.4.1 案例需求 参考 资料/页面原型/tlias智能学习辅助系统/首页.html 文件&#xff0c;浏览器打开&#xff0c;点击页面中的左侧栏的员工管理&#xff0c;如下所示&#xff1a; 需求说明&#xff1a; 制作类似格式的页面 即上面是标题&#xff0c;左侧栏是导航&…

单片机----串行通信

目录 串行通信的两种方式 串行通信的传输模式 串行通信的错误校验 1.奇偶校验 2.代码和校验 3.循环冗余码校验 串行口结构 串行口控制寄存器SCON 特殊功能寄存器PCON 串行口的4种工作方式 方式0&#xff1a; &#xff08;1&#xff09;方式0的发送过程 &#xff0…

【Flutter】graphic图表实现tooltip一段时间后自动隐藏

概述 graphic图表中提供了自定义tooltip的事件&#xff0c;可通过selections中on和clear配置手势选项和可识别设备&#xff0c;默认情况下tooltip需要双击隐藏&#xff0c;但这并不符合我们的需求。通过调研发现&#xff0c;若想实现tooltip隔几秒后隐藏&#xff0c;可通过Str…

【刷题】树的遍历

层序遍历 层序遍历需要用到广度有限搜索&#xff0c;也就是需要队列 1.将根节点加入队列、 2.如果队列不为空&#xff0c;就得到队列的长度&#xff0c;对队列中现有的元素进行访问并从队列中删除&#xff0c;并将其子节点加入到队列中 102. 二叉树的层序遍历 给你二叉树的根…

算法基础之字符串哈希

字符串哈希 核心思想&#xff1a;用p(131或者13331)进制数储存字符串每一位数的hash值 L—R的哈希值 h[R]-h[L-1]*PR-L1 哈希值很大—>modQ(264)变小 用unsigned long long 存 (出界) #include<iostream>using namespace std;typedef unsigned long long ULL;co…

iOS--UIPickerView学习

UIPickerView 使用场景和功能UIPickerView遵循代理协议和数据源协议创建对象&#xff0c;添加代理必须实现的代理方法非必要实现的方法demo用到的其他函数提示 效果展示 使用场景和功能 UIPickerView 最常见的用途是作为选项选择器&#xff0c;允许用户从多个选项中选择一个。…