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中就可以玩出各种花样来

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