[eggjs/egg]为什么egg-sequelize 会在configWillLoad之前读取配置?

2025-11-04 79 views
7
What happens?

为什么egg-sequelize 会在configWillLoad之前读取执行?

复现步骤,错误日志以及相关配置

相关环境信息 操作系统:mac Node 版本:10 Egg 版本:2.22.2

回答

7

这个问题,我帮他补充一下场景,他现在使用 zk 之类的做远程配置,希望在其它插件加载之前把配置更改为远端配置,但是很多插件都是在 configWillLoad 之前就消费配置的,有什么异步的钩子能够在插件加载前来提供给远端配置来注入配置吗?

9

:heart: 借这个issue讨论

1.配置的作用时机

个人以为egg或者说实现插件的配置,当前比较类似静态配置,在启动的过程中进行加载,无论是配置的合并功能,还是配置的的读取都在配置使用之前,加载完成后,则不再发生变化。类似zookeeper的配置就是一个配置中心,也就是说egg启动之后已经加载的配置(或者是所有配置加载之前),都需要一个配置重新初始化的一个过程。

2.动态配置的影响

从全局来说配置成为了一个动态变化的状态,那么每一项最后更新的配置对使用配置方有多大的影响,比如MySQL的连接地址或者Redis的连接地址发生了变化,那么就需要重新初始化MySQL或者Redis实例化对象。也就是要求配置使用方,能够检测到配置的动态变化,并进行重新配置,这一块,我的理解也应该是黑盒操作。

3.插件内使用配置

egg提供了插件的加载机制,那么是否可以在插件加载的过程中,去从zookeeper获取配置,这样算是在某种程度上解决问题。我的理解是,插件是一个内聚的功能,其本身的配置,初始化,应该在插件内进行,如果在插件外,依赖zookeeper配置,插件是不是就不内聚了(存在不确定依赖)。

9

为什么egg-sequelize 会在configWillLoad之前读取执行?

这应该是因为 egg-sequelize 未使用新的生命周期模型,需要做一次重构

6

最主要的问题还是 egg 在生命周期之前的 hook 映射到生命周期就是 configWillLoad,然后整个社区的插件没办法一下子调整,而且调整的时候可能会牵涉到兼容性的问题(移到一下一个生命周期),所以修改的进展很慢。

4

@qingdengyue 其实应该有一个动态配置的插件(或者内置),第三方插件可以去实现这个 API,像 mysql 这些插件可以依赖这个动态配置来获取配置。