Skip to content

pinus手动热更新方法

smallwhite edited this page Feb 20, 2021 · 6 revisions

nodejs的热更新的原理就是通过 delete require.cache[x] 然后重新 require

现在pinus框架提供了 handler remoter crons的热更新方法,

热更新流程大概是这样:

  1. 先 delete 应用自己的 cache (https://github.com/node-pinus/pinus/issues/155)
  2. manualReloadHandlers(app) 热更新 handler
  3. manualReloadRemoters(app) 热更新 rpc handler
  4. manualReloadProxies(app) 这个更新rpc代理接口,暂时只支持新添加的方法,不支持新添加的文件,还没有时间搞。
  5. 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,
    });
Clone this wiki locally