配置consul的session注册及服务发现功能[python]

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


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

发表评论

邮箱地址不会被公开。 必填项已用*标注