使用 Consul 作为 Python 微服务的配置中心
Consul 作为数据中心,提供了 k/v
存储的功能,我们可以利用这个功能为 Python 微服务提供配置中心。
Consul 提供了 HTTP 接口,我们可以从他的接口获取数据,当然我们不用自己去实现,python-consul 已经帮我们造好了轮子。
而且官方文档非常贴心,已经贴好了 Python 常用框架的一些 demo 代码:
-
from tornado.ioloop import IOLoop
-
from tornado.gen import coroutine
-
from consul.base import Timeout
-
from consul.tornado import Consul
-
-
-
class Config(object):
-
def __init__(self, loop):
-
self.foo = None
-
loop.add_callback(self.watch)
-
-
-
def watch(self):
-
c = Consul()
-
-
# asynchronously poll for updates
-
index = None
-
while True:
-
try:
-
index, data = yield c.kv.get('foo', index=index)
-
if data is not None:
-
self.foo = data['Value']
-
except Timeout:
-
# gracefully handle request timeout
-
pass
-
-
if __name__ == '__main__':
-
loop = IOLoop.instance()
-
_ = Config(loop)
-
loop.start()
-
复制代码
结合 consul-template 用解藕的方式去配置微服务
Consul Template 提供一个方便的方式从 Consul 获取数据通过 consul-template 的后台程序保存到文件系统。
这个后台进程监控 Consul 示例的变化并更新任意数量的模板到文件系统.作为一个附件功能,模板更新完成后 consul-template 可以运行任何命令.可以查看示例部分看这个功能将会对哪些应用场景产生帮助。
首先需要在 Consul Client 所在的宿主机安装 consul-template
,由于 Demo 宿主机环境为 Mac OS,所以可以直接用 HomeBrew
进行安装。
-
-
复制代码
安装完成后进入仓库的 python-web-service
路径,这是一个用 tornado 写的简单的 Web 服务。执行如下命令:
-
-
复制代码
等待命令运行完成,服务启动后,访问 localhost:8888
可以看到返回内容:
-
-
Hello World
-
复制代码
然后我们回到仓库路径,进入 consul-template
目录,该目录主要包含以下两个文件:
-
-
-
.
-
├── config.hcl # consul-template 配置文件
-
└── config.py.ctmpl # python-web-service 配置模版文件
-
复制代码
查看一下 config.hcl
文件的内容:
-
consul {
-
address = "127.0.0.1:8500"
-
-
}
-
-
template {
-
-
source = "./config.py.ctmpl"
-
destination = "../python-web-service/config.py"
-
command = "docker restart python-web-service_python-web-service_1"
-
-
}
-
复制代码
先介绍一下 *.hcl
配置文件,这个是 Consul 中非常常见的配置文件格式,也是 HashiCorp
下的产品所用的主要配置文件格式。配置文件中包含了 4
个重要的参数:
address
—— Consul Client 的访问地址和端口source
—— 需要配置的服务的配置文件模板destination
—— 配置文件渲染后输出的路径command
—— 当配置变更后,需要执行的命令
再来看看模板文件 config.py.ctmpl
:
-
# -*- coding: utf-8 -*-
-
__author__ = 'gzp'
-
-
GREETING = '{{ keyOrDefault "python-web-service/greeting" "Hello World" }}'
-
复制代码
模版文件的格式非常类似 Jinja2
的语法,这里的意思获取 key
为 python-web-service/greeting
下的值,默认值为 HelloWorld
。
接下来运行命令使 consul-template
生效:
-
-
复制代码
我们可以访问 Consul Web UI 的 Key/Value
来修改我们的值:
将 Hello World
修改为 Hello Consul
,配置可能没有立即生效,若看到 consul-template
输出,则代表配置生效,服务以及重启:
-
-
python-web-service_python-web-service_1
-
复制代码
然后再次访问一下 web 服务:
-
-
Hello Consul
-
复制代码
可以看到配置已经生效。