使用 Consul 作为 Python 微服务的配置中心
使用 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)
- @coroutine
- 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
进行安装。
- $ brew install consul-template
- 复制代码
安装完成后进入仓库的 python-web-service
路径,这是一个用 tornado 写的简单的 Web 服务。执行如下命令:
- $ cd python-web-service && docker-compose up -d
- 复制代码
等待命令运行完成,服务启动后,访问 localhost:8888
可以看到返回内容:
- $ curl http://localhost:8888
- Hello World
- 复制代码
然后我们回到仓库路径,进入 consul-template
目录,该目录主要包含以下两个文件:
- $ cd ../consul-template
- $ tree
- .
- ├── 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-template -config config.hcl
- 复制代码
我们可以访问 Consul Web UI 的 Key/Value
来修改我们的值:
将 Hello World
修改为 Hello Consul
,配置可能没有立即生效,若看到 consul-template
输出,则代表配置生效,服务以及重启:
- $ consul-template -config config.hcl
- python-web-service_python-web-service_1
- 复制代码
然后再次访问一下 web 服务:
- $ curl http://localhost:8888
- Hello Consul
- 复制代码
可以看到配置已经生效。
使用 Consul 作为 Python 微服务的配置中心的更多相关文章
- 阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08
阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08
- 阿里巴巴微服务与配置中心技术实践之道 配置推送 ConfigurationManagement ConfigDrivenAnyting
阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08 在面向分布式的微服务系统中,如何通过更高效的配置管理方式,帮助微服务系统架构持续"无痛"的演进 ...
- 【微服务】- 配置中心 - Nacos
微服务 - 配置中心 - Nacos 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 今天的学习任务就是学习使用Nacos作为配置中心. 努力克制自己,拒绝摆烂! 什么是配 ...
- Consul微服务的配置中心体验篇
Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性 Consul Consul 是 HashiCorp 公 ...
- Spring Cloud微服务集成配置中心
1. 搭建Spring Cloud Config配置中心(见上一篇博客) 2. 创建微服务项目bounter-simon-app,pom文件如下: <?xml version="1.0 ...
- 微服务之配置中心ConfigKeeper
在微服务架构中,配置中心是必不可少的基础服务.ConfigKeeper已开源,本文将深度分析配置中心的核心内容,错过「Spring Cloud中国社区北京沙龙-2018.10.28 」的同学将从本篇文 ...
- .Net Core微服务系列--配置中心
什么是配置中心 简单来说配置中心就是对配置进行管理的一个中心.对于配置这个司空见惯的东西,我们想想为什么对于应用程序需要各种各样的配置来支撑? 我们人类没有办法掌控和预知一切,所以映射到软件系统这个领 ...
- Python微服务实践-集成Consul配置中心
A litmus test for whether an app has all config correctly factored out of the code is whether the co ...
- 推荐一款 Python 微服务框架 - Nameko
1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 本篇文章 ...
随机推荐
- 快排算法Java版-每次以最左边的值为基准值手写QuickSort
如题 手写一份快排算法. 注意, 两边双向找值的时候, 先从最右边起找严格小于基准值的值,再从最左边查找严格大于基准base的值; 并且先右后左的顺序不能反!!这个bug改了好久,233~ https ...
- ARTS-week3
Algorithm 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件 ...
- js访问对象属性的方式“.”与“[]”的区别
. 和 [] 没多大区别,作用完全相同.但是 一般情况下建议使用 . 写法,这样比较接近其它语言的面向对象写法,易读 如果属性名是动态的(比如变量中),只能使用 [] 写法.如 var person= ...
- 接口测试-Java代码实现接口请求并封装
前言:在接口测试和Java开发中对接口请求方法进行封装都非常有必要,无论是在我们接口测试的时候还是在开发自测,以及调用某些第三方接口时,都能为我们调用和调试接口提供便捷: Java实现对http请求的 ...
- selenium模块及类组织关系
问题:webdriver子模块中为什么可以直接使用类Chrome.ChromeOptions.Firefox.FirefoxProfile... 在webdriver的__init__.py文件中已经 ...
- 让一个项目同时提交到码云和GitHub两个仓库
在项目目录里找到.git文件夹然后找到config文件. 打开这个文件后找到下面的代码 [remote "origin"] url = git提交地址 fetch = +refs/ ...
- 02-Flutter移动电商实战-建立项目和编写入口文件
环境搭建请参考之前写的一篇文章:Flutter_初体验_创建第一个应用 1.创建项目 采用AndroidStudio构建本项目,FIle>New>New Flutter Project… ...
- uva12558埃及分数
1,看这全英文的题目就怪蛋疼的. 2,这输入也是奇奇怪怪的的.3,想要好好做题,理解做题,就得好好看题自己要理解吸收消化.单纯看别人的话,说实话并没有什么用处. 一,看题. 1,首先,枚举的分数肯定不 ...
- 白天不懂夜的黑追寻Android规范
有趣有内涵的文章第一时间送达! 喝酒I创作I分享 关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 生活中总有些东 ...
- D3.js的v5版本入门教程(第十章)
在这一章我们干点有趣的事——让我们上一章绘制的图表动起来,这样岂不是很有意思 为了让图表动起来,我们还是需要以下新的知识点 .attr(xxx) .transition() .attr(xxx),tr ...