Node.js 是什么

Node.js 是一个基于 Chrome v8 引擎的 Javascript 运行环境,它使用了一个"事件驱动"且"异步非阻塞 I/O" 的模型使其轻量且高效, Node.js 的包管理器 NPM 是全球最大的开源库生态系统。

对其定义的补充说明:

  • Node.js 是一个运行环境,而不是 Javascript 类库或者框架
  • Node.js 是基于 Chrome 浏览器的 V8 引擎开发的,该引擎是业界公认的高性能 js 引擎
  • Node.js 提供了事件驱动模型,可以将当前事件加入到事件队列中轮询
  • Node.js 提供了异步非阻塞式 I/O 模型,它比传统的同步阻塞式 I/O 模型具有更高的吞吐率
  • Node.js 的包管理器与 java 的 Maven 类似,但生态圈似乎更加庞大

安装 node.js

wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-x64.tar.xz
tar -xvzf node-v10.15.0-linux-x64.tar.xz -C /usr/local/ --strip-components=1

Node.js 入门

先给一段代码

var fs = require('fs')

fs.readFile('/etc/hosts', function (err, data) {
if (err) {
throw err;
}
console.log(data.toString());
});

Node.js 会创建一个读取文件的事件,并立刻将该事件加入到事件队列中,当前线程不会阻塞在这里。理论上后续不管有多少线程都会进来并产生一系列事件,这些事件都会加入到同样的事件队列中,它们会在事件队列中进行循环,一旦某个事件被触发(比如读取文件成功),就会执行后面定义的回调函数。

除了回调函数这种异步方式,它也提供了同步 API,代码如下

var fs = require('fs')

var data = fs.readFileSync('/etc/hosts')
console.log(data.toString());

Node.js 应用场景

Node.js 是针对实时 web 应用程序而开发的,非常适合为了满足实时性较强且并发量较大的应用场景。

  1. I/O 密集型 web 应用

    应用程序分为两大类

    • CPU 密集型应用

      • 对 CPU 要求较高,需要一个强大的计算过程
      • 如股票交易系统,数据分析系统等
    • I/O 密集型应用
      • 常常有频繁的网络传输或磁盘存储现象
      • 如高并发网站,实时 Web 系统等

    Express 是一个非常优秀的 web 框架

  2. Web 聊天室 Socket.IO

  3. 命令行工具

    可以写一段 Node.js 程序,通过 NPM 的命令将其安装到操作系统中,随时在命令行控制台输入该命令运行。

    Commander.js

    基于 Node.js 的前端开发工具如下 Bower, Grunt, Gulp, Webpack, Yeoman

  4. HTTP 代理服务器

Node.js 可以通过异步的方式处理大量的兵法请求,它可以作为服务器端应用程序的代理,起到如 Nginx, Apache 等 HTTP代理服务器的作用。

常用的 HTTP 代理服务器模块 node-http-proxy ,在实现微服务架构的服务网关是会用到该项技术。

npm 镜像

淘宝提供了一个 NPM 镜像,速度非常快。

npm install --registry=https://registry.npm.taobao.org

在安装一个要打包到生产环境的安装包时,你应该使用 npm install --save

如果你在安装一个用于开发环境的安装包(例如,linter, 测试库等),你应该使用 npm install --save-dev。可在 npm 文档 中查找更多信息。

淘宝 npm 镜像官网 http://npm.taobao.org/

使用 Node.js 搭建微服务网关

什么是微服务架构

先来整体回顾下下微服务架构

微服务网关(Node.js) 是微服务架构中的核心组件,它是客户端请求的门户,是调用具体服务端的桥梁。它类似于 Facade 模式(门面模式),将底层复杂的细节进行了屏蔽,对外提供简单且统一的调用方式,如 HTTP 方式。

微服务网关,也称为服务网关(Service Gateway),或者 API 网关(API Gateway)。它们之间的关系如下面架构图所示:

在上图中,我们使用服务网关来建立 client 与 service1 之间的联系。当从 client 发送请求时,请求首先进入 service gateway, 随后 service gateway 就会将请求路由到具体的服务器。在路由过程中,会涉及具体的路由算法,最简单的做法就是在 service gateway 中解析 client 请求中的路径和请求头,从而路由到具体的服务端。

为了确保服务具有较高的可用性,我们可部署多个相同的服务端,此时需要再 service gateway 中设置相关路由算法,将请求随机路由到具体的服务端,当然也可以对 client ip 地址进行 Hash 算法,从而实现请求路由。

服务网关的路由过程我们称为"反向代理"。和 Nginx ,Apache 类似。

反向代理的应用场景有

  1. 使静态资源与动态资源分离
  2. 实现 AJAX 跨域访问
  3. 搭建统一服务网关接口

使用 Node.js 实现反向代理

Node.js 搭建反向代理服务器,需要下面 3 步

  1. 使用如下命令安装 HTTP Proxy 模块

    npm install http-proxy
  2. 使用 HTTP Proxy 模块启动代理服务器,新建一个名为 app_proxy.js 的文件

    var http = require('http');
    
    var httpProxy = require('http-proxy');
    
    var PORT = 1234;
    
    // 创建代理服务器对象
    var proxy = httpProxy.createProxyServer(); proxy.on('error', function (err, req, res) {
    res.end(); // 输出空白响应数据
    }); var app = http.createServer(function (req, res) {
    // 执行反向代理
    proxy.web(req, res, {
    target: 'http://localhost:8080' // 目标地址
    })
    }) app.listen(PORT, function() {
    console.log('server is running at %d', PORT)
    })
  3. 启动 app_proxy.js 应用程序

