搭建微服务框架
general-service服务
env.yaml 文件
general_service_port: 8080
general_service_address: localhost
user_service_port: 8081
user_service_address: localhost
src/config/env 文件
var fs = require('fs');
var YAML = require('yamljs');
module.exports = {
/**
* 初始化环境变量到process.env中
* 如果环境变量和config重复则取环境变量里配置的值
* @param {string} envPath 环境遍历路径
* @param {object} config 配置项
*/
init(envPath) {
let env = {};
try {
if (!fs.existsSync(envPath)) {
console.warn('File not exist: env.yaml');
} else {
let envjson = YAML.load(envPath);
Object.keys(envjson).forEach(function (k) {
env[k] = envjson[k];
});
}
} catch (e) {
console.info('Fail to load environment variables: ', e);
}
// 将env数组里的值设置到环境变量里,如果系统环境里面已经配置了则会设置失败
Object.keys(env).forEach(function (k) {
// Don't override env variables that were set explicitly
if (typeof process.env[k] === 'undefined') {
process.env[k] = env[k];
}
});
if (
!process.env['service_address'] ||
process.env['service_address'] == 'null'
) {
// 动态获取ip
process.env['service_address'] = this.getIpAddress();
}
},
getIpAddress() {
let interfaces = require('os').networkInterfaces();
for (let devName in interfaces) {
let iface = interfaces[devName];
for (let i = 0; i < iface.length; i++) {
let alias = iface[i];
if (
alias.family === 'IPv4' &&
alias.address !== '127.0.0.1' &&
!alias.internal
) {
return alias.address;
}
}
}
}
};
index.js 文件
try {
const seneca = require('seneca')();
const path = require('path');
// 环境配置路径
const envPath = path.join(path.resolve(__dirname, '../'), '/env.yaml');
const EnvService = require('./config/env');
// 初始化环境
EnvService.init(envPath);
seneca
.listen({
type: 'tcp',
pin: 'server:general-service',
port: process.env["general_service_port"],
host: process.env["general_service_address"]
})
.client({
type: 'tcp',
pin: 'server:user_service',
port: process.env["user_service_port"],
host: process.env["user_service_port"]
})
} catch (err) {
console.log('err', err)
}
process.on("uncaughtException", function(err) {
console.log("Caught exception: " + err);
console.log(err.stack);
});
user-service 用户服务
env.yaml 文件
user_service_port: 8081
user_service_address: localhost
src/config/env 文件如上
api/setId.js 文件
module.exports = function setId(options) {
/**
* @description 获取id时间戳
* @returns
*/
this.add(
'server:user-service,module:user,operate:getId',
function getId(msg, respond) {
try {
var timestamp = (new Date()).valueOf();
return respond(null, {
code: 0,
msg: '成功',
data: timestamp
})
} catch (err) {
return respond(null, {
code: 1,
msg: '未知错误',
data: { errinfo: err }
})
}
}
)
}
index.js 文件
try {
const seneca = require('seneca')();
const path = require('path');
// 环境配置路径
const envPath = path.join(path.resolve(__dirname, '../'), '/env.yaml');
const EnvService = require('./config/env');
// 初始化环境
EnvService.init(envPath);
const getId = require('./api/setId')
seneca
.use(getId)
.listen({
type: 'tcp',
pin: 'server:user-service',
port: process.env["user_service_port"],
host: process.env["user_service_port"]
})
.act('server:user-service,module:user,operate:getId', (err, result) => {
console.log(result)
})
} catch (err) {
console.log('err', err)
}
process.on("uncaughtException", function(err) {
console.log("Caught exception: " + err);
console.log(err.stack);
});