五个最佳案例带你解读Node.js的前后之道

协程潮汐
• 阅读 7512

Node.js 是什么?
Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎;Node不是JS应用、而是一个Javascript的运行环境。Node保留了前端浏览器js的接口,没有改写语言本身的任何特性,依旧基于作用域和原型链。

Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。这些特性不仅带来了巨大的性能提升,还减少了多线程程序设计的复杂性,进而提高了开发效率。

Node.js的特点
1、一个Javascript运行环境
2、依赖于Chrome V8引擎进行代码解释
3、事件驱动
4、非阻塞I/O
5、轻量、可伸缩,适于实时数据交互应用
6、单进程,单线程

Node.js能做什么?
1、具有复杂逻辑的网站
2、基于社交网络的大规模 Web 应用;
3、Web Socket 服务器(页游,web IM);
4、TCP/UDP 套接字应用程序;
5、命令行工具;
6、交互式终端程序;
7、带有图形用户界面的本地应用程序;
8、单元测试工具;
9、客户端 JavaScript 编译器

Node.js架构
五个最佳案例带你解读Node.js的前后之道

事件循环
五个最佳案例带你解读Node.js的前后之道

NodeJs执行模型: 单线程Event Loop
当应用请求发生时,首先进入V8引擎,然后进入到事件队列,可以理解为他们在不断地在循环,看是否有任务,产生任务就去执行。上图是单线程模型。

NPM
后端在开发其他语言时,都有一些模块的概念或者第三方提供了很实用的小模块。同样,Node.js当时出来的时候也有这样一个仓库。这个仓库就是专门用来管理中国开发者的一个贡献的模块,而且发展非常的快。同样,前端有一些脚手件,在服务器这边运行的有debug,express,express-session,thrift,依托这个插件做thrift相关的事情,images其他的一些你想的到的插件,都是可以从它找到。

架构体系
五个最佳案例带你解读Node.js的前后之道

上图是个推部分WEB平台的架构体系,个推有一套云组进资源,通过Nginx作为一个分发,Node可以有多个节点,通过session进入。每一个Node都有模式,相信大家在部署的时候肯定不可能部署一个节点,部署一个节点,否则这个节点挂了就是挂了。
Thrift使用
1、定义接口
五个最佳案例带你解读Node.js的前后之道

2、编译,生成对应的包,并上传到相应的库中
3、在Node中使用,如下:
五个最佳案例带你解读Node.js的前后之道

注意:这里有个坑
thrift 中有个基本类型叫做 double (64位浮点数)。当定义成这个类型时,数据从 java 过来到 Node 会变成全是0。

解决方案
定义成 string 类型,之后特事特办,如必要则在 Node处再转成浮点数,或者直接由页面端处理。

IP负载(IP Load Balance)

负载均衡
分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
原生中其并没有负载均衡的机制,但我们可以采用动态代理的设计模式,基于thrift client,利用JS的原型链来实现。
均衡的方式有很多种,我们使用轮询机制来实现访问多个Java节点。

session管理
Node本身并无session机制,我们可以使用express-session包来实现,同时通过redis来存储session。

连接池
传统读取数据库方式:
五个最佳案例带你解读Node.js的前后之道

连接池需要做什么?
1、连接预热 (启动时自动打开n个连接以供使用)
2、使用 例如 轮转法 均匀分发 连接请求
3、当池中的连接即将耗尽得时候动态产生新的连接
4、当池中的连接一段时间没有被调用的时候,自动释放连接
5、自动丢弃 已经坏掉的 连接
6、系统关闭的时自动释放所有连接
基于此,我们也可以借助几个插件包(如generic-pool(node-pool)、node-thrift-pool,当然,如果你直接Node连接的DB,基本上那个包里面也会支持连接池)在Node使用连接池。

使用示例
五个最佳案例带你解读Node.js的前后之道

利用Node可以做的事情

1、做一些灰色地带的事情
利用Node可以做一些灰色地带的事情,因为它拥有前端的优点,可以异步,发起异步请求。给开发者带来很大的好处。不过,你需要管理好你的类型。如果说类型自己如果没有管理好就是会出现一些问题。同时它也可以做后端的一些事情。比如说连接池等等。

2、模块更加分明

3、可前可后便于分工
从浏览器过来的数据,通过Node把这一层数据转化成java需要的一种数据结构,就可以使得分工更加明晰。

4、共用表单输入验证
如果你在写系统的时候,出于安全考虑,无论浏览器这边做了多少验证,你都要做输入验证。传统模式下是需要java同学写一份,前端同学写一份。因为Node跟java都是部署在服务器集群或者一个区域,你可以相信这两边之间一个数据。来自浏览器的验证,就可以共用表单输入验证,达到节省成本的目的。