node app_proxy.js

运行后,就可以通过 "localhost:1234" 去访问 "localhost:8080"。

除了 HTTP,该模块还支持 HTTPS 与 WebSocket 的反向代理。

可以使用 apache bench 对其性能做一个简单的测试。模拟 1000 个用户,每个用户并发 100 个请求

ab -n 1000 -c 100 http://localhost:1234

Node.js 与 Nginx 相比性能不差,而且其扩展性远高于 Nginx。我们可以动态指定被代理的目标地址,而 Nginx 中配置的目标地址却是静态的。这一点对实现服务发现功能及其重要,因为我们需要从 Service Registry 中获取需要代理的微服务信息,并执行反向代理操作,调用相应的微服务 REST API。

最后需要说明的是,服务网关不仅仅提供反向代理与服务发现特性,此外它还具备安全认证,性能监控,数据缓存,请求分片,静态响应等特性,我们可以根据实际情况扩展。

参考

  • 《架构探险—轻量级微服务架构》

使用 Node.js 搭建微服务网关的更多相关文章

  1. 使用 Node.js 搭建一个 API 网关

    原文地址:Building an API Gateway using Node.js 外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间 ...

  2. 基于OpenResty和Node.js的微服务架构实践

    什么是微服务? 传统的单体服务架构是单独服务包,共享代码与数据,开发成本较高,可维护性.伸缩性较差,技术转型.跨语言配合相对困难.而微服务架构强调一个服务负责一项业务,服务可以单独部署,独立进行技术选 ...

  3. 基于node.js构建微服务中的mock服务

    缘起 由于现在微服务越来越火了,越来越多的微服务融入到了日常开发当中.在开发微服务的时候,经常会遇到一个问题由于依赖于其他服务,导致你的进度受到阻碍.使你不得不先mock出你期望调用依赖服务的输出,来 ...

  4. 原创:用node.js搭建本地服务模拟接口访问实现数据模拟

    前端开发中,数据模拟是必要的,这样就能等后台接口写完,我们直接把接口请求的url地址从本地数据模拟url换成后台真实地址就完成项目了.传参之类的都不用动. 之前网上找了很多类似于mock等感觉都不太实 ...

  5. 微服务-网关-node.js by 大雄daysn

    目录 序言 一.node.js入门1.1 下载并安装1.2 从helloworld到一个web应用1.3 Express框架二.node.js搭建网关 三.node.js集群搭建   序言 首先一个问 ...

  6. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  7. spring cloud+.net core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  8. springcloud(十四):搭建Zuul微服务网关

    springcloud(十四):搭建Zuul微服务网关 1. 2. 3. 4.

  9. 小D课堂 - 新版本微服务springcloud+Docker教程_6-06 zuul微服务网关集群搭建

    笔记 6.Zuul微服务网关集群搭建     简介:微服务网关Zull集群搭建 1.nginx+lvs+keepalive      https://www.cnblogs.com/liuyisai/ ...

随机推荐

  1. Java反射机制介绍

    1. 文档概述 Java反射是Java被视为动态(或准动态)语言的一个关键性质,Java反射机制容许程序在运行时加载.探知.使用编译期间完全未知的classes.换言之,Java可以加载一个运行时才得 ...

  2. Python3.5 学习十九 Django分模块讲解 MTV+URL

    本节内容概述: 表单提交的Method使用规则:get 获取数据 post提交数据 单选使用get 多选使用getlist request.POST.getlist("favor" ...

  3. 【友情链接】各位dalao的博客

    同省神犇 HA队长 __stdcall HA chty_syq为文文讲过字符串 HA cdcq为文文讲过后缀数组① ② Bluesky007超强的 外省神犇 知名OIer黄学长 一个可爱的蓝孩子qwq ...

  4. CentOS 7修改yum源为阿里源

    1.备份本地源 1 # mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak 2.获取阿里yum源配置 ...

  5. Linux例行工作与系统管理(13)

    Linux 系统的任务是由cron(crond)这个系统服务来控制的,Linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外,由于使用者自己也可以设置计划任务,所以Linux ...

  6. nginx root&alias 文件路径配置

    nginx 指定文件路径有两种方式 root 和 alias,root 与 alias 主要区别在于 nginx 如何解释 location 后面的 uri,这会使两者分别以不同的方式将请求映射到服务 ...

  7. 什么是NAT端口映射?

    背景:我们访问百度的时候输入www.baidu.com出现的网站首页.发生了什么事情?百度它有服务器,IP地址是公网的,有自己的域名,所以你可以正常访问到百度(实际上访问的是IP地址+服务端口).如果 ...

  8. Python中Gradient Boosting Machine(GBM)调参方法详解

    原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...

  9. 微信 OAuth2 网页授权获取用户信息

    文档:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html !!! 微信跟用户没有关系类接口采用了OAUTH2 [ ...

  10. Mysql大数据表优化处理

    原文链接: https://segmentfault.com/a/1190000006158186 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表 ...