etcd的简单使用

2023-11-16

etcd的简单使用

ETCD安装配置

安装

https://github.com/coreos/etcd/releases/下载想要的版本解压etcd包 
解压后进入目录,增加x权限

chmod +x etcd 
chmod +x etcdctl
 

并将etcd和etcdctl 复制到 /bin

配置启动

简单启动

./bin/etcd 这样就可以启动使用

集群配置

在两台机器上部署了简单的集群

192.168.231.130
192.168.231.132
 

在配置文件/etc/defalut/etcd 中增加:

ETCD_OPTS="-name infra0   -initial-advertise-peer-urls http://192.168.231.130:2380   -listen-peer-urls http://192.168.231.130:2380   -initial-cluster-
token etcd-cluster-1   -initial-cluster infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380   -initial-cluster-state new"
 

也可用参数的方法

ETCD_INITIAL_CLUSTER="infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380"
ETCD_INITIAL_CLUSTER_STATE=new
 

192.168.231.132机器上

ETCD_OPTS="-name infra1   -initial-advertise-peer-urls http://192.168.231.132:2380   -listen-peer-urls http://192.168.231.132:2380   -initial-cluster-token etcd-cluster-1   -initial-cluster infra0=http://192.168.231.130:2380,infra1=http://192.168.231.132:2380   -initial-cluster-state new"

 

 

参数解释

启动etcd进程后查看集群

etcdctl member list
27e6981eec74137d: name=infra0 peerURLs=http://192.168.231.130:2380 clientURLs=http://localhost:2379,http://localhost:4001
3955a9b061e52de1: name=infra1 peerURLs=http://192.168.231.132:2380 clientURLs=http://localhost:2379,http://localhost:4001

 

 

判断leader和followers

curl http://127.0.0.1:2379/v2/stats/leader

{"leader":"27e6981eec74137d","followers":{"3955a9b061e52de1":{"latency":{"current":0.178536,"average":0.26406266231884085,"standardDeviation":0.3787246458449882,"minimum":0.084328,"maximum":10.527117},"counts":{"fail":0,"success":1380}}}}

 

 

协议

简单发送一个请求设置key值的请求

