使用 Consul 作为 Python 微服务的配置中心

Consul 作为数据中心,提供了 k/v 存储的功能,我们可以利用这个功能为 Python 微服务提供配置中心。

Consul 提供了 HTTP 接口,我们可以从他的接口获取数据,当然我们不用自己去实现,python-consul 已经帮我们造好了轮子。

而且官方文档非常贴心,已经贴好了 Python 常用框架的一些 demo 代码:

  1.  
    from tornado.ioloop import IOLoop
  2.  
    from tornado.gen import coroutine
  3.  
    from consul.base import Timeout
  4.  
    from consul.tornado import Consul
  5.  
     
  6.  
     
  7.  
    class Config(object):
  8.  
    def __init__(self, loop):
  9.  
    self.foo = None
  10.  
    loop.add_callback(self.watch)
  11.  
     
  12.  
    @coroutine
  13.  
    def watch(self):
  14.  
    c = Consul()
  15.  
     
  16.  
    # asynchronously poll for updates
  17.  
    index = None
  18.  
    while True:
  19.  
    try:
  20.  
    index, data = yield c.kv.get('foo', index=index)
  21.  
    if data is not None:
  22.  
    self.foo = data['Value']
  23.  
    except Timeout:
  24.  
    # gracefully handle request timeout
  25.  
    pass
  26.  
     
  27.  
    if __name__ == '__main__':
  28.  
    loop = IOLoop.instance()
  29.  
    _ = Config(loop)
  30.  
    loop.start()
  31.  
    复制代码

结合 consul-template 用解藕的方式去配置微服务

Consul Template 提供一个方便的方式从 Consul 获取数据通过 consul-template 的后台程序保存到文件系统。
这个后台进程监控 Consul 示例的变化并更新任意数量的模板到文件系统.作为一个附件功能,模板更新完成后 consul-template 可以运行任何命令.可以查看示例部分看这个功能将会对哪些应用场景产生帮助。

首先需要在 Consul Client 所在的宿主机安装 consul-template,由于 Demo 宿主机环境为 Mac OS,所以可以直接用 HomeBrew 进行安装。

  1.  
    $ brew install consul-template
  2.  
    复制代码

安装完成后进入仓库的 python-web-service 路径,这是一个用 tornado 写的简单的 Web 服务。执行如下命令:

  1.  
    $ cd python-web-service && docker-compose up -d
  2.  
    复制代码

等待命令运行完成,服务启动后,访问 localhost:8888 可以看到返回内容:

  1.  
    $ curl http://localhost:8888
  2.  
    Hello World
  3.  
    复制代码

然后我们回到仓库路径,进入 consul-template 目录,该目录主要包含以下两个文件:

  1.  
    $ cd ../consul-template
  2.  
    $ tree
  3.  
    .
  4.  
    ├── config.hcl # consul-template 配置文件
  5.  
    └── config.py.ctmpl # python-web-service 配置模版文件
  6.  
    复制代码

查看一下 config.hcl 文件的内容:

  1.  
    consul {
  2.  
    address = "127.0.0.1:8500"
  3.  
     
  4.  
    }
  5.  
     
  6.  
    template {
  7.  
     
  8.  
    source = "./config.py.ctmpl"
  9.  
    destination = "../python-web-service/config.py"
  10.  
    command = "docker restart python-web-service_python-web-service_1"
  11.  
     
  12.  
    }
  13.  
    复制代码

先介绍一下 *.hcl 配置文件,这个是 Consul 中非常常见的配置文件格式,也是 HashiCorp 下的产品所用的主要配置文件格式。配置文件中包含了 4 个重要的参数:

  • address —— Consul Client 的访问地址和端口
  • source —— 需要配置的服务的配置文件模板
  • destination —— 配置文件渲染后输出的路径
  • command —— 当配置变更后,需要执行的命令

再来看看模板文件 config.py.ctmpl

  1.  
    # -*- coding: utf-8 -*-
  2.  
    __author__ = 'gzp'
  3.  
     
  4.  
    GREETING = '{{ keyOrDefault "python-web-service/greeting" "Hello World" }}'
  5.  
    复制代码

模版文件的格式非常类似 Jinja2 的语法,这里的意思获取 key 为 python-web-service/greeting 下的值,默认值为 HelloWorld

接下来运行命令使 consul-template 生效:

  1.  
    $ consul-template -config config.hcl
  2.  
    复制代码

我们可以访问 Consul Web UI 的 Key/Value 来修改我们的值:

将 Hello World 修改为 Hello Consul,配置可能没有立即生效,若看到 consul-template 输出,则代表配置生效,服务以及重启:

  1.  
    $ consul-template -config config.hcl
  2.  
    python-web-service_python-web-service_1
  3.  
    复制代码

