使用 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)
-
-
-
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
-
复制代码
可以看到配置已经生效。
原文地址:https://www.cnblogs.com/ExMan/p/11945129.html
- android 减少图片出现oom错误
- android分包方案
- 系统负载能力浅析
- 微软正式发布了Microsoft.Bcl.Async
- parcel和parcelable
- Windows Phone 7 WebBrowser 中文乱码问题
- Java并发包类总览
- 作业调度框架 Quartz.NET 2.0 beta 发布
- 系统捕获异常并发送到服务器
- 当调用GetAuthorizationGroups() 的错误-“试图访问卸载的应用程序域“(Exception from HRESULT: 0x80131014)解决方案
- WCF 4.0路由服务Routing Service
- ExpandableListView简单应用及listview模拟ExpandableListView
- 文件句柄与文件描述符
- android GifView分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如果用java swing编写一个五子棋(人人对战)
- 【mysql系列】细谈explain执行计划之“谜”
- 洛谷 P1352 没有上司的舞会(树形 DP)
- CF思维联系– CodeForces - 991C Candies(二分)
- 洛谷P1122 最大子树和 树形DP初步
- JAVA_WEB--jsp语法
- 图论--树的直径--DFS+树形DP模板
- js逐步教你实现原生电影院系统
- JAVA_WEB--jsp概述
- js逐步教你实现原生古诗匹配系统
- c++从入门到进阶--引用与常量
- 图论树的直径
- 白话k8s-Pod的组成
- Jaba_Web--JDBC 修改记录操作模板
- h5逐步实现 <<canvas系统>>