0.2.12 • Published 5 years ago

mixer-lib v0.2.12

Weekly downloads
2
License
ISC
Repository
github
Last release
5 years ago

系统集成库

使用本库可以把多个分散的项目集成到一个 http 服务器中, 而不需要修改项目代码.

安装

npm install mixer-lib --save

配置对象

配置文件在 ./config/config.js 中定义相同, 但配置文件无法设置 whenLoad, 编程配置优先于文件配置, 空余项可以被文件配置补充; 不推荐使用 nodejs 的 ssl, nginx 做代理加入 ssl 模块效率更高;

var conf = {
  // HTTP 服务端口号
  port      : 81,  

  // 集群配置:
  //  5     设置为5个进程;
  //  0.5   使用一半数量的处理器,
  //  -2    留出 2 个空闲处理器
  //  true  使用全部处理器, 或设置 0
  //  false 单进程
  cluster   : false,

  // 这个参数必须设置
  whenLoad  : Function   

  // 使用 https 创建服务器需要的选项,
  ssl : {     
    // 完整的文件路径             
    key  : 'privatekey.pem',
    cert : 'certificate.pem',
  }
};

使用1 (<=0.1 版本支持)

var mixer = require('mixer-lib');
mixer.create_http_mix_server({ whenLoad : whenLoad });

function whenLoad(app_pool, exdata) {
    var sinopia_app = sinopia(config);
    var sinopia_route = app_pool.addApp(mixer.express(sinopia_app));
    sinopia_route.add('/');

    var mana_route = app_pool.addApp([some_function], '/some');
}

使用2 (>=0.2 版本支持)

相比使用1是更方便的 api.

var mixer = require('mixer-lib');
mixer.auto_init(whenLoad, ext_data);

function whenLoad(app_pool, exdata, config) {
    app_pool.addApp(Function, route_path);
}

HTTPS 认证密钥的生成

生成私钥key文件
openssl genrsa -out privatekey.pem 1024

通过私钥生成CSR证书签名
openssl req -new -key privatekey.pem -out certrequest.csr

通过私钥和证书签名生成证书文件
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

Events

app_pool 可能发出的消息

beforeFirstLoad

服务器第一次启动之前发出的消息

afterFirstLoad

服务器第一次启动之后发出的消息

beforeEnd

在服务器准备停止之前发出

afterReload

在服务器重新加载之后发出

err_no_start

服务器启动失败, 如果没有对应的监听器将抛出异常到调用 create_http_mix_server 处,
此时进程可能终止.

error

进入服务状态后发生的错误, 如果发生 EADDRINUSE (端口被占用服务不能启动) 错误,
且没有监听器监听 error 事件, 则进程会退出, 退出码 98

API

./test/demo.js 中有可立即运行的代码

function whenLoad(app_pool, exdata, config)

服务器启动/重启时的回调函数, 在函数中使用 app_pool 添加应用.
* app_pool -- 用来注册服务/应用
* exdata   -- 调用 auto_init()/create_http_mix_server() 时传入的参数
* config   -- 全局配置文件

Function serviceApp(request, response, next)

应用/服务函数前面, 可用 app_pool 插入混合器, 当与之关联的路由被请求时回调.
request/response 与 http 库中的相同;
request.base 增加的属性, 用于指明调用当前服务时匹配的根路径
next:Function(err, msg) 被调用后会执行默认应当给客户端, 设置 err 返回 500,
只设置 msg 返回字符串, 否则返回 404.

mixer.create_http_mix_server(config , ex_data)

创建并启动服务器; config.whenLoad 函数必须设置.  
在加密项目中 (program-crypto-lib) 调用该方法会在日志中写入授权信息, 通常也会打印到屏幕上.

mixer.write_pid(config)

内部函数

mixer.cluster_manager(conf, master_function, slaver_function)

集群管理器, 按照 conf.thcount 数量启动集群; conf.run_on_listenning == true,
则在前一个进程启动 tcp 监听后启动新进程, 否则在前一个进程启动后立即启动新进程.

master_function(config) 主进程任务函数, config 为全局配置文件, 主线程会更新配置文件.
slaver_function(config, address, worker, auto_port) 非主进程任务函数, 副进程不会更新配置文件,

