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

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 架构 



事件循环 



NodeJs 执行模型: 单线程 Event Loop 

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

NPM 

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

架构体系 




上图是个推部分 WEB 平台的架构体系,个推有一套云组进资源,通过 Nginx 作为一个分发, Node 可以有多个节点,通过 session 进入。每一个 Node 都有模式,相信大家在部署的时候肯定不可能部署一个节点,部署一个节点,否则这个节点挂了就是挂了。 

Thrift 使用 

1 、定义接口 




2 、编译,生成对应的包,并上传到相应的库中 
3 、在 Node 中使用,如下: 



注意:这里有个坑 

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 。 

连接池 

传统读取数据库方式: 



连接池需要做什么? 

1 、连接预热 (启动时自动打开 n 个连接以供使用) 
2 、使用 例如 轮转法 均匀分发 连接请求 
3 、当池中的连接即将耗尽得时候动态产生新的连接 
4 、当池中的连接一段时间没有被调用的时候,自动释放连接 
5 、自动丢弃 已经坏掉的 连接 
6 、系统关闭的时自动释放所有连接 

基于此,我们也可以借助几个插件包(如 generic-pool ( node-pool )、 node-thrift-pool ,当然,如果你直接 Node 连接的 DB ,基本上那个包里面也会支持连接池)在 Node 使用连接池。 

使用示例 




利用 Node 可以做的事情 

1 、做一些灰色地带的事情 
利用 Node 可以做一些灰色地带的事情,因为它拥有前端的优点,可以异步,发起异步请求。给开发者带来很大的好处。不过,你需要管理好你的类型。如果说类型自己如果没有管理好就是会出现一些问题。同时它也可以做后端的一些事情。比如说连接池等等。 
2 、模块更加分明 
3 、可前可后便于分工 
从浏览器过来的数据,通过 Node 把这一层数据转化成 java 需要的一种数据结构,就可以使得分工更加明晰。 
4 、共用表单输入验证 
如果你在写系统的时候,出于安全考虑,无论浏览器这边做了多少验证,你都要做输入验证。传统模式下是需要 java 同学写一份,前端同学写一份。因为 Node 跟 java 都是部署在服务器集群或者一个区域,你可以相信这两边之间一个数据。来自浏览器的验证,就可以共用表单输入验证,达到节省成本的目的。 

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

本文来自https://www.v2ex.com/t/266827

转载于:https://www.cnblogs.com/wangxishan/p/6369996.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS风暴】根据海拔范围分级统计GIMMS 3g NDVI平均值案例教程——以甘肃省为例

在论文写作时,通常要根据区域进行统计栅格数据。本文以甘肃省dem、NDVI数据为例,讲解根据海拔范围分级统计NDVI平均值、最大值、最小值和面积等。 1. 海拔分类 dem是本案例的最基本数据,打开ArcMap,加载dem数据,如下图所示: 首先要对dem进行分级,所使用的到的工具是重分…

【转】知道这20个正则表达式,能让你少写1,000行代码

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升。下面是技匠整理的,在前端开发…

Dapr中国社区网站(预览版)发布!

点击蓝字关注我们社区介绍Dapr 是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中。Dapr 中国社区是一个以 Dapr 为中心的中立而开放的技术社区,为 Dapr 用户…

【ArcGIS风暴】ArcGIS自动生成标识码(BSM)的两种方法案例教程

1. 标识码编制规则 按照每个图层要素的标识码应具有唯一代码的基本要求,根据《GB/T 7027-2002 信息分类和编码的基本原则与方法》规定的信息分类原则和方法,要素标识码采用二层 20 位层次码结构,由村级行政区划代码、要素标识码顺序号构成。具体如下: (1)第一层为村级行…

数据分析入门_char01

数据分析入门_char01 转载于:https://www.cnblogs.com/zsr0401/p/6370697.html

【BIM入门实战】Revit2018项目模板、族库图文安装教程

【扩展阅读】:【MIB】Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整教程 一、Revit 族库、项目样板缺失的产生原因 1、断网或者网络不稳定环境下安装Revit。 2、Revit配置安装界面中取消勾选“Autodesk Revit Content Librabries”。 3、下载了没有自带族库的软件…

一台服务部署多个tomcat注意事项

第一步 添加tomcat环境变量 # vim /etc/profile加入下代码 # TOMCAT ATALINA_BASE/usr/local/tomcat8CATALINA_HOME/usr/local/tomcat8TOMCAT_HOME/usr/local/tomcat8export ATALINA_BASE CATALINA_HOME TOMCAT_HOME 修改应用环境变量,是配置生效# source /etc/pro…

python 使用 sha256 函数对密码进行加密

在 hashlib 库中,可以使用 sha256 函数对密码进行加密。下面是一个示例代码: import hashlibdef hash_password(password):# 创建一个 sha256 对象sha256_hash hashlib.sha256()# 使用 update() 方法将密码传入 sha256 对象sha256_hash.update(passwor…

