1. 程式人生 > >[進階篇]nodejs服務使用隨機埠註冊eureka

[進階篇]nodejs服務使用隨機埠註冊eureka

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中就可以玩出各種花樣來