eggjs 或 midway 有没有办法异步加载配置文件
发布于 5 年前 作者 zhengxsFE 8365 次浏览 来自 问答

目前后端统一管理 redis 等服务的配置信息,在应用启动前通过 http 加载配置,然后再创建应用

如果是用 koa 比较方便的实现,目前想试水 eggjs 或 midway

eggjs 或 midway 有没有办法实现这种需求,或者 plugin.js 里面禁用了,能不能手动在启用(前提是异步改的配置能起作用,看文档是同步的)?

虽然可以抽成一个配置进行管理,但是有些东西需要一些动态配置,需要比较灵活的方式进行挂历

eggjs 的 github 上看到了 egg config 异步支持#3225 目前是开放的,midway 有个询问异步启动的,但是目前都没有关闭

22 回复

哦,可以直接挂载到 app 上有方法

可以的,直接serverless不更好么

midway 可以的, 对于 construct 有 @init 注解。 也可以在 app.js 里面异步加载,egg midway 都支持。

@i5ting image.png 这里应该只支持同步的修改吧?异步的话是需要在didlload生命周期里去拉取然后手动合并?

@shenqidebaozi 不能挂 app,是插件的配置,redis 的配置是存储在数据库的 @JsonMa 我也是看的这个 @i5ting 狼叔 serverless 是好,但是只有过腾讯云出的,自己这么弄?serverless 看到的都是要收费的,但是我们自己买的是 linux 服务器,能自己配置相关环境么 @waitingsong 谢谢,我试试

异步目前看来似乎在生命周期里面应该不行(配合一些插件的话),configwiiload是同步的钩子,如果需要异步,只能说启动完成后不能保证config对象是预期的配置,所以,我觉得如果异步的话,最好在启动后通过emit告知业务逻辑异步config已经修改好,然后其他依赖于这些config的业务再运行,不过这样一些插件就没办法按照预期的运行了。我看到egg-redis的初始化去阻塞app启动是用旧的app.beforeStart(),里面可以加async方法,但这个API比较泛,没有像新的有区分,所以没办法确保在里面异步修改config会在egg-redis加载前完成。

@waitingsong 大佬 init 装饰器的文档链接有么,我没找到

@HobaiRiku 现在已经不推荐使用beforestart了,替代方案是lifecycle,可在egg-core的lifecycle.js找到,之前想提个pr,在 triggerConfigWillLoad 中支持async。。。@i5ting 大佬有什么看法?

@zhengxsFE 有种委婉的方案是可行的,基于环境变量来实现启动前异步加载配置,如果在egg didlload中是支持的就可以不去考虑了,这个我稍后在didload中尝试下

@JsonMa 虽然是这样,但是很多插件还没有更新,另外如果更新了,官方也是建议在didload上运行插件初始化,所以这里又没办法去找比这个更前的async钩子了,还是没办法直接异步做,所以,如果configWillLoad是支持异步的话似乎就没有什么问题了。我这边一直都是在configWillLoad里面用readFileSync,这样来加载自定义的配置,如果是类似做配置系统,只能说启动前先pull好这个自定义配置文件。

@waitingsong 这个不是给启动的,只有用 @provide 装饰过的才可以

@JsonMa 环境变量太约束了,会限制死程序的,我们未来会有两套独立的系统,互相之间不能访问数据的

@JsonMa triggerConfigWillLoad 官网文档没写,估计用途不是这个吧

@zhengxsFE https://github.com/JsonMa/egg-apollos 考虑下apollo配置中心吧 我们目前是这种方式实现的异步获取配置

因为现在 2.0 不能 break,所以要到 3.0 才能有。 现在的解决方案可以是:在 agent 的 钩子里面去请求配置,写入文件;然后在 app 的 config 里面 require 这个文件

https://github.com/atian25/egg-remote-config

@atian25 已看到 github 上的回复了,期待 3.x 解决,感谢各位的努力,让我们用到这么好的框架

@atian25 agent通过钩子获取然后写入自定义配置文件,除了感觉有些怪异,使用倒是挺OK的。

mark 这个应该是个常见的需求

回到顶部