ETCD vs Consul
ETCD主要面向Kubernetes,在容器社区相对较流行, 支持REST和gRPC调用, 但是没有UI,也没有官方发布的docker.io的ETCD Docker镜像。
Consul是比较独立和专业,功能比较全面, 同样专注于K/V存储,服务发现,同样用Go语言实现, 但是多了健康检查, Event,ACL,等功能,关键是提供内建的UI, 而且资料也比较丰富, 提供官方发布的docker镜像,从易用性和可维护性方面来讲,Consul比较适合,没有明显的短板。
别人画的用Consul实现分布式锁的流程:
图片.png
关键点:
Session
Consul提供一个Session的概念, 要加锁,必须先有主体,就是谁加锁,怎么知道是谁,session就是干这个用的,session的概念和浏览器的session类似, 访问一个网站的时候,服务器给你的浏览器记录了一个session ID。同样在Consul里面, 你可以申请一个session id,后续的操作就带这个session id,这样服务器在加锁的时候就知道owner。
创建Session:
curl --request PUT -d '
{
"LockDelay": "15s",
"Name": "my-service-lock",
"Node": "appmgr",
"Behavior": "release",
"TTL": "30s"
}' http://127.0.0.1:8500/v1/session/create
{
"ID": "6a9e3dfc-1f34-30c1-bee9-c2f7bbfc429c"
}
创建带锁的KV
通过acquire
curl -X PUT -d 'test' http://localhost:8500/v1/kv/lock/my-service-lock?acquire=6a9e3dfc-1f34-30c1-bee9-c2f7bbfc429c
true
返回true表示加锁成功,前面创建session带了TTL,这个锁即便不释放也会在30s后释放。
这个时候再通过其它session写这个KV就会返回false。
释放锁
curl -X PUT -d 'test' http://localhost:8500/v1/kv/lock/my-service-lock?release=c9276fd1-b028-9409-3daf-910e35307b32
参考
https://www.cnblogs.com/duanxz/p/7040968.html
https://www.consul.io/api/session.html#session_create
网友评论