半部分主要为 Consul 的一些介绍,若已经了解 Consul,能够直接跳转到:html
使用 Consul 做为 Python 微服务的配置中心python
Consul
是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。Consul 是分布式的、高可用的、 可横向扩展的。它具有如下特性:linux
Key/Value
存储: 应用程序能够根据本身的须要使用 Consul 提供的 Key/Value 存储。 Consul 提供了简单易用的 HTTP 接口,结合其余工具能够实现动态配置、功能标记、领袖选举等等功能。
Consul 集群间使用了 Gossip
协议通讯和 raft 一致性算法。上面这张图涉及到了不少术语:nginx
这里先简单介绍一下 Gossip
协议的执行过程:git
Gossip 过程是由种子节点发起,当一个种子节点有状态须要更新到网络中的其余节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中全部的节点都收到了消息。这个过程可能须要必定的时间,因为不能保证某个时刻全部节点都收到消息,可是理论上最终全部节点都会收到消息,所以它是一个最终一致性协议。github
如今,咱们经过一个具体的实例来深刻体会一下 Gossip 传播的完整过程: 为了表述清楚,咱们先作一些前提设定 一、Gossip 是周期性的散播消息,把周期限定为 1 秒 二、被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3 个节点散播。 三、每次散播消息都选择还没有发送过的节点进行散播 四、收到消息的节点再也不往发送节点散播,好比 A -> B,那么 B 进行散播的时候,再也不发给 A。 这里一共有 16 个节点,节点 1 为初始被感染节点,经过 Gossip 过程,最终全部节点都被感染:web
注意要点:算法
名称 | 优势 | 缺点 | 接口 | 一致性算法 |
---|---|---|---|---|
zookeeper | 1.功能强大,不只仅只是服务发现 2.提供 watcher 机制能实时获取服务提供者的状态 3.dubbo 等框架支持 |
1.没有健康检查 2.需在服务中集成 sdk,复杂度高 3.不支持多数据中心 |
sdk | Paxos |
consul | 1.简单易用,不须要集成 sdk 2.自带健康检查 3.支持多数据中心 4.提供 web 管理界面 |
1.不能实时获取服务信息的变化通知 | http/dns | Raft |
etcd | 1.简单易用,不须要集成 sdk 2.可配置性强 |
1.没有健康检查 2.需配合第三方工具一块儿完成服务发现 3.不支持多数据中心 |
http | Raft |
首先 clone
本项目到本地:docker
Consul 单机部署所须要用到的文件以下:bootstrap
docker-compose
配置文件docker-compose
配置文件能够看到两个 docker-compose 文件均暴露了 8 个端口。根据官方文档,这些端口的做用以下:
Ports Used
Consul requires up to 6 different ports to work properly, some on TCP, UDP, or both protocols. Below we document the requirements for each port.
- Server RPC (Default 8300). This is used by servers to handle incoming requests from other agents. TCP only.
- Serf LAN (Default 8301). This is used to handle gossip in the LAN. Required by all agents. TCP and UDP.
- Serf WAN (Default 8302). This is used by servers to gossip over the WAN, to other servers. TCP and UDP. As of Consul 0.8 the WAN join flooding feature requires the Serf WAN port (TCP/UDP) to be listening on both WAN and LAN interfaces. See also: Consul 0.8.0 CHANGELOG and GH-3058
- HTTP API (Default 8500). This is used by clients to talk to the HTTP API. TCP only.
- DNS Interface (Default 8600). Used to resolve DNS queries. TCP and UDP.
还有一些配置参数这里就不一一介绍了,官方文档写的很是详细。
首先须要给环境变量 CONSUL_SERVER_IP_ADDR
赋值,若为 ECS 则为 ECS 的外网 IP,这里也是演示在 ECS 部署。
而后运行,这里没有使用 -d
参数,方便查看日志:
运行 docker-compose 前,设置 CONSUL_SERVER_HOST
环境变量:
而后运行:
部署完成后能够经过 Consul UI 的 Nodes
看到两个 Healthy Nodes
:
也能够在部署好 Consul Client 的宿主机上运行:
这里要注意:
在查看了 Consul
仓库的 issue#1720 发现,Consul 提供的 Web UI 并无提供 Auth 功能,因此可能要依靠第三方服务来实现,评论中也有提到:
highlyunavailable commented on 17 Feb 2016
When I ran a Consul Web UI I just used nginx and github.com/bitly/oauth… to provide authentication.
可是 HTTP 接口的权限,能够经过 Consul ACL 来控制,这是后话。
Consul 做为数据中心,提供了 k/v
存储的功能,咱们能够利用这个功能为 Python 微服务提供配置中心。
Consul 提供了 HTTP 接口,咱们能够从他的接口获取数据,固然咱们不用本身去实现,python-consul 已经帮咱们造好了轮子。
并且官方文档很是贴心,已经贴好了 Python 经常使用框架的一些 demo 代码:
Consul Template 提供一个方便的方式从 Consul 获取数据经过 consul-template 的后台程序保存到文件系统。
这个后台进程监控 Consul 示例的变化并更新任意数量的模板到文件系统.做为一个附件功能,模板更新完成后 consul-template 能够运行任何命令.能够查看示例部分看这个功能将会对哪些应用场景产生帮助。
首先须要在 Consul Client 所在的宿主机安装 consul-template
,因为 Demo 宿主机环境为 Mac OS,因此能够直接用 HomeBrew
进行安装。
安装完成后进入仓库的 python-web-service
路径,这是一个用 tornado 写的简单的 Web 服务。执行以下命令:
等待命令运行完成,服务启动后,访问 localhost:8888
能够看到返回内容:
而后咱们回到仓库路径,进入 consul-template
目录,该目录主要包含如下两个文件:
查看一下 config.hcl
文件的内容:
先介绍一下 *.hcl
配置文件,这个是 Consul 中很是常见的配置文件格式,也是 HashiCorp
下的产品所用的主要配置文件格式。配置文件中包含了 4
个重要的参数:
address
—— Consul Client 的访问地址和端口source
—— 须要配置的服务的配置文件模板destination
—— 配置文件渲染后输出的路径command
—— 当配置变动后,须要执行的命令再来看看模板文件 config.py.ctmpl
:
模版文件的格式很是相似 Jinja2
的语法,这里的意思获取 key
为 python-web-service/greeting
下的值,默认值为 HelloWorld
。
接下来运行命令使 consul-template
生效:
咱们能够访问 Consul Web UI 的 Key/Value
来修改咱们的值:
将 Hello World
修改成 Hello Consul
,配置可能没有当即生效,若看到 consul-template
输出,则表明配置生效,服务以及重启:
而后再次访问一下 web 服务:
能够看到配置已经生效。