熟悉我博客的人知道我挺喜欢折腾新东西的,马上就要10 1 放假了,大家都没心思忙工作 ! 一堆的需求都让我给他扔到脑后面了。 最近看了一些微信的技术文章分享,有人拿 zookeeper 、etcd、consul做对比,因为我对consul真心不熟悉,所有不好扯皮。 但今天就不同了,花了一下午的时间,把consul api文档走了一遍。
关于consul session注册及服务发现,原文地址 : http://xiaorui.cc/?p=2080
估计有些朋友不知道consul是啥?
Consul用于发现和配置服务。它主要提供了以下几个主要功能:
服务发现:Consul的客户端可以提供的服务,如api或mysql,其他的客户端可以使用Consul发现一个特定服务的提供者。使用DNS或HTTP,应用程序可以很容易地找到他们所依赖的服务。
健康检查:Consul客户端可以提供任何数量的健康检查,无论是与给定的服务(“Web服务器返回200 OK”),还是和本地节点相关联(“内存利用率低于90%”)。这些信息可以由操作员监控集群健康,它用于由服务发现组件将通信路由远离不健康的主机。
键/值存储:应用程序可以使用Consul的分层键/值存储任意数量的目标,包括动态配置,特征衰弱,leader选举,等等。简单的HTTP API使得它易于使用。
多数据中心:Consul支持多个数据中心,zookeeper和etcd对于多数据中心支持有些差 , 这意味着Consul的用户不用担心构建额外的抽象层增加到多个区域。
另外consul可以与confd 服务集成,可以用来动态生成 lvs 、nginx 和 haproxy 配置文件。
那怎么安装consul? 这是consul的dockerfile,可以直接build封装镜像就可以了。
FROM ubuntu MAINTAINER fengyun <rfyiamcool@163.com> RUN apt-get -y update RUN apt-get -y install unzip ADD https://dl.bintray.com/mitchellh/consul/0.3.1_linux_amd64.zip /tmp/consul.zip RUN cd /usr/local/sbin && \ unzip /tmp/consul.zip CMD /usr/local/sbin/consul agent -bootstrap -server -data-dir=/tmp/consul -client=0.0.0.0 EXPOSE 8400 8500 8600/udp
如何启动?
docker run -p 8500:8500 -p 8600:8600/udp rfyiamcool/consul
consul有了,我们先来测试他http接口,consul http默认端口是8500,dns是8600端口。 下面是往consul注册两条信息,标明我在哪个数据中心,我是哪个节点,哪个地址,什么服务,什么属性。
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-1", "Address": \
"mysql-1.node.consul","Service": {"Service": "mysql", "tags": ["master","v1"], \
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register
curl -X PUT -d '{"Datacenter": "sz-1", "Node": "mysql-2", "Address": \
"mysql-2.node.consul","Service": {"Service": "mysql", "tags": ["slave","v1"],\
"Port": 3306}}' http://127.0.0.1:8500/v1/catalog/register
查看刚才的注册信息, curl http://127.0.0.1:8500/v1/catalog/service/mysql
[
{
"Address": "mysql-1.node.consul",
"Node": "mysql-1",
"ServiceID": "mysql",
"ServiceName": "mysql",
"ServicePort": 3306,
"ServiceTags": [
"master",
"v1"
]
},
{
"Address": "mysql-2.node.consul",
"Node": "mysql-2",
"ServiceID": "mysql",
"ServiceName": "mysql",
"ServicePort": 3306,
"ServiceTags": [
"slave",
"v1"
]
}
]
前面的都是测试,开始来正经活了… 其实我最关注的consul的Ephemeral的功能。我在测试之前,还特意看了下文档,虽然文档上有说明,但是看到不少人在stackoverflow.com提问 ,consul做临时节点时,agent挂掉了,但consul还是可以看到信息…
下午在用python的consul模块做consul session操作时,也遇到了这问题… 提了一个issue来确认….
consul文档上http接口的使用。
/v1/session/create: 创建session信息 /v1/session/destroy/<session>: 注销session /v1/session/info/<session>: 查询session信息 /v1/session/node/<node>: 查询节点信息 /v1/session/list: 查询可用的节点 /v1/session/renew: 重新renew
consul的python驱动用的是python-consul 。下面代码是agent端,不停的说明自己现在的状态。
#xiaorui.cc
import consul
import time
c = consul.Consul()
s = c.session.create(name="worker",behavior='delete',ttl=10)
print "session id is {}".format(s)
while True:
#c.session.renew(s)
print "I am alive ..."
time.sleep(1)
这是服务端,他会一直查看可用的节点。
#conding:utf-8
import consul
import time
def is_session_exist(name, sessions):
for s in sessions:
if s['Name'] == name:
return True
return False
c = consul.Consul()
while True:
#c.session.list() 获取可用的session
index, sessions = c.session.list()
if is_session_exist('worker', sessions):
print "worker is alive ..."
else:
print 'worker is dead!'
break
time.sleep(3)
说实话,我觉得consul官方陈述的session功能,貌似跟zookeeper的Ephemeral Node不太一样。他的session只能是主动destroy掉 ,不然就只能等ttl expire了。
文章写得有些浅,过两天再看看consul api的资料 。

1 Response