2.1 选择Node.js的理由

如今,Node.js已经成为国际上许多科技公司的首选方案。特别的,对于在服务器端需要非阻塞特性(例如Web Sockets)的场景,Node.js俨然成了最好的选择。

安装Node.js, npm, Seneca和PM2

Node.js的线程模型

SOLID设计原则:模块化归结于以下设计原则,单一职责原则、开放封闭原则、里氏替换原则、接口分离原则、依赖倒置原则。

在Node.js中,每个JavaScript文件默认是一个模块。当然,也可以使用文件夹的形式组织模块。

在Node.js中使用全局变量是个让人头痛的事前。使用全局变量会将各个模块耦合在一起,但是过度耦合是我们无论如何都要避免的。

function init(options) {function charToNumber(char) {return char.charCodeAt(0) - 96;}function StringManipulation() {}
}
module.exports = init;

2.2 微服务框架Seneca

Seneca是一个用于构建微服务的框架。它使用完备的模式匹配接口来连接各个服务,从代码中将数据传输抽象出来,使编写具有高可扩展性的软件变得相当容易。

var seneca = require('seneca')()seneca.add({role:'math', cmd:'sum'}, function (msg, respond) {var sum = msg.left + msg.right;respond(null, {answer: sum});
})
seneca.add({role:'math', cmd:'product'}, function (msg, respond) {var product = msg.left * msg.right;respond(null, {answer: product});
})
seneca.act({role:'math', cmd:'sum', left:1, right:2}, function(err, data) {if (err) {return console.error(err);}console.log(data);
});
seneca.act({role:'math', cmd:'product', left:3, right:4}, console.log);

实现控制反转:一种软件思想,它能代理创建或调用各组件及方法,使得模块本身不用关注创建它们所需要的依赖,这些通常是通过依赖注入完成的。

Seneca的模式匹配: 统计单词数的例子

var seneca = require('seneca')()seneca.add({cmd:'wordcount'}, function (msg, respond) {var length = msg.phrase.split(' ').length;respond(null, {words: length});
})
seneca.add({cmd:'wordcount', skipShort: true}, function (msg, respond) {var words = msg.phrase.split(' ');var validWords = 0;for (var i=0; i<words.length; i++) {if (words[i].length > 3) {validWords++;}}respond(null, {words: validWords});
})
//处理器1
seneca.act({cmd:'wordcount', phrase: 'Hello world this is Seneca'}, function(err, response) {console.log(response);
});
//处理器2
seneca.act({cmd:'wordcount', skipShort: true, phrase: 'Hello world this is Seneca'}, function(err, response) {console.log(response);
});

模式匹配库Patrun:Seneca使用它来执行模式匹配,获取最长匹配项和模式中元素的顺序

{ x:1,     } -> A
{ x:1, y:1 } -> B
{ x:1, y:2 } -> C

复用模式
    编写插件:通用的功能可以被模块化并抽象成可复用的组件。

function minimal_plugin( options ) {console.log(options);
}
require( 'seneca' )().use( minimal_plugin, {foo: 'bar'})

整合Web服务器:Seneca默认通过TCP传输层进行信息交互。

讨论一个更普遍的用例:服务的调用方是浏览器中的JavaScript。虽然通过普通JSON会话就能满足需求,但是如果Seneca提供REST API来代替它会更简单。这对于微服务之间的通信来说是完美的选择,除非你要求极低的延迟。

Seneca并不是一个Web框架。它被定义为一个通用的微服务框架,因此它并不会对具体的某个应用场景做过多的支持。取而代之的是,Seneca能够非常轻易地与其他框架进行整合。

Express是基于Node.js构建Web应用的首选。

将Seneca作为Express的中间件:Express也是基于API聚合原则构建的。在Express中,每个软件模块都被称为中间件,它们在代码中以链式结构串联,以此来处理每个请求。

var seneca = require('seneca')();
seneca.add('role:api, cmd:bazinga', function(args, done) {done(null, {bar:"Bazinga!"});
});
seneca.act('role:web', {use:{prefix: '/my-api',pin: {role:'api', cmd:'*'},map: {bazinga: {GET: true}}
}});
var express = require('express');
var app = express();
app.use( seneca.export('web') );
app.listen(3000);

数据存储:Seneca具有数据抽象层,允许我们使用通用的方式操作应用的数据。默认加载in-memory存储插件。

PM2

2.3 PM2---Node.js的任务执行器

PM2是一款可以为服务器实例带来负载均衡功能的生产级别的进程管理器,通过PM2可以自由伸缩Node.js应用。此外,它能确保进程持续运行,解决Node.js单线程模型带来的副作用:一个没有被捕获的异常通过杀死线程,进而杀死整个应用。
单线程应用及异常:单线程模式意味着,如果抛出的异常没有被处理的话,应用程序将会挂掉。
这个问题可以通过使用promise库(例如bluebird)解决;通过promise方式,应用不仅可以处理成功的返回,还能够处理异常,因此它可以防止异常“冒泡”导致应用崩溃。
然而,还是存在一些在我们控制范围之外的情况,称之为不可恢复的错误。一旦出现,最终将导致你的应用程序崩溃。在Java中不是大问题,但Node.js中却是一个大问题。但是,通过任务执行器,例如forever来解决这个问题。
forever与PM2都是任务执行器,当应用意外退出时,它们可以重启应用,从而能保证其正常运行。
相当有用的工具包nodemon:当它探测到监控的文件发生变化时,它将重载应用。
PM2---业界标准的任务执行器
PM2比forever更胜一筹。可以管理应用的整个生命周期,并且实现没有停机时间,也具备负载均衡的功能。
hello.js
var http = require('http');
var server = http.createServer(function(request, response) {console.log('called');response.writeHead(200, {"Content-Type": "text/plain"});response.end("Hello World\n");
});
server.listen(8000);
console.log("Server running at http://127.0.0.1:8000/");

