优秀的编程知识分享平台

网站首页 > 技术文章 正文

采用Node.js的微服务,能带来什么变化?

nanyue 2025-05-09 20:41:16 技术文章 17 ℃

最近尝试使用Node.js做了几个微服务,有使用框架是midway的,也有使用nestjs的,还有直接express的,感觉真是让我惊叹,原来还可以这样做微服务。

老胡认为,是需求推动了语言的发展。java 框架发展得越来越完善,是为了适应复杂的需求和系统以及团队合作规范的需要,而JavaScript等弱类型语言肯定是无法胜任开发这种极度复杂系统的,当微服务的概念推广以后,单个工程变得没有那么重了,那么严谨框架带来的价值就很有限了,更多的是累赘。怎么样更简洁地实现业务成为语言选项的优先考虑因素。

  • 内存消耗很低

单个实例的内存消耗,基本处于60M~100M之间,单个springboot微服务的内存大约是1到3g。10倍的差距,对于我们几百个微服务来说,这就很有意义了。据说Go语言做微服务的内存消耗也很低,但是人人都会的JavaScript和陌生语法的Go,还是先搞JavaScript吧!

  • 人人全栈的潜力

当前后端都使用JavaScript的时候,原本熟悉的陌生人,现在可以一起探讨,这个画面很值得想象,一定会擦出一些火花,带来技术的进步。有些小伙伴们就会忍不住跨界,对于团队而言,肯定是极好的事情了。

  • Promise带来的灵活度

Promise可以让使用者来轻易决定是同步执行,还是异步执行代码,这个在使用中真的特别方便,java中常遇到这样的困扰,代码肯定是逐行往下写,是同步的,但是调用第三方的接口的时候,就往往需要异步处理,这个时候就写起来很麻烦,一般是另外起一个定时任务去获取第三方的异步返回,或者等第三方主动返回。这情况至少得添加数据表吧,定时任务吧,巨麻烦。

或者可以加入多线程,感觉打蚊子要上高射炮,很难。而现在,js里面使用promise轻易就化解了这个难题。这种兼容性真是无与伦比,太方便了。

// 定义一个 返回 Promise对象的函数
async query(sql, param){
        return new Promise((resolve, reject) => {
            this.pool.query(sql, param).then((results)=>{ 
                    resolve(results)
            }).catch((err)=>{
                reject(err);
            })
        });
    }

// 同步使用   
await query('select * from xxxx')

// 或者 异步使用
query('select * from xxxx').then((obj)=>{ 
                   console.log(obj)
            }).catch((err)=>{
                console.log(obj)
            })
  • 对象的定义,以及实体类的简化

JavaScript 里面定义简单对象只需要{ec:'', em:'', data:{status:0}},非常简洁,使用起来也只需要obj.ec, obj.data.status 这样, java里面至少需要写两个类,对吧?还需要引入lombok来生成get,set方法,一个spring项目里面,多少代码用于配置框架,多少是用于维持规范,多少代码是用于业务,在JavaScript里面,终于有机会思考把那些不需要的东西都去掉吧。

const obj = {
  errcode: 0,
  errmsg: '成功',
  data:{
    status: 0,
    no: 'dfdfd12121212',
  }
}
//  对象写的这样清爽不舒服吗?直观明了
  • 部署简单

node.js项目使用pm2部署,很轻易做到启动多个实例共用一个端口,参考如下,启动3个实例,对外端口仍然是8000. 这样等于是一个docker容器里面我启用了3个实例,然后我再多部署几个docker容器就可以了。

module.exports = {
    apps : [{
        name: "应用名字",
        script: "/work/bootstrap.js",
        instances: 3,
        max_memory_restart: "1G",
        env_dev: {
            NODE_ENV: "dev",
            PORT: 8000,
        },
        env_production: {
            NODE_ENV: "production",
            PORT: 8000,
        },
        exec_mode: 'cluster',
        combine_logs: true,
        log_date_format: "YYYY-MM-DD HH:mm Z"
    }]
}

总结:微服务的理念就是降低耦合度,降低难度,只不过java里兴起的微服务,却被JavaScript挖了墙角,完全取代java这不可能,但是想必JavaScript能取代一部分java的微服务吧!

  • 关注老胡,分享更多简洁实用的技术。

Tags:

最近发表
标签列表