『亚马逊云科技产品测评』活动征文| 基于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.gz

tar -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-reload

sudo systemctl start etcd

sudo 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,并在其中添加服务注册和发现的方法:

<?php

namespace 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中使用:

<?php

namespace 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,这个等以后有时间在写

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

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

相关文章

Audacity降噪消除视频中杂音

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【嵌入式Linux开发一路清障-连载04】虚拟机VirtualBox7.0安装Ubuntu22.04后挂载Windows平台共享文件夹

虚拟机安装Ubuntu22.04后挂载Windows平台共享文件夹 障碍07-虚拟机VirtualBox7.0完装完Ubuntu22.04后&#xff0c;无法成功挂载Windows平台中共享文件夹&#xff0c;无法访问电脑中的各类重要文件&#xff0c;我该怎么办&#xff1f;一、问题的模样&#xff1a;VirtualBox7.0设…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块&#xff0c;并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

宋仕强论道之华强北自组织和激励模式(十四)

宋仕强论道之华强北自组织和激励模式&#xff08;十四&#xff09;: 为什么一个小小深圳市华强北我宋仕强就讲这么久呢&#xff0c;听说玄奘大和尚刚出道时在洛阳的白马寺讲经&#xff0c;一个“悟”字就讲了三个月。一个事物有他的复杂性和多样性&#xff0c;从自然科学和社会…

visual studio 2022 更改字体和大小

工具--->选项 文本编辑器 输出窗口

【Openstack Train安装】五、Memcached/Etcd安装

本文介绍Memcached/Etcd安装步骤&#xff0c;Memcached/Etcd仅需在控制节点安装。 在按照本教程安装之前&#xff0c;请确保完成以下配置&#xff1a; 【Openstack Train安装】一、虚拟机创建 【Openstack Train安装】二、NTP安装 【Openstack Train安装】三、openstack安装…

处理跨域问题

这里只讨论后端对跨域支持,前端的跨域支持一般都是在测试阶段用用的,跨域还是要后端解决 跨域问题的产生:浏览器的一种安全机制-->同源策略限制 同源策略:URL中包括协议&#xff0c;域名&#xff0c;IP&#xff0c;端口都要完全相同&#xff0c;如果有一项不同&#xff0c;浏…

基于Java SSM框架+Vue实现病人跟踪治疗信息系统项目【项目源码+论文说明】

基于java的SSM框架Vue实现病人跟踪治疗信息系统演示 摘要 病人跟踪治疗信息管理系统采用B/S模式&#xff0c;促进了病人跟踪治疗信息管理系统的安全、快捷、高效的发展。传统的管理模式还处于手工处理阶段&#xff0c;管理效率极低&#xff0c;随着病人的不断增多&#xff0c;…

【开源】基于Vue+SpringBoot的智能教学资源库系统

项目编号&#xff1a; S 050 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S050&#xff0c;文末获取源码。} 项目编号&#xff1a;S050&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课…

测试相关-面试高频

测试面试相关 面试 测试的具体场景 功能测试 具体的测试工具Jmeter Postman selenium pytest 怎么看待测试的潜力与挑战 软件测试是正在快速发展&#xff0c;充满挑战的领域。尽管现在许多自动化测试软件的出现使得传统手工测试的方式被代替&#xff0c;但自动化测试工具的…

Echarts 大屏注册自定义地图解析文件流报错以及坐标显示数值和地图填充以及dataV轮播数据不显示问题解决

效果图: 1、第一种方式 后台接口获取到SVG图片的文件流,postman能够正确解析出文件流,前端调用api时需要设置返回的响应格式为image/svg+xml格式,否则解析失败 拿到文件流后是这样的 <?xml version="1.0" encoding="utf-8"?> <!-- Generato…

06 # 枚举类型

一个角色判断例子 function initByRole(role) {if (role 1 || role 2) {// do sth} else if (role 3 || role 4) {// do sth} else if (role 5) {// do sth} else {// do sth} }上面的代码存在的问题&#xff1a; 可读性差&#xff1a;很难记住数字的含义可维护性差&…

Pycharm2020.3.5激活方式

激活插件链接&#xff1a;https://pan.baidu.com/s/1tPd7V4pKUx0Z6fSKumLjTQ 提取码&#xff1a;lr12 1.pycharm主界面点开设置如下&#xff1a; 2.点击 Plugins 然后依次点击&#xff1a;小齿轮->选择本地安装&#xff08;下图&#xff09; 3.找到存放插件的目录&#xf…

13:kotlin类和对象 -- 属性(Properties)

定义属性 类属性可使用var和val定义 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar zip: String "123456" }属性使用 fun copyAddres…

Dynamsoft Barcode Reader教程:如何使用Dynamsoft Java条形码阅读器扫描多个条形码

目前有许多开源和商业条形码SDK&#xff0c;但只有少数可以通过扫描一次来识别多个条形码。当您在Google中搜索条形码SDK或Java条形码SDK时&#xff0c;您会发现Dynamsoft Barcode Reader SDK始终位于搜索结果的前5位。在本文中&#xff0c;我将分享如何使用Dynamsoft Java条码…

【Linux】tar 命令使用

tar 命令 tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 著者 由约翰吉尔摩和杰伊芬拉森撰写。 语法 tar [选项] [压缩后文…

linux用户组管理_创建删除密码修改

2.2 用户/组管理 2.2.1 用户 2.2.1.1 useradd&#xff1a;创建用户 添加用户账号就是在系统中创建一个新账号&#xff0c;然后为新账号分配用户号、用户组、主目录和登录Shell等资源。 useradd命令的基本语法如下&#xff1a; useradd 选项 用户名 常见选项参数&#xff…

基于UDP的网络聊天室

客户端 #include <myhead.h> //定义存储信息结构体 typedef struct _MSG {char code; //操作码&#xff1a;L表示登录C表示群聊S表示系统消息S表示退出char name[128]; char txt[256];}msg_t;//定义保存客户端网络信息的链表 typedef struct _ADDR {struct sockaddr_i…

深度学习毕设项目 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

从0开始学习JavaScript--JavaScript 模板字符串的全面应用

JavaScript 模板字符串是 ES6 引入的一项强大特性&#xff0c;它提供了一种更优雅、更灵活的字符串拼接方式。在本文中&#xff0c;将深入探讨模板字符串的基本语法、高级用法以及在实际项目中的广泛应用&#xff0c;通过丰富的示例代码带你领略模板字符串的魅力。 模板字符串…