服务端模块热更新
fibjs
的 http server 是常驻内存的独立服务器程序,这意味着有版本更新的时候往往需要重启服务程序。
假设有以下服务程序:
web.js
http handlerapp.js
应用入口
1
2
3
4
5
6// web.js
var _ver = new Date();
module.exports = function (r) {
r.response.write("Hello, new word @ " + _ver);
}
1
2
3
4
5
6
7
8
9// app.js
var http = require("http");
var vm = require("vm");
var coroutine = require("coroutine");
var webServer = require("./web");
var svr = new http.Server(8080, webServer);
svr.start();
在 app.js
直接引用 web.js
, 当每次更新应用的时候,都必须重启 app.js
,有没有办法可以在更新代码的同时,让 app.js
自动加载最新的 web.js
呢?
我们可以通过 fibjs 的原生 SandBox 模块来实现平滑的热更新。对 app.js
做一些更改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// app.js
var http = require("http");
var vm = require("vm");
var coroutine = require("coroutine");
// var webServer = require("./web");
function new_web() {
return new vm.SandBox({
mq: require("mq")
}).require("./web.js", __dirname);
}
// update svr.handler every 1 second.
coroutine.start(function() {
while (true) {
coroutine.sleep(1000);
svr.handler = new_web();
}
})
var svr = new http.Server(8080, new_web());
svr.start();
app.js
中启动了一个循环,每隔 1s 重新 require
一次 web.js
中的内容生成安全的模块,用于为 svr
重新挂载 handler
。当 web.js
中的内容需要更新的时候,只需替换该文件,即可实现服务端程序的平滑更新。
👉 【高性能 Web 应用程序实践】