- ddv-worker 是 ddv 的一个核心模块,他实现了整个线程的管护和管理,已经虚拟主机的 socket 的线程之间的转发
var worker = require('ddv-worker');
- 所有的站点都依赖这个模块开发,该模块需要开发者提供一个http-server
- 比如封装了 testworker.js
'use strict';
//定义进程标题
process.title = 'ddvSizeTest';
//jsnet模块-子线程模块
const worker = require('ddv-worker');
//Express 应用生成器
const express = require('express');
//生成一个应用
const app = express();
//服务调度模块
worker.server = http.createServer(app);
//app的进一步开发
worker.config = Object.create(null);
//标记没有启动过
let isStart = false ;
//导出一个模块-服务启动
module.exports = function start(c){
worker.config = c || worker.config || Object.create(null);
c = void 0;
if (isStart===true) {
//防止重复启动
console.warn('不能重复开始');
return ;
}
worker.server.setConfig(worker.config);
//发送所以修改给管理线程,更新 监听信息
worker.updateServerConf({
//修改是否默认监听站点
defaultListen: worker.config.defaultListen,
//修改监听数组
listen : worker.config.listen,
//修改监听cpu核数
cpuLen : worker.config.cpuLen,
}, (e)=>{
if (e) {
console.log(`[pid:${process.pid}][wid:${worker.id}]更新服务器监听配置参数失败!`);
}else{
console.log(`[pid:${process.pid}][wid:${worker.id}]更新服务器监听配置参数成功!`);
}
});
};
/***********************异常错误处理模块开始***********************/
//服务器错误捕获,抛出到server::error
worker.server.on('error', function (e) {
//客户端socket重置 忽略这一错误
if (e.message == 'read ECONNRESET'&&e.name === 'Error') {
return false;
}else{
worker.emit('server::error',e);
}
e = undefined ;
});
//server错误捕获处理
worker.on('server::error',function(e){
if(e.stack){
e.stack = Error().stack;
}
e.stack +='\nthis error is server error';
worker.emit('error',e);
});
//socket错误捕获处理
worker.on('socket::error',function(e){
if(e.stack){
e.stack = Error().stack;
}
e.stack +='\nthis error is socket error';
worker.emit('error',e);
});
//错误
worker.on('error',function(e){
console.error(`[pid:${process.pid}][wid:${worker.id}]服务器内部错误开始`);
console.error(e);
console.error(`[pid:${process.pid}][wid:${worker.id}]服务器内部错误结束`);
console.error(Error().stack);
});
/***********************异常错误处理模块结束***********************/
- 以下是index.js
require('./testworker.js')({
//非默认站点
defaultListen:false,
//监听数组
listen:[
{
'type':'tcp',
'host':'rpc.iceovideo.ping-qu.com',
'port':80
}
],
//监听cpu核数
cpuLen:1
});
- 通过以下代码运行
node index.js
- master.js
//引入管理线程模块
const master = require('ddv-worker');
master.on('error',function masterError(e){
log.tip('ERR ','MASTER_ERROR_WARN');
log.error(e);
});
master.on('server::listening',function masterError(info){
log.tip('INFO',['MASTER_SERVER_LISTENING', info&&info.type_port_ip]);
});
master.on('server::close',function masterError(info){
log.tip('INFO',['MASTER_SERVER_LISTENING_CLOSE', info&&info.type_port_ip]);
});
master.on('server::error',function masterError(e){
log.tip('ERR ','MASTER_SERVER_ERROR_WARN');
log.error(e);
process.exit(1);
});
//主进程启动完毕
master.on('loadend',function masterInit(){
let site = {};
site.logOutput = site.logOutput || path.join(site.path, 'log/output.log');
site.logError = site.logError || path.join(site.path, 'log/error.log');
site.logAll = site.logAll || path.join(site.path, 'log/all.log');
//站点文件
site.workerFile = site.workerFile || site.path;
master.loadSite(site);
//服务器启动
master.serverRun();
//重新载入站点
master.reLoadSite();
});
- daemon.js
//引入守护线程模块
const DdvDaemon = require('ddv-worker/daemon');
let daemon = new DdvDaemon();
//监听加载完毕
daemon.on('loadend',()=>{
//设置管理线程启动文件
daemon.setMasterFile(path.resolve(__dirname,'./master.js'));
//开始运行管理线程
daemon.run();
});