然后再次访问一下 web 服务:

  1.  
    $ curl http://localhost:8888
  2.  
    Hello Consul
  3.  
    复制代码

可以看到配置已经生效。

使用 Consul 作为 Python 微服务的配置中心的更多相关文章

  1. 阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08

    阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08

  2. 阿里巴巴微服务与配置中心技术实践之道 配置推送 ConfigurationManagement ConfigDrivenAnyting

    阿里巴巴微服务与配置中心技术实践之道 原创: 坤宇 InfoQ 2018-02-08 在面向分布式的微服务系统中,如何通过更高效的配置管理方式,帮助微服务系统架构持续"无痛"的演进 ...

  3. 【微服务】- 配置中心 - Nacos

    微服务 - 配置中心 - Nacos 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 今天的学习任务就是学习使用Nacos作为配置中心. 努力克制自己,拒绝摆烂! 什么是配 ...

  4. Consul微服务的配置中心体验篇

    Spring Cloud Consul 项目是针对Consul的服务治理实现.Consul是一个分布式高可用的系统,具有分布式.高可用.高扩展性 Consul Consul 是 HashiCorp 公 ...

  5. Spring Cloud微服务集成配置中心

    1. 搭建Spring Cloud Config配置中心(见上一篇博客) 2. 创建微服务项目bounter-simon-app,pom文件如下: <?xml version="1.0 ...

  6. 微服务之配置中心ConfigKeeper

    在微服务架构中,配置中心是必不可少的基础服务.ConfigKeeper已开源,本文将深度分析配置中心的核心内容,错过「Spring Cloud中国社区北京沙龙-2018.10.28 」的同学将从本篇文 ...

  7. .Net Core微服务系列--配置中心

    什么是配置中心 简单来说配置中心就是对配置进行管理的一个中心.对于配置这个司空见惯的东西,我们想想为什么对于应用程序需要各种各样的配置来支撑? 我们人类没有办法掌控和预知一切,所以映射到软件系统这个领 ...

  8. Python微服务实践-集成Consul配置中心

    A litmus test for whether an app has all config correctly factored out of the code is whether the co ...

  9. 推荐一款 Python 微服务框架 - Nameko

    1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 ​本篇文章 ...

随机推荐

  1. Jquery的$(document).click() 在iphone手机上失效的问题

    click事件和 touchstart事件共存 安卓IOS手机都适用 $(document).on("click touchstart", ".demo", f ...

  2. [Codeforces Educational Round 71]Div. 2

    总结 手速场...像我这种没手速的就直接炸了... 辣鸡 E 题交互,少打了个 ? 调了半个小时... 到最后没时间 G 题题都没看就结束了...结果早上起来被告知是阿狸的打字机...看了看题一毛一样 ...

  3. L1219

    八皇后问题. 然而重点在于判断斜线attack问题和 剪枝问题, 不过判断斜线这些东西都挺有意思的. 是坐标的思想但是 有不一样, 因为这个棋盘.. 斜线判断是可以理解了. 但是我想知道的是这个的原理 ...

  4. Windows加载器与模块初始化

    本文是Matt Pietrek在1999年9月的MSJ杂志上发表的关于Windows加载器与模块初始化方面的文章.作者深入分析了LdrpRunInitialize璕outines例程的作用,用C语言写 ...

  5. mysql ERROR 1862 (HY000): 密码超时错误解决 Your password has expired.To log in you must change it using a client that supports expired password

    工具链接可能报错,使用黑窗口链接后: 1. SET PASSWORD = PASSWORD("xinmima"); 2. flush privileges; 使用新密码链接即可.

  6. jQuery - 添加元素append/prepend和after/before的区别

    append <p> <span class="s1">s1</span> </p> <script> $(" ...

  7. 9-ESP8266 SDK开发基础入门篇--编写串口上位机软件

    https://www.cnblogs.com/yangfengwu/p/11087613.html 页面修改成这样子             现在看串口发送数据 点击点亮 发送0xaa 0x55 0 ...

  8. vue中前端弹窗队列展示

    在前端写一个弹窗可能很简单,那如果同时有多个弹窗呢 这样的话就要考虑弹窗的展示问题,肯定是不能叠加在一起的,这时候就要通过队列(先进先出)来展示 思路就是根据队列来实现,至于具体的实现方式,可以在项目 ...

  9. Cogs 1632. 搬运工(二分图最小点覆盖)

    搬运工 ★ 输入文件:worker.in 输出文件:worker.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 小涵向小宇推荐了一款小游戏. 游戏是这样的,在一个n*n的地 ...

  10. 【loj2552】【CTSC2018】假面

    题目 有\(n\)个敌方单位,初始生命值分别为\(m_1,\cdots,m_n\) : 假面可以释放\(Q\)个技能: $op = 0  ,  id , u , v $ 表示对\(id\)号敌人有\( ...