熟悉我博客的人知道我挺喜欢折腾新东西的,马上就要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