python 关于热更新与热加载那点事
聊聊热加载、热更新
知识有限,只谈谈自己对这块的了解,说的不对的地方还希望指出哈。
前段时间有个哥们说java微服务 有个配置中心spring cloud config 可以做到 配置文件热更新、热加载。基于此,提供一套Python 方案,当然对于spring来说,这个方案确实有点过于简陋(精简),尤其是如果用于微服务的时候。python 的微服务还不够完善,后续关注下nameko +py某web框架 有没有类似的方案,大家如果有时间也可以顺着spring 的方案弄一个呗,如果不觉得繁琐的话。当然如果项目不大的话,其实是可以直接重启呗,也就不到两秒钟的事情。看看各位的项目需要。
1、修改代码使用reload
其实就是在代码中import 相关模块,并用reload 方法重新加载相关参数,这种方法会实际上修改代码,在不需要重启服务的情况下,重新加载相关模块。在网上找了个简单的例子:https://blog.csdn.net/u013421629/article/details/89211695
只要提交代码到服务器上就可以了,简单粗暴,不需要重启。但是如果代码中有大量的地方需要reload。确实有点头大。
2、修改内存中的配置文件
因为项目的配置文件中的变量属于全局变量。这时候可以修改这个全局变量。这就更加简单了。提供一个接口(此处安全问题暂时忽略),传递配置文件相关参数。在接口中修改相关全局变量。
3 、autoreload
框架中的自动加载模块。试了几下,没成功,略过了,应该是可以的。
4、参照spring cloud config的方案。手动实现
原理介绍
springCloudConfig分服务端和客户端,服务端负责将本地,git或者svn中存储的配置文件发布成REST风格的接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置,这需要每个客户端通过POST方法触发各自的/refresh接口。而我们上面说的SpringCloudBus就发挥了其作用了
SpringCloudBus通过一个轻量级消息代理连接分布式系统的节点(有点像消息队列那种)。这可以用于广播状态更改(如配置更改)或其他管理指令。SpringCloudBus提供了通过post方法访问的endpoint/bus/refresh(spring boot 有很多监控的endpoint,比如/health),这个接口通常由git的钩子功能(监听触发)调用,用以通知各个SpringCloudConfig的客户端去服务端更新配置。
git服务器会从远程git拉取配置文件,并存入到本地git文件库,当远程git不可用时,会从本地git文件库拉取配置信息
下面是一张spring cloud config结合bus的一张工作流图(来自于某大神)