[進階篇]nodejs服務使用隨機埠註冊eureka
阿新 • • 發佈:2019-02-19
eureka的優點我就不多說了,這裡只談談nodejs如何註冊到eureka中。
nodejs註冊到eureka中可以用eureka-client模組實現,程式碼如下,從promise中擷取僅關鍵部分,應該足夠了。
let Eureka = require('eureka-client').Eureka;
let client = new Eureka({
instance: {
app: 'xxx',//註冊本服務名稱
appGroupName: 'group_xxx',//註冊本服務分組(不是必須的)
instanceId: require ('uuid').v1(),//註冊本服務例項編號,此處可隨機生成一個
hostName: ip,//本服務IP地址
ipAddr: ip,//本服務IP地址
statusPageUrl: `http://${ip}:${port}`,//本服務IP地址和埠號
healthCheckUrl: `http://${ip}:${port}/health`,//本服務IP地址和埠號
port: {
'$': port,//服務埠號
'@enabled': 'true',
},
vipAddress: 'xxx' ,//註冊應用名稱
dataCenterInfo: {
'@class': 'com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo',
name: 'MyOwn',
},
},
eureka: {
serviceUrl: eurekaUrl,//eureka的地址
},
});
client.start(function(error) {
if(error){
eurekaUrl = null;
console. log('註冊Eureka失敗');
reject(error)
}else{
console.log('服務已成功註冊Eureka');
resolve()
}
});
埠號隨機生成可以使用下面的方式,程式碼也是用promise中擷取關鍵部分
let server = require('http').createServer();
server.listen(0);
let sockets = [];
server.on("connection",function(socket){
sockets.push(socket);
socket.once("close",function(){
sockets.splice(sockets.indexOf(socket),1);
});
});
return new Promise((resolve, reject) => {
//關閉之前,我們需要手動清理連線池中的socket物件
function closeServer(){
sockets.forEach(function(socket){
socket.destroy();
});
server.close(function(){
console.log("close server! port = " + port);
resolve()
});
}
server.on('listening', function(err) {
if(err){
reject(err)
}else{
port = server.address().port;
closeServer();
}
})
})
附:獲取ip地址可以使用如下方式
let _getIPAdress = () => {
let interfaces = require('os').networkInterfaces();
let ipAddress = null;
_.forEach(interfaces, (oneInterface, devName) => {
_.forEach(oneInterface, (alias) => {
if(alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal){
ipAddress = alias.address;
return false
}
});
return !ipAddress
});
return ipAddress;
};
以上關鍵程式碼已有,只需要組合到promise中就可以玩出各種花樣來