$ pm2 start hello.js
   $ pm2 show 0   #得到id为0的应用的相关信息

$ pm2 monit     #监控
$ pm2 logs       #查看输出日志
只需要很少的命令,就能够覆盖90%的监控需求
$ pm2 reload all    #轻易地无缝重启应用
$ pm2 stop all
$ pm2 delete all
$ pm2 start hello.js -i 3
PM2将启动一个控制进程和指定个数的工作进程。因此,单线程模型的Node.js也能享受到多核CPU带来的性能提升。
$ pm2 scale hello 2    # 工作进程有3个减少为2个
我们能够毫不费力地配置应用,以做好生产准备。

Node.js微服务 2 :基于Seneca和PM2构建Node.js微服务相关推荐

  1. 金融科技排头兵金证股份携手微丰,基于企业微信的新一代CRM为客户提供智能服务

    近日,国内最大的金融证券软件开发商和系统集成商深圳市金证科技股份有限公司携手微丰,打造基于企业微信的新一代CRM,为客户提供更加智能的运营和服务. 随着新兴技术不断发展及国家配套政策出台的支持,&qu ...

  2. nodejs 调用微服务器_无服务器NodeJS:构建下一个微服务的快速,廉价方法

    nodejs 调用微服务器 by Filipe Tavares 由Filipe Tavares 无服务器NodeJS:构建下一个微服务的快速,廉价方法 (Serverless NodeJS: the ...

  3. 【微电网】基于风光储能和需求响应的微电网日前经济调度(Python代码实现)

    目录 1 概述 2 知识点及数学模型 3 算例实现 3.1算例介绍 3.2风光参与的模型求解 3.3 风光和储能参与的模型求解 3.5 风光储能和需求响应都参与模型求解 3.6 结果分析对比 4 Py ...

  4. js 字符串加减法_基于字符串的数值之加减乘除JS算法研究

    在我们的日常js项目中,我们不免会碰到需要进行前端计算的场景.而大家都知道,计算机进行计算时存在精度问题,且数值有值域,偶尔会碰到溢出问题.在最近的一个项目中,由于遇到了一个超过20位的数,因此,又不 ...

  5. 魔坊APP项目-16-种植园、websocket协议、服务端基于socket提供服务(基于房间管理分发信息)、种植园页面展示

    种植园 我们需要完成的种植园,是一个互动频繁,并且要求有一定即时性的模块,所以如果继续基于http协议开发,那么需要通过ajax发送大量http请求,同时因为http本身属于单向通讯,所以服务端无法主 ...

  6. 使用pm2启动node文件_使用 PM2 管理nodejs进程

    pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. 它非常适合IaaS结构,但不要把它 ...

  7. 使用 OpenAI API 构建 Next.js 应用程序的初学者指南

    欢迎阅读我们的初学者指南,了解如何使用 OpenAI API 构建 Next.js 应用程序.在本教程中,我们将引导您完成利用 OpenAI API 的功能创建功能强大且智能的 Next.js 应用程 ...

  8. Node.js 的微任务处理(基于Node.js V17)

    前言:Node.js 的事件循环已经老生常谈,但是在 Node.js 的执行流程中,事件循环并不是全部,在事件循环之外,微任务的处理也是核心节点,比如 nextTick 和 Promise 任务的处理 ...

  9. 基于Spring Boot和Spring Cloud实现微服务架构学习--转

    原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...

最新文章

  1. 基于希克斯需求价格弹性计算_Serverless弹性伸缩的现状调研(超详细)
  2. 面试官:你说你熟悉jvm?那你讲一下并发的可达性分析
  3. Cisco 2950 忘记密码如何重设
  4. 十、给小白看的第三篇Python基础教程
  5. 科蒂斯控制器故障代码_卡特挖掘机故障代码【收藏备用】
  6. java制作玩游戏并支付游戏币_java 学习第三天小练习
  7. python相关工具使用技巧(pip)
  8. PR软件下载Adobe Premiere Pro CC 2019安装教程
  9. 创建CrossApp工程
  10. html js实现分页代码,js分页代码示例
  11. 北大软微计算机技术硕士复试,【高分学长带你飞】北大软微408学长超详经验贴...
  12. 使用SaltStack Returner将Salt作业信息接入Elasticsearch的实践(踩坑)
  13. 天涯上令人肝肠寸断的100个签名!
  14. 【DB笔试面试1-100】
  15. mac 解决sudo: no valid sudoers sources found, quitting
  16. 【定时任务】xxl-job框架学习笔记
  17. mysql批量删除5000条数据_mysql批量删除大量数据
  18. 小黑屋激活器 提示 设备上还有账户未删除
  19. mac os版spyder 安装jieba报错 No module named ‘jieba‘
  20. android remount 命令,Android remount failed解决问题以及/system‘ not in /proc/mounts 解决

热门文章

  1. PHP一行代码实现项目绑定域名从而保护源代码
  2. Android手机QQ的UI自动化实践,为什么spring能最好地改变Android
  3. 我叫MongoDb,不懂我的看完我的故事您就入门啦!
  4. 广州可得 全面亮相第十七届SDS及2022中国国际防伪溯源展
  5. 广东开放大学信息安全与计算机科学那个好,贺桂英-广东开放大学信息与工程学院...
  6. android博学谷布局,Android项目实战系列—基于博学谷(四)我的模块(下)
  7. css样式文件的引入方式
  8. 将地质图(shp文件)叠加到天地图上
  9. 1309:【例1.6】回文数(Noip1999)
  10. 服装网上销售“美国版”——互动+体验=成功