# curl -vvv http://127.0.0.1:2379/v2/keys/mykey -XPUT -d value="this is test"
* Hostname was NOT found in DNS cache
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 2379 (#0)
> PUT /v2/keys/mykey HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 127.0.0.1:2379
> Accept: */*
> Content-Length: 18
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 18 out of 18 bytes
< HTTP/1.1 200 OK
< Content-Type: application/json
< X-Etcd-Cluster-Id: 69bc358c20384a4c
< X-Etcd-Index: 16333
< X-Raft-Index: 87030
< X-Raft-Term: 117
< Date: Fri, 14 Aug 2015 01:39:39 GMT
< Content-Length: 201
<
{"action":"set","node":{"key":"/mykey","value":"this is test","modifiedIndex":16333,"createdIndex":16333},"prevNode":{"key":"/mykey","value":"this is test","modifiedIndex":14840,"createdIndex":14840}}
* Connection #0 to host 127.0.0.1 left intact

 

 

http接口是rest api的风格

body里面字段详解:

  • action: set 操作对应的是url的put,rest api的风格
  • node.key: 设置的key值
  • node.value: 设置的value值
  • node.createdIndex: 唯一的整数,每当etcd有改变时,这个值也会发生变化. 不仅限于key值操作,包括增加和同步服务改变。这里要修改
  • node.modifiedIndex: 和createdIndex类似,也是一个唯一证整数 set , delete , update , create , - compareAndSwap , compareAndDelete 这些操作都会改变这个值,而get和watch 命令不会修改改变这个值

header字段详解:

 X-Etcd-Cluster-Id: 69bc358c20384a4c
X-Etcd-Index: 16333
X-Raft-Index: 87030
X-Raft-Term: 117
  • X-Etcd-Index 等同于createdIndex.
  • X-Etcd-Index is the current etcd index when the watch starts, which means that the watched event may happen after X-Etcd-Index
  • X-Raft-Index 类似etcd index,但是用于raft protocol
  • X-Raft-Term is an integer that will increase whenever an etcd master election happens in the cluster. If this number is increasing rapidly, you may need to tune the election timeout. See the tuning section for details.

可以使用etcdctl简化操作

# etcdctl get mykey
this is test
 

基本操作

可以使用etcdctl或者url去执行手动操作 
etcdctl几个有用的附加命令

  • –debug 将指令的url显示出来
# etcdctl --debug get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
this is test

 

 
  • –output /-o 将输出以指定的方式显示出来
# etcdctl -o json get mykey 
{"action":"get","node":{"key":"/mykey","value":"12345","modifiedIndex":18134,"createdIndex":18134},"etcdIndex":18168,"raftIndex":96532,"raftTerm":124}

# etcdctl get mykey         
12345

 

 

查看版本

curl -L http://127.0.0.1:2379/version

etcdctl –version

# etcdctl --version
etcdctl version 2.0.13

 

 

设定键值

etcdctl set key value 
curl -X PUT http://localhost:2379/v2/keys/key -d value=value

 

如想要创建一个{mykey,kkkkk}的键值

# etcdctl --debug -o json set mykey kkkkk
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mykey -d value=kkkkk
{"action":"set","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":21283,"createdIndex":21283},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":20087,"createdIndex":20087},"etcdIndex":21283,"raftIndex":112958,"raftTerm":149}

# etcdctl --debug -o json get mykey
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":21283,"createdIndex":21283},"etcdIndex":21283,"raftIndex":112963,"raftTerm":149}

 

 

这里显示了前一个值,设置后再get返回的是最新的值 
etcdctl mk key value也能起到创建并设置键值的作用,和set操作的区别主要是,不能对已存在的key进行创建的操作

# etcdctl --debug -o json mk aa 11
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/aa?prevExist=false -d value=11
{"action":"create","node":{"key":"/aa","value":"11","modifiedIndex":21093,"createdIndex":21093},"etcdIndex":21093,"raftIndex":112010,"raftTerm":149}

# etcdctl --debug -o json mk aa 22
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/aa?prevExist=false -d value=22
Error:  105: Key already exists (/aa) [21098]

 

 

查看键值

etcdctl get key 
curl -X GET http://localhost:2379/v2/keys/key?

etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"12345","modifiedIndex":18134,"createdIndex":18134},"etcdIndex":18661,"raftIndex":99095,"raftTerm":126}

 

 

查看键值

etcdctl rm key 
curl -X DELETE http://localhost:2379/v2/keys/key?

# etcdctl --debug -o json rm mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mykey?dir=false&recursive=false
{"action":"delete","node":{"key":"/mykey","modifiedIndex":18766,"createdIndex":18701},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":18701,"createdIndex":18701},"etcdIndex":18766,"raftIndex":99607,"raftTerm":127}

# etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
Error:  100: Key not found (/mykey) [18766]

 



设置键值的TTL

etcdctl set key value –ttl time 
curl -X PUT http://localhost:2379/v2/keys/key -d value=value -d ttl=time 
通过设置TTL可以让key值在规定时间过期,比如设置这个key的ttl为100

 etcdctl --debug -o json set mykey ok --ttl 100
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mykey -d value=ok -d ttl=100
{"action":"set","node":{"key":"/mykey","value":"ok","expiration":"2015-08-14T03:15:14.665295244Z","ttl":100,"modifiedIndex":19036,"createdIndex":19036},"etcdIndex":19036,"raftIndex":100957,"raftTerm":129}

 

 

过了几十秒查看,ttl减为23

# etcdctl --debug -o json get mykey
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&recursive=false&sorted=false
{"action":"get","node":{"key":"/mykey","value":"ok","expiration":"2015-08-14T03:15:14.665295244Z","ttl":23,"modifiedIndex":19036,"createdIndex":19036},"etcdIndex":19077,"raftIndex":101148,"raftTerm":129}

 

 

当ttl减为0,这个key值就查询不到了

Error:  100: Key not found (/mykey) [19084]

 

 

目录的ttl设置方法和key的类似

监控键值的改动

etcdctl watch key 
curl -X GET http://localhost:2379/v2/keys/key?consistent=true&wait=true 

 


监听键值的改动,然后输出信息, –after-index可以根据etcd-index来获取后续index对应的改动

etcdctl --debug watch mykey 
Cluster-Endpoints: http://localhost:2379, http://localhost:2379, http://localhost:4001, http://localhost:4001
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true

 

 

当监测到键值设置为kkkkk时打印

kkkkk

 

 

若etcdctl watch 带上–forever参数则会不退出一直监测键值的改动,比如这里检测到了set和delete操作

# etcdctl --debug -o json watch mykey --forever
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true


{"action":"set","node":{"key":"/mykey","value":"kkkkk","modifiedIndex":19656,"createdIndex":19656},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":19645,"createdIndex":19645},"etcdIndex":19655,"raftIndex":104107,"raftTerm":131}


Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykeyconsistent=true&wait=true&waitIndex=19657

{"action":"delete","node":{"key":"/mykey","modifiedIndex":19661,"createdIndex":19656},"prevNode":{"key":"/mykey","value":"kkkkk","modifiedIndex":19656,"createdIndex":19656},"etcdIndex":19656,"raftIndex":104115,"raftTerm":131}


Curl-Example: curl -X GET http://localhost:2379/v2/keys/mykey?consistent=true&wait=true&waitIndex=19662

 

 

对于目录类型的key可以用–recursive 来检测目录下的子keys的改动

同样可以用作监测的命令是exec-watch,相比watch,增加了监测到改动可以执行自定义的操作 
etcdctl watch key command

# etcdctl exec-watch mykey -- sh -c 'echo hit'
hit

 

 

目录相关的操作

etcdctl mkdir dirname

创建一个目录可以关联多个子keys,比如先建立一个名叫mydir的dir

etcdctl --debug -o json mkdir mydir 
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir?dir=true&prevExist=false

 

 

在这个dir下面可以建立多个keys

# etcdctl --debug -o json set /mydir/key1 11111
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir/key1 -d value=11111
{"action":"set","node":{"key":"/mydir/key1","value":"11111","modifiedIndex":20850,"createdIndex":20850},"etcdIndex":20850,"raftIndex":110723,"raftTerm":148}

# etcdctl --debug -o json set /mydir/key2 22222
Curl-Example: curl -X PUT http://localhost:2379/v2/keys/mydir/key2 -d value=22222
{"action":"set","node":{"key":"/mydir/key2","value":"22222","modifiedIndex":20855,"createdIndex":20855},"etcdIndex":20855,"raftIndex":110747,"raftTerm":148}

 

 

可以用etcdctl ls dirname进行查看,得到该dir下面的2个key

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
/mydir/key2
/mydir/key1

 

 

如果向目录名的路径 post一个value,那么在这个目录下面会自动用createdIndex创建一个key

# curl -X POST http://localhost:2379/v2/keys/mydir -d value=33333
{"action":"create","node":{"key":"/mydir/21442","value":"33333","modifiedIndex":21442,"createdIndex":21442}}

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
/mydir/key1
/mydir/key2
/mydir/21442

 

 

用rmdir 删除目录要保证目录下没有keys,不然会失败

# etcdctl --debug -o json rmdir mydir
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mydir?dir=true&recursive=false
Error:  108: Directory not empty (/mydir) [21682]

 



若要将目录和keys都删除可以用rm指令

# etcdctl --debug -o json rm mydir --recursive=true
Curl-Example: curl -X DELETE http://localhost:2379/v2/keys/mydir?dir=false&recursive=true

# etcdctl --debug -o json ls /mydir
Curl-Example: curl -X GET http://localhost:2379/v2/keys/mydir?consistent=true&recursive=false&sorted=false
Error:  100: Key not found (/mydir) [21883]

 

 

状态查看

etcd分别提供了查看leader、自己以及store状态的接口

  • 查看leader的状态
curl http://127.0.0.1:2379/v2/stats/leader
{"leader":"27e6981eec74137d","followers":{"3955a9b061e52de1":{"latency":{"current":0.158241,"average":0.22540039942528703,"standardDeviation":0.17653730983599686,"minimum":0.087808,"maximum":1.988291},"counts":{"fail":0,"success":348}}}}

 

 
  • 查看自己的状态
curl http://127.0.0.1:2379/v2/stats/self
# curl http://127.0.0.1:2379/v2/stats/self
{"name":"infra0","id":"27e6981eec74137d","state":"StateLeader","startTime":"2015-08-14T12:52:39.624477849+08:00","leaderInfo":{"leader":"27e6981eec74137d","uptime":"2m37.095030303s","startTime":"2015-08-14T12:55:31.332765166+08:00"},"recvAppendRequestCnt":429,"sendAppendRequestCnt":1064,"sendPkgRate":6.896118337343223,"sendBandwidthRate":1170.6850489473857}

 

 
  • 查看store的状态
curl http://127.0.0.1:2379/v2/stats/store 
{"getsSuccess":13,"getsFail":2152,"setsSuccess":120,"setsFail":2,"deleteSuccess":6,"deleteFail":0,"updateSuccess":0,"updateFail":0,"createSuccess":961,"createFail":186,"compareAndSwapSuccess":19631,"compareAndSwapFail":296,"compareAndDeleteSuccess":0,"compareAndDeleteFail":0,"expireCount":849,"watchers":0}

 

 

其他接口以及更详尽的接口说明可以看官网说明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

etcd的简单使用 的相关文章

  • 深入浅出paxos

    原文 https rebootcat com 2020 12 05 paxos
  • Paxos算法

    Paxos算法 Paxos算法是一系列共识算法中的一个 其目的就是为了解决共识 一致性问题 这个Github连接中详细的列出了多种共识算法 还有一些工程实践的例子 腾讯 Zookeeper Handpoo下的一个分布式框架 Handoop是
  • paxos之Multi-Paxos

    paxos之Multi Paxos 朴素Paxos算法的Latency很高 Multi Paxos通过改变Promised的生效范围至全局的Instance 收到来自其他节点的Accept 则进行一段时间的拒绝提交请求 从而使得一些唯一节点
  • 一步到位分布式开发Zookeeper实现集群管理

    说到分布式开发Zookeeper是必须了解和掌握的 分布式消息服务kafka hbase 到hadoop等分布式大数据处理都会用到Zookeeper 所以在此将Zookeeper作为基础来讲解 Zookeeper 是分布式服务框架 主要是用
  • TiDB 架构的演进和开发哲学

    本文来自 CSDN 程序员 2017 年 2 月的封面报道 对于一个从零开始的数据库来说 选择什么语言 整体架构怎么做 要不要开源 如何去测试 太多的问题需要去考量 在本篇文章中 PingCAP 联合创始人兼 CTO 黄东旭对 TiDB 的
  • 分布式一致性算法--Paxos

    分布式一致性算法 Paxos 2017 08 31 10 15 0人阅读 评论 0 收藏 编辑 删除 分类 Paxos 1 分布式一致性算法 Paxos Paxos算法是莱斯利 兰伯特 Leslie Lamport 1990年提出的一种基于
  • 微信分布式数据存储协议对比——Paxos和Quorum

    微信分布式数据存储协议对比 Paxos和Quorum 2017 4 19 1 36 00 作者丨莫晓东 责编丨仲培艺 分布式系统是网络化的计算机系统 海量数据的互联网应用只能通过分布式系统协调大量计算机来支撑 微信后台存储大量使用了分布式数
  • ZooKeeper之(六)应用实例

    6 1 Java API 客户端要连接 Zookeeper服务器可以通过创建 org apache zookeeper ZooKeeper 的一个实例对象 然后调用这个类提供的接口来和服务器交互 ZooKeeper 主要是用来维护和监控一个
  • Paxos算法细节详解(一)--通过现实世界描述算法

    Paxos算法细节详解 一 通过现实世界描述算法 Paxos分析 最近研究paxos算法 看了许多相关的文章 概念还是很模糊 觉得还是没有掌握paxos算法的精髓 所以花了3天时间分析了libpaxos3的所有代码 此代码可以从https
  • 一致性算法(paxos、raft)

    背景 分布式 一致性模型 1 弱一致性 最终一致性 1 1 DNS 1 1 Gossip 2 强一致性 2 1 同步 2 1 paxos 2 1 raft multi paxos 2 1 ZAB multi paxos 与raft相似 心跳
  • 基于zookeeper的MySQL主主负载均衡的简单实现

    基于zookeeper的MySQL主主负载均衡的简单实现 1 先上原理图 2 说明 两个mysql采用主主同步的方式进行部署 在安装mysql的服务器上安装客户端 目前是这么做 以后想在zookeeper扩展集成 客户端实时监控mysql应
  • etcd的简单使用

    etcd的简单使用 ETCD安装配置 安装 去https github com coreos etcd releases 下载想要的版本解压etcd包 解压后进入目录 增加x权限 chmod x etcd chmod x etcdctl 并
  • 基于 paxos 的复制键值存储的领导者选举

    我将使用多个 Paxos 实现一个键值存储 我会有几个节点 其中一个是主节点 该主节点接收更新请求并将值复制到从节点 我的问题是如何选择主节点 或领导者 我还可以使用Paxos算法吗 如果是这样 您认为有必要将paxos实现抽象为一个单元
  • 选择用于实现分布式消息传递算法的编程语言

    基本上 我想实现以下算法并分析使用这些算法构建的系统在不同条件下的行为 八卦协议 多个paxos 一致的散列 我的兴趣在于这些算法 我基本上是在寻找一种编程语言 可以让我快速编写这些算法并深入理解这些算法 我应该选择哪种语言 Java Sc
  • paxos 与 raft 进行领导者选举

    读完paxos和raft paper后 我有以下困惑 paxos论文仅描述了单个日志条目的共识 相当于raft算法中的领导者选举部分 在raft的leader选举中 paxos的方式相对于简单的随机超时方式有什么优势呢 一个常见的误解是原始
  • 如果更新值与接受者发送的最高提案编号不同步,paxos 是否会“忽略”更新值的请求?

    这里的标题可能会产生误导 我将尽力通过一个例子来解释我的疑问 我正在从 wiki 和其他来源阅读有关 paxos 算法的内容 1 想象一下客户端请求更新值的情况 X在下面的示例中 已被处理 经过一轮 Paxos 后 得到一个值Vb之所以被选
  • OT 和 CRDT 之间的区别

    有人可以简单地向我解释一下操作转换和 CRDT 之间的主要区别吗 据我了解 两者都是允许数据在分布式系统的不同节点上无冲突地收敛的算法 在哪种用例中您会使用哪种算法 据我了解 OT主要用于文本 而CRDT更通用 可以处理更高级的结构 对吧
  • 与恶霸算法相比,高级主选举算法有什么好处?

    我读过当前的主选举算法 如 Raft Paxos 或 Zab 如何在集群上选举主节点 但不明白为什么他们使用复杂的算法而不是简单的恶霸算法 我正在开发一个集群库并使用 UDP 多播来发送心跳消息 每个节点加入一个多播地址 并定期向该地址发送
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • Lamport 的 Paxos 中的矛盾做了简单的论文

    阶段 2 a 如果提议者收到大多数接受者对其准备请求 编号为 n 的响应 则它向每个接受者发送一个接受请求 以获取编号为 n 且值为 v 的提案 其中 v 是响应中编号最高的提案的值 或者如果响应未报告任何提案 则为任意值 正如论文中提到的

随机推荐

  • 【目标检测】3、SPPNet

    SPPNet Spatial Pyramid Pooling 空间金字塔池化 一般的CNN结构中 对输入大小要求固定 但在现实中通常会使用crop和warp来将大小统一 这样做会破坏图像的纵横比 何凯明提出了SPP 连接在最后一层卷积层 下
  • C++ 算法学习 之 sort

    这里写目录标题 sort函数 简单使用 通过上面的两个列子发现sort用的参数不一样为什么 进一步理解sort 那我们怎么进行自定义排序呢 力扣题目 c 官网手册 sort 参考于官网 sort函数 std sort 函数是C 标准库中提供
  • Python3.7+RobotFramework自动化测试框架环境搭建-重装

    Python3 7 RobotFramework自动化测试框架环境搭建 学习笔记 一 环境搭建 1 安装Python3 7 2 2 安装相关的库 request库 robotframework库 robotframework request
  • C++实现softmax函数(std::vector)

    参考博客 激活函数之softmax介绍及C 实现及其评论区 Lambda使用参考博客 C 11 Lambda表达式 函数功能 输入vector
  • CSS(三)

    目录 CSS三大特性 层叠性 继承性 优先级 层叠性 继承性 优先级 页面布局三大核心 盒子模型 浮动 定位 CSS盒子模型 网页布局过程 盒子模型组成 编辑 编辑 边框 border 内边距 padding 外边距 margin PS基本
  • 基于github搭建的个人博客

    刚开始我也是很不理解为什么要利用github hexo搭建博客 现在差不多能理解 首先逼格很高 其次用github搭建可以学习使用github并且空间很大 也可以便于交流 再次声明本篇是基于windows系统下搭建的博客 废话不多说开始 搭
  • 借助Redis锁,完美解决高并发秒杀问题

    目录 1 单机环境下的锁 2 分布式情况下使用Redis锁 3 一台服务宕机 导致无法释放锁 4 给每一把锁加上过期时间 5 延长锁的过期时间 解决锁失效 6 使用Redisson简化代码 场景 一家网上商城做商品限量秒杀 1 单机环境下的
  • JAVA-注册成功后,通过多线程发送短信的使用场景

    场景 在日常的系统中 使用前的第一步往往是需要注册 只有注册后获得登录账号和密码才能正常使用系统 有些系统在注册成功后 还会往用户的手机发送一条注册成功的短信通知 这个并不属于主线流程 也就是说发不发送该短信通知 用户都已经能登录系统了 那
  • mapbox创建自定义marker图标绑定弹框展示信息

    创建自定义marker图标绑定弹框 let carMarker 存放marker图标 for let m 0 m
  • 怎么查看本地服务器信息,查看本地服务器url地址

    查看本地服务器url地址 内容精选 换一换 OBS Browser 是一款用于访问和管理对象存储服务的图形化工具 支持通过配置内网DNS服务器地址的方式 使在华为云上的Windows ECS通过内网直接访问OBS 下面将介绍具体其操作流程和
  • Android EditText的setOnEditorActionListener方法——监听软键盘按键

    文章目录 1 控件EditText的setOnEditorActionListener方法的使用 2 android 软件盘事件响应 android imeOptions KeyEvent android inputType 2 1 Edi
  • 修改NuGet下载包后存放的默认路径

    NuGet默认下完包后就放在C盘 我们给他改一下 NuGet的默认目录配置文件在C Users yourName AppData Roaming NuGet NuGet Config 加一下这个配置 我放在了D盘 你可以看情况自己改
  • 【Hadoop技术篇】hadoop的使用

    博主介绍 博主介绍 大家好 我是淼淼 喵 很高兴认识大家 主攻领域 大数据开发 数据仓库 ETL 数据分析 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 欢迎评论 作者水平有限 欢迎各位大佬指点 相
  • 沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly

    3 6 softmax回归的从零开始实现 运行 print evaluate accuracy net test iter 报了一溜错误 其中最后一行为 RuntimeError DataLoader worker pid s 5052 1
  • 包和 jar 文件的创建

    前言 在之前的文章中 讲到了面向的 3 大特性 封装 继承 多态 和面向对象设计的 5 大原则 SRP OCP LSP DIP ISP 此外 我们还讲了如何创建一个类 并且在创建类后如何构造一个对象 然后还介绍了类中的属性和方法 并对构造方
  • 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍 GPS原理与接收机设计 谢钢 非线性方程 就是因变量与自变量之间的关系不是线性的关系 这类方程很多 例如平方关系 对数关系 指数关系 三角函数等等 求解此类方程往往
  • ESP-NOW:竟然还有如此好用的无线通信方式

    用 Arduino 玩转 ESP32 系列历史文章目录 ESP32 概述与 Arduino 软件准备 ESP32 GPIO接口编程入门 蓝牙翻页笔 蓝牙键盘与PPT 控制器 B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语
  • eclipse 关于报错Error creating bean with name ‘xxxxx‘: Invocation of init method....

    网上查找的资料是这种异常一般都是包导错了 缺失 冲突 版本错误都可能 由于再报这个错之前我进行了添加删除修改pom xml文件 右键项目 gt maven gt update project project gt clean等这些对于项目整
  • C语言模拟实现atoi函数

    atoi函数 主要功能是将一个字符串转变为整数 例如将 12345 gt 12345 但在实现过程中 我们难免会因为考虑不够全面而漏掉比较重要的几点 今天就总结一下实现atoi函数需要注意的地方 1 指针为NULL 2 字符串为空字符串 3
  • etcd的简单使用

    etcd的简单使用 ETCD安装配置 安装 去https github com coreos etcd releases 下载想要的版本解压etcd包 解压后进入目录 增加x权限 chmod x etcd chmod x etcdctl 并