
很多搞微服务的同学一听到服务发现和配置中心就头疼。说实话这东西确实绕,名字听起来也吓人。但如果你真去做了会发现,核心逻辑其实很简单。
打个比方,你开了一家连锁奶茶店。以前只有一家店,客人找上门就行。现在有了十家店,客人得知道哪家店开着,哪家店今天不做生意。这就是服务发现。配置中心就更像店里的菜单,总店统一发一个版本,所有分店照着做,省得每家店自己瞎改。
我用过Eureka、Zookeeper,最后发现Consul最省心。它把服务发现和配置管理揉在一起,一个东西干两件事。对Python开发者来说,集成consul也很直接,不像Java那样要搞一堆注解。
安装consul很简单,官网下载解压就能跑。开发环境里用consul agent -dev启动。你打开浏览器访问localhost:8500,就能看到控制台页面。这页面虽然丑点,但信息很清楚。
Python这边装个python-consul2库就够了。别装老版,踩坑经验之谈。下面这段代码就是注册服务的基本操作:
import consul
c = consul.Consul(host='localhost', port=8500)
c.agent.service.register(name='user-service',
service_id='user-1',
address='192.168.1.100',
port=5000,
tags=['v1', 'api'])
注册后去consul页面能看到服务状态。记得给每个实例配不同的service_id,不然新实例会覆盖旧的。我用UUID生成service_id,虽然丑但保证唯一。
服务发现的核心是健康检查。Consul默认每10秒检查一次服务是否活着。如果某个服务挂了,consul会自动把它踢出去。你调用服务时,先从consul拿健康的实例列表,再挑一个用。这样即使某个服务挂了,调用方也不会收到错误响应。
健康检查配置在服务端。下面是在python-consul2里注册带健康检查的服务:
c.agent.service.register(name='order-service',
service_id='order-1',
address='192.168.1.101',
port=5001,
check=consul.Check().tcp('192.168.1.101', 5001, '10s'))
这里用TCP检查,10秒一次。如果你服务有专门的健康检查接口,也可以用HTTP检查。
配置中心比服务发现更实用。很多项目上线后改配置是个大麻烦。环境变量改来改去,重启服务搞得同事抱怨。用consul统一管理配置,改完立即生效,不用重启。
consul用键值对存配置。你可以按应用、环境、版本分层次存。比如:
c.kv.put('config/order-service/prod/db_host', '10.0.0.1')
c.kv.put('config/order-service/prod/db_port', '3306')
c.kv.put('config/order-service/prod/debug', 'false')
应用启动时从consul拉配置,然后启动服务。如果想实现动态刷新,可以开一个后台线程每隔30秒检查配置版本号变了没。变了就重新加载。
有同学问网络断了怎么办。consul有本地缓存,服务发现和配置都缓存一份在本地。网络恢复后自动同步。虽然会有短暂的不一致,但比系统完全不能用强。
实际项目中要注意的事情。第一,consul集群至少要部署3个节点,consul用Raft协议保证一致性。单节点一挂服务就全完蛋。第二,注册服务时加标签便于分组,比如test和prod环境用不同标签区分。第三,不要用consul存大文件,它设计存的是小配置,几MB以内可以,大了会影响性能。
我还见过有人在consul里存成百上千个Key。consul的KV存储支持目录结构,按路径前缀做范围查询。但查询时注意别用遍历,用前缀查询比遍历快得多。
最后说一点坑。python-consul2这个库的文档写得不清楚。有些方法的参数名和实际API不一样。比如注册服务时service_id参数,文档里叫service_id,实际上写service_id也行。最重要的是版本兼容,consul 1.9和1.10的API有些差异。开发时最好用和线上一样的版本。
微服务这东西,工具选对了能少走弯路。Consul加Python的组合,中小团队用着挺顺手。你按这个路子试一次,下次就不会觉得服务发现难搞了。
以上就是“学会用Consul加Python集成,微服务架构不虚”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14343/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料