以上内容来自个推web服务首席架构师姜季廷在3月12日SegmentFault D-Day 北京:后端的演讲整理而成。

点赞
收藏
评论区
推荐文章
凝雪探世界 凝雪探世界
4年前
JavaScript基础加ES6语法
JavaScript一、什么是JavaScript当下最流行的脚本语言,在世界上的所有浏览器中都有js的身影,是一门脚本语言,可以用于我们与web站点和web应用程序的交互,还可以用于后台服务器的编写,例如node.js二、语法特点基于对象和事件驱动的松散型,解释型语言单线程异步三、JavaScript作用页面的交
小嫌 小嫌
3年前
Node.js学习笔记
什么是Node.js文件?Node.js文件包含将在特定事件上执行的任务一个典型的事件是有人试图访问服务器上的端口Node.js文件必须在服务器上启动才能生效Node.js文件的扩展名为“.js”Node.js文件应当如何执行推荐使用各种类型的编译器生成一个空白的nodedemo.js文件,在文件中输入下面的内容:varhttprequi
Stella981 Stella981
3年前
Node.js 简单学习
明白JavaScript语言,你就会用Node.js了。最常见的运行JavaScript语言的地方就是用户的浏览器,几乎所有的浏览器上都有个JavaScript引擎,这个引擎负责运行在页面中嵌入的JavaScript代码。代码是在用户的浏览器上运行的,用户那头叫前端(Frontend),服务器这头叫后端(Backend)。Node.js
Stella981 Stella981
3年前
Node.js简介及如何学习Node.js
本文介绍Node.js的诞生史以及如何学习Node.js。Node.js简史从Node.js的命名上可以看到,Node.js的官方开发语言是JavaScript。之所以选择使用JavaScript,显然与JavaScript的开发人员多有关。总所周知,JavaScript是伴随着互联网的发展而火爆起来的,JavaScript也是前
Stella981 Stella981
3年前
JavaScript 如何打败众语言,成为 Node 的实现语言?
Node.js是一种将JS放在服务器端实现的平台,而为什么要把js放到服务器端实现,JS 最初设计是在浏览器端解释执行,后来为什么搞Node.js把他放在服务器端执行呢?关于这个问题,近日有网友解释道:Node.js的作者 RyanDahl是一名资深的C/C程序员,在创造出Node之前,他的主要工作都是围绕高
Stella981 Stella981
3年前
NodeJs在windows上安装配置测试
Node.js简介简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于ChromeV8引擎的JavaScript运行环境。Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效。Node.js的包管理器npm,是全球最大的开源库生态系统。安装环境本机系统:Windo
Stella981 Stella981
3年前
Node.js
1.Node来历   2009年,正是推出基于Javascript语言和V8引擎的开源Web服务项目,命名为Node.js,Node.js是第一次把Javascript带到后端开发。全很很多开发人员都熟悉Javascript,所以Node.js一下子就火了。   Javascript语言本身是完善的函数式语言,在前端开发时,开发
Stella981 Stella981
3年前
Node.js 安装与开发
Node.js简介Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由RyanDahl开发,实质是对ChromeV8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node.j
Stella981 Stella981
3年前
Node.js 中使用 ECDSA 签名遇到的坑
文/Fenying最近有个朋友问我关于Node.js下使用ECDSA的问题,主要是使用Node.js的Crypto模块无法校验网络传输过来的签名结果。在踩坑无数后,终于搞清楚了原因。坑0x00:签名输出格式在排除了证书、消息不一致的可能之后,我开始对比使用Node.js签名的结果与网络传输过来的签
Stella981 Stella981
3年前
Node.JS是什么?
百度上是这么说的:Node.js是一个可以快速构建网络服务及应用的平台。该平台的构建是基于Chrome‘sJavaScriptruntime,也就是说,实际上它是对GooleV8引擎进行了封装。Node.js的优点nodejs作为一个新兴的后台语言,有很多吸引人的地方:RESTfulAPI单线程Node.js可以在不新增
Stella981 Stella981
3年前
Node.js 应用故障排查手册 —— 利用 CPU 分析调优吞吐量
楔子在我们想要新上线一个Node.js应用之前,尤其是技术栈切换的第一个Node.js应用,由于担心其在线上的吞吐量表现,肯定会想要进行性能压测,以便对其在当前的集群规模下能抗住多少流量有一个预估。本案例实际上正是在这样的一个场景下,我们想要上线Node.js技术栈来做前后端分离,那么刨开后端服务的响应QPS,纯使用Node.js