今天面试一个老程序员,号称自带资源,竟然是从所有前公司偷拷的源代码!...

说到“自带资源”,你会想到什么?一位程序员的“资源”令人震惊:竟然是从前公司偷的源代码!一位网友说:今天面试一个老程序员,说自己有5年的开发经验,离职原因是上家公司倒闭了。上机测试啥都不会…

【ArcGIS风暴】根据海拔(坡度)范围分级统计土地覆盖的类型和面积(兰州市GlobeLand30m数据为例)

本文基于DEM和GlobeLand30m土地覆盖数据,讲解根据海拔范围和坡度范围分级逐级统计兰州市土地覆盖的类型和面积。 一、数据准备 1. DEM数据 海拔和坡度分级都要基于dem来实现。文中采用的DEM数据空间分辨率为30m,由甘肃省30mdem掩膜提取而来,加载如下所示: 2. 土地覆盖数据…

html5 弹性布局

html5 弹性布局 一、移动开发常用技巧 Viewport基本知识 设置布局Viewport的各种信息1、widthdevice-width; 设置Viewport视口宽度等于设备宽度2、initial-scale1; 网页默认缩放比为1(网页在手持设备上,不会进行默认缩放3、minimum-scale1 网…

Excel 宏代码实现按相同值分组设置背景颜色

AltF11,打开编辑器,按如下代码编写代码: Sub SetGroupBg()Dim i, j, cColors Array("#CEFFCE", "#D7FFEE", "#D9FFFF", "#C4E1FF", "#DDDDFF", "#FFDAC8", "#FFE4CA&quo…

开源WPF控件库-AdonisUI

原文:https://github.com/benruehl/adonis-ui翻译:沙漠尽头的狼(谷歌翻译加持)用于 WPF 应用程序的轻量级 UI 工具包,提供经典和增强的 Windows 视觉效果:仓库信息仓库地址:https://github.com/benruehl/adonis-uiDemo&#xff1a…

Unity3D脚本的生命周期(执行顺序)

Unity脚本中有许多固定的函数 例如Start();Update(); 而这些函数都有固定的执行顺序 搞清楚这些函数的执行顺序 对于我们理清代码的逻辑就显得尤为重要 举个简单的例子 //脚本A public static int a 1; void Start(){a 2; }//脚本B void Start(){Debug.Log(A.a); } 这时&…

【ArcGIS微课1000例】0023:ArcGIS将地理照片(无人机照片)转为点(航迹)案例教程

本文演示在ArcGIS中,批量将无人机航测获取的带有地理坐标的照片转为点,形成航线轨迹,并计算出三维坐标,为航测数据内业处理提供一定的基础支持。 1. 效果展示 无人机正射照片: 地理坐标转点(航迹): 2. 工具介绍 在ArcGIS中提供了批量将无人机多张照片自带的地理坐标转…

《A Seat at the Table》作者访谈录

\本文要点\\CIO(首席信息官)和IT领导者们必须重新定义他们的IT组织与其他企业之间的关系,只有这样才能利用DevOps带来的敏捷和开发周期的缩短。\\t传统的观点认为,IT部门是“业务”的一个独立承包商,这样的观点阻碍了公…

WPF效果第一百九十二篇之TreeView支持多选

前面一篇文章中玩耍了框选ListBox的效果;今天要分享基于TreeView实现节点得多选操作,最终实现的效果,如下图:1、参考项目:https://github.com/cmyksvoll/MultiSelectTreeView2、我在里面增加了一个路由事件public static readonly RoutedEvent SelectedItemsChangedEvent Even…

【BIM入门实战】Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整教程

Win11平台上Revit 2018_x64简体中文版图文安装与卸载完整版教程。 【扩展阅读】:【BIM】Revit2018项目模板、族库图文安装教程 1. Revit 2018安装 断开网络连接,双击软件安装包中的Revit_2018_G1_Win_64bit_dlm_001_003.sfx.exe进行安装。 选择默认的目标文件夹,安装完成后…

[转]Xdebug----Failed loading

环境说明: 1、php7.2.1 2、php.ini配置 [Zend] zend_extensionD:\work-Doc\wiki\php-7.2.11-Win32-VC15-x64\ext\php_xdebug-2.6.1-7.2-vc15-x86_64.dll xdebug.remote_port9000 xdebug.remote_enable1 xdebug.remote_host127.0.0.1 xdebug.remote_handlerd…

【BIM入门实战】Revit 2018模型设计阶段重点及注意事项总结

1、最常用的三个快捷指令:对齐AL、尺寸标注DI、可见性设置VV; 2、进行新项目的创建,需要根据不同的项目类型,选择不同的样板文件,例如:创建的是建筑模型就需要选择 “建筑样板”,而结构模型就需要选择 “结构样板”,也可以选择自己设置的样板文件; 3、CAD优化处理后每…