网站首页 > 技术文章 正文
最近尝试使用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的微服务吧!
- 关注老胡,分享更多简洁实用的技术。
猜你喜欢
- 2025-05-09 js防水涂料的使用方法(js防水涂料的防水作用机理)
- 2025-05-09 JavaScript 展开data 是什么语法(js实现展开收缩)
- 2025-05-09 JavaScript 可选链操作符详解(javascript选项)
- 2025-05-09 Express.js 创建Node.js Web应用(express搭建)
- 2025-05-09 JavaScript 强制回流问题及优化方案
- 2025-05-09 OS.js – 开源的 Web OS 系统,赶快来体验
- 2025-05-09 祝各位节(圆周率日)快乐(国际数学节国际圆周率日)
- 2025-05-09 JavaScript中Date对象的用法详解(javascript date对象)
- 2025-05-09 JavaScript 中的运算符优先级(javascript中的运算符分为哪几种?)
- 2025-05-09 web前端JavaScript笔记四 正则表达式
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)