-
Notifications
You must be signed in to change notification settings - Fork 387
pinus手动热更新方法
smallwhite edited this page Feb 20, 2021
·
6 revisions
nodejs的热更新的原理就是通过 delete require.cache[x]
然后重新 require
现在pinus框架提供了 handler remoter crons的热更新方法,
热更新流程大概是这样:
- 先 delete 应用自己的 cache (https://github.com/node-pinus/pinus/issues/155)
- manualReloadHandlers(app) 热更新 handler
- manualReloadRemoters(app) 热更新 rpc handler
- manualReloadProxies(app) 这个更新rpc代理接口,暂时只支持新添加的方法,不支持新添加的文件,还没有时间搞。
- manualReloadCrons(app) 热更新crons。
可以根据自己对应进程的逻辑需要来调用。
至此,基本可以实现完整的应用不停机热更新。
有一点需要注意 manualReloadProxies(app) 这个方法的调用需要保证在 manualReloadRemoters(app) 调用之后。 因为 manualReloadProxies 不会清除 remoter的缓存。manualReloadRemoters这个方法会清除缓存。 所以这两个方法是成双成对的。 如果没有对remoter添加新方法,manualReloadProxies 就不需要调用。
经过测试,
manualReloadProxies
方法有很大机率造成内存泄漏(也有可能是我们公司项目的特殊性造成的),线上使用请仔细测试。也可以选择不用这个方法,也就是不支持新添加的rpc方法,特殊情况下可以通过 直接调用 rpcInvoke来替代。
manualReloadProxies
的替代方法:
proxyConfig
添加 dynamicUserProxy:true
参数 使用动态 rpc.user.servertype rpc 方法 ,将支持 热更新的 新rpc方法与新rpc文件
参考设置:
app.set('proxyConfig', {
mailboxFactory: createTcpMailBox,
// bufferMsg:true
// rpc 超时时间
timeout: 20 * 1000,
dynamicUserProxy: true,
});