address 为上一个副进程启动后启动 http 服务的地址.
auto_port 用来在集群上产生不同的监听端口, 如果使用这个特性, 一旦端口被占用且进程终止
代码为 98 EADDRINUSE 则副进程启动时会使用一个新的端口 (+1), 这个特性适合使用随机端口的情况.

工作进程如果出现死循环 (同步代码 60 秒未返回), 主进程将杀死它并启动一个新进程.

mixer.auto_init(whenLoad , ext_data);

如果调用该方法的模块是全局根模块, 则会启动 http 服务
并读取全局配置文件 (参考 configuration-lib 的 lib.auto_init(...))
否则不会启动服务, 但会尝试导出 whenLoad 函数. 日志中会有记录.
该方法不支持单机集群.

app_pool.addApp(serviceApp , path_string)

将应用插入混合器, 并返回 route 对象用来设置路由;
或设置 path_string 参数来设置路由路径, 这样可以更方便, 切不需要 route 对象.

app_pool.reload()

重新启动服务器并从磁盘重新加载代码
(条件: 重新加载的代码必须在 whenLoad 函数中被 require)

app_pool.removeApp(route_path)

删除路径对应的应用/服务; 如果应用注册了多个路由, 哪些路由仍然有效

app_pool.on(eventName, callback)

接收服务器发来的事件

route.add(path_string | array | route_saver)

route 是与应用关联的路由设置器, 允许设置多个路由.

mixer.create_route_saver()

创建路由保存器 reoute_saver 可以通过 route.add 插入路由表中.
reoute_saver(path) 可以添加新路由.

mixer.native(Function app())

mixer.express(Function app())

mixer.thinkjs(config)

mixer.dish(Function app())

这些方法用来把为针对特定中间件api写的app转换为 mixer api 的中间件.
返回的对象可以直接调用 app_pool.addApp(...)
(你确定要用 thinkjs ?!)

UTIL 工具

工具库在不使用时并不加载, 不会占用资源

var net = mixer.util.net()

创建网络工具, http 库不支持传递 header.

net.get(url, parm, cb)

* 使用 utf8 编码发送 HTTP.GET 请求
* url  -- 请求url
* parm -- 参数对象 JSON
* cb   -- 完成后的回调: function(err, dataObj)
* dataObj 使用参考 DATA 包

net.post(url, parm, cb)

* 使用 utf8 编码发送 HTTP.POST 请求
* url  -- 请求url
* parm -- 参数对象 JSON
* cb   -- 完成后的回调: function(err, dataObj)
* dataObj 使用参考 DATA 包

var data = mixer.util.data();

创建一个数据包装器  
不要修改包装器 *返回的对象*, 如果需要自行缓存这些对象

构造: 参数必须为字符串:  
`var d = data.fromTxt('some')`

构造: 参数必须是对象  
`var d = data.fromObj({b:1234})`

构造: 参数必须是 xml 字符串  
`var d = data.fromXml("<xml .../>")`

var r = d.txt()

返回原始字符串

var r = d.obj()

返回解析后的 OBJECT, 失败返回 null

var r = d.xml()

返回 XML 字符串, 失败返回 null

var mid = mixer.util.mid()

返回中间件库 MID package

mid.ex_static(localpath, url_prefix)

localpath  - 本地路径  
url_prefix - url 的前缀  
映射一个 url 前缀到本地目录, 该 url 后的所有请求返回
该本地目录中的文件; 并不推荐, 用 masquerade 替代.

mid.ex_log(bootstrap)

ex_log 日志查看服务 (该服务的实现在 logger-lib 中),
bootstrap 的说明见 logger-lib 库.

mid.ex_reload(app_pool)

重启服务, 密码在控制台生成

var lifecycle = mixer.util.lifecycle()

加载可中断定时器库, 与 setInterval 定时器不同, 该定时器通过外部中断可以
让回调延迟到下一个周期中.

lcobj = lifecycle(interval_seconds, task_func)

创建一个定时器实例, 每间隔 interval_seconds 秒调用一次 task_func.

lcobj.update(); lcobj.interrupt(); lcobj.skip();

这些函数都是中断定时器, 使回调函数从调用时间点延迟一个周期.

lcobj.stop(); lcobj.kill(); lcobj.end();

这些函数都是终止定时器, 释放资源.