Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 631|回复: 0

nodejs开发解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-2 11:19:23 | 显示全部楼层 |阅读模式

    1.2. 统一环境

    开发环境

    • nvm
    • nrm
    • nodejs 0.10.38
    • node-inspector

    部署环境

    • nvm
    • nrm
    • iojs 2.x
    • pm2
    • nginx

    异步流程控制:Promise是唯一选择,而且从一开始就要强制使用,绝不可忽略,这关系到设计思维的巨大差异,甚至关系到我们是否真正能够在 node.js方向坚持下来。我们用Q.js,和前端Angular.js使用的微缩版Q.js保持一致,减少学习周期。

    1.4. 启动开发模式

    因为我们在开发过程中总是希望修改后立即看到效果,而不是每次都要终止进程并重启。

    supervisor 可以帮助你实现这个功能,它会监视你对代码的改动,并自动重启 Node.js

    开发模式我推荐 supervisor

    安装

    npm install --save supervisor 

    启动

    supervisor app.js or supervisor www/bin 

    我的实践是把package.json里的start

    "scripts": {  "d": "node-debug app.js",  "start": "./node_modules/.bin/supervisor app.js" } 

    然后

    npm start 

    还有一个库也不错,叫nodemon

    see http://nodemon.io/

    1.5. 调试模式

    推荐node-inspector

    安装

    npm install --save node-inspector 

    启动

    node-inspector app.js or node-debug www/bin 

    我的实践是把package.json里的d里

    "scripts": {  "d": "node-debug app.js",  "start": "./node_modules/.bin/supervisor app.js" } 

    然后执行

    npm run d 

    npm run命令详解,见https://github.com/i5ting/npm-run-test

    1.6. 启动产品上线模式

    产品模式我们推荐使用pm2

    pm2是非常优秀工具,它提供对基于node.js的项目运行托管服务。它基于命令行界面,提供很多特性:

    • 内置的负载均衡器(使用nodecluster module)
    • 以守护进程运行
    • 0s(不间断)重启
    • 为ubuntu/ CentOS 提供启动脚本
    • 关闭不稳定的进程(避免无限死循环)
    • 基于控制台监控
    • HTTP API
    • 远程控制以及实时监控接口

    pm2使用nodecluster构建一个内置的负载均衡器。部署多个app的实例来达到分流的目的以减轻单app处理的压力。

    安装pm2

    sudo npm install -g pm2 

    查看基本帮助文档

      Basic Examples:  Start an app using all CPUs available + set a name :  $ pm2 start app.js -i 0 --name "api"  Restart the previous app launched, by name :  $ pm2 restart api  Stop the app :  $ pm2 stop api  Restart the app that is stopped :  $ pm2 restart api  Remove the app from the process list :  $ pm2 delete api  Kill daemon pm2 :  $ pm2 kill  Update pm2 :  $ npm install pm2@latest -g ; pm2 updatePM2  More examples in https://github.com/Unitech/pm2#usagefeatures  Deployment help:  $ pm2 deploy help 

    上面基本是我们比较常用的

    1.7. pm2的最佳实践

    把启动写到json配置文件中

    // 20150531071243
    // https://raw.githubusercontent.com/RocketChat/Rocket.Chat/master/pm2.production.json { "apps": [ { "name": "rocket.chat.0", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8080", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8080" } }, { "name": "rocket.chat.1", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8081", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8081" } }, { "name": "rocket.chat.2", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8082", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8082" } }, { "name": "rocket.chat.3", "max_memory_restart": "1024M", "log_date_format": "YYYY-MM-DD HH:mm:ss SSS", "script": "/var/www/rocket.chat/bundle/main.js", "out_file": "/var/log/rocket.chat/app.log", "error_file": "/var/log/rocket.chat/err.log", "port": "8083", "env": { "CDN_PREFIX": "//dbde4sd21oahf.cloudfront.net", "MONGO_URL": "mongodb://localhost:27017/rocketchat", "MONGO_OPLOG_URL": "mongodb://localhost:27017/local", "ROOT_URL": "http://rocket.chat", "PORT": "8083" } } ] } 

    部署

    pm2 deploy ecosystem.json production setup 

    第一个傻瓜原则,你的机器有几核,你就几个实例

    Start an app using all CPUs available + set a name : $ pm2 start app.js -i 0 --name "api" 

    上面的配置文件了配置了4个,你应该能自己估算出点什么

    第二个傻瓜原则,想机器瘫痪么?最简单的办法是内存不足,怎么样能防止内存被吃尽呢?

    很简单,和lru cache一样,设置最大可用内存,防止内存用爆

    参数里

     --max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets) 

    配置文件了也一样

    "max_memory_restart": "1024M", 

    4个实例,每个可占用内存为1G,那么你应该能自己估算出点什么

    第三个傻瓜原则,敏感信息咋办?有2种办法

    1. 使用config/default.example.json。部署的时候拷贝一份,然后按需修改
    2. 使用pm2的env,在环境变量里配置,pm2的json是在服务器上生成的,每个服务器都要生成一次的

    推荐pm2的env这种方式,相对更简单点

    第四个傻瓜原则,集群状态下的应用应该是stateless的(无状态),不能依赖代码去做一些事儿的,比如自己写队列处理cache

    因为每个实例都是独立的,你读写不是全局的,一定会有各种问题,尽量使用第三方独立的服务,比如配置文件(非实例下面),比如redis等缓存,db等

    1.8. pm2高级用法

    1.8.1. reload

    启动的时候会指定一个名字,以后根据该名字,进行特定操作

    pm2 reload some-app 

    它的好处是0秒延时,可以和nginx -s reload媲美

    1.8.2. monit

    pm2 monit 

    更多内容 https://github.com/Unitech/PM2#monitoring

    1.8.3. 日志

    更多内容 https://github.com/Unitech/PM2#log-facilities

    $ pm2 logs
    $ pm2 logs big-api $ pm2 flush # Clear all the logs 

    1.8.4. web

    npm run web 

    访问 http://127.0.0.1:9615

    1.8.5. 开机启动

    pm2 startup centos 

    注意:示例的package.json里给出的是centos里增加开机启动项,如果是其他操作系统,请自己更改

    更多内容 https://github.com/Unitech/PM2#startup-script-generation

    $ pm2 startup <ubuntu|centos|gentoo|systemd> 

    开机启动,还要注意的一点是要保存一次pm2运行数据的

    pm2 save 

    1.9. 要不要nginx 或者 haproxy ?

    nginx

    • 主要做反向代理和静态资源处理(如果没有cdn,就把public下的内容放到nginx里)
    • 负载
    • 阻止了很多常见的攻击和慢客户端

    nginx负载对应多台机器,每台机器里起多个(cpu个数)实例,单机负载使用pm2管理。

    nginx和haproxy都是针对多台机器的负载,功能差不过,使用和插件方面,nginx稍强一点,知名度更高一点

    1.10. 另外一种部署方式

    passenger是rails部署时常用的服务器,不过庆幸的是这帮货出了node版本,而且性能不错

    有兴趣的可以去研究一下 nginx + passenger

    1.11. mongodb的部署

    • 安全 https://cnodejs.org/topic/54cdd026ef1b48510c27e07a
    • 集群 http://www.linuxidc.com/Linux/2015-02/113296.htm

    1.12. redis部署

    http://www.linuxidc.com/Linux/2014-07/104306.htm

    1.13. 简单压测

    • apache ab
    • wrk

    1.14. node cluster和nginx负载性能比较

    todo

    别人测试的node的性能稍高,不过我还是想自己测测

    1.15. 性能调优

    todo

    1.16. keeplive

    • http://www.bubuko.com/infodetail-260176.html

    1.17. 监控

    • newrelic https://cnodejs.org/topic/53fde58d7c1e2284785cd39e

    1.18. 资源

    • http://promotion.pm2.io/
    • https://github.com/Unitech/PM2
    • https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

     

    如果你正在找Node.js的学习资料及指南,那么请继续(阅读),我们的教程将会覆盖即时聊天应用、API服务编写、投票问卷应用、人物投票APP、社交授权、 Node.js on Raspberry Pi等等。

    以下是Node.js入门的简单介绍,如果你对Node.js略有了解可以直接跳过此部分。

    那什么是Node.js呢?

    Node.js是迄今运用最多的服务端JavaScript运行时环境,使用JavaScript开发跨平台的实时WEB应用。

    Node.js基于Google的V8 JavaScript引擎。基于事件驱动,非阻塞的输入输出模型,这也使得其高效而轻量。

    imqipan
    imqipan
    翻译于 8个月前
    1人顶
     翻译得不错哦!
     
    其它翻译版本(1)

    Node.js的强大之处在于其能力支持数据密级性的交互应用,因为这类应用的函数围绕着用户事件,数据I/O和数据流的处理。对于JSON的API,Node.js同样显得很神奇,它是单页WEB应用的心脏和灵魂。

    Node.js的流行程度可以感觉得到,像eBay、target、City Group、Sony、Uber、LinkedIn、Medium、Netflix等等的大公司都有在他们的web项目中应用。

    怎样学习Node.js呢?

    Node.js的开发者来自全球,他们用Node.js开发复杂交互的,数据密集型的WEB Apps和网站。同时网上有着大量的资源和教程教你怎样构建自己的Node.js应用。

    我们不防看看Node.js大神针对Web Apps写的Node.js最佳指南。

    我们所覆盖的指南将包括针对初学者的Node.js、中级指南,同时还有教你怎样构建复杂的Node.js项目。

    imqipan
    imqipan
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    对于完全的Node.js初学者,  在深入挖掘本文章后续提到的学习项目之前,一步步按照airpair.com上面入门指南的要点Node.js入门指南 之类的文章学习是不错的选择。Nodeschool.io是另一个比较好的网站,上面有着非常多的资料,可以学习基本的node.js及相关的技术。

    通过Express框架和Socket.io构建即时通讯APP

    将一个新技术学到一定高度的最好方式就是通过功能性的应用了。在这个指南中,你将学习使用Express框架和Socket.io构建即时通讯应用,这些技术可以使用基于事件的双向通信。在这个指南中,你还将使用JavaScript模板引擎Jade。

    我们要介绍的指南由Krasimir Tsonev所撰写,发布在tutsplus.com上面,从node.js的环境搭建,使用Express框架的后端服务,到最后使用Jade模板引擎的前端UI开发,覆盖了所有前端到后端的方方面面。

    你可以在后面这个链接中找到这篇指南:  即时通讯(Node.js Tutorial – Real Time Chat) .

    imqipan
    imqipan
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    使用Swagger创建Restful API

    这个精心设计的教程解释了如何使用Swagger来创建Rest API,并且包括了Rest API应该支持的所有操作(CRUD,创建,查询,更新,删除)。这个例子是由来自scotch.io的Samuela Zara提供的,它实现了管理电影集合的Rest API。

    Swagger是一个非常强大的框架来描述REST APIs,它提供了交互式的API文档编辑,客户端sdk生成以及发现服务。通过使用Swagger,你所书写的API将更容易被大家所理解并且使用。

    在这个教程中,Samuela一开始先教会大家如何安装node.js的Swagger模块,然后介绍了Swagger提供的模拟模式。通过这个模式,API开发者可以先集中精神进行API本身的设计,而不用写一行的代码。当这个API结构被设计完成之后,教程开始带领大家具体实现获取电影,增加/修改电影以及删除电影的操作。

    你可以通过Restful API in Node.js using Swagger这个链接来访问该教程。

    HAILINCAI
    HAILINCAI
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    在 Node.js 中使用 Nodal 建立 API Services

    在大多数模块和框架之上,你就不会需要再建立任何简陋的 JavaScript/Node.js 项目。为了多平台(移动端,web,IOT)产品开发,面向服务的架构是关键的,而本教程就将带你更进一步。

    在本教程中,Keith Horwood 利用 Nodal 框架在 Node.js 中来创建 API services,并让这一切看起来极其简单。Nodal 是一个可扩展的,以意见为依据的全服务框架,它帮助数据中心加快在 Node.js 基础上的API创建。

    在本教程中,你将会在开发 MVC (模型,控制器和视图)之前安装 node.js 环境,安装 Nodal 和 postgreSQL。 

    你可以在这里找到本教程: 在 Node.js 中使用 Nodal 建立 API Services.

     

    无若
    无若
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    Node.js Apps - 使用通行证进行社交认证

    社交认证几乎随处可见,因为我们绝大多数人在Facebook 、Twitter和Google这样的某个社交网络上都有自己的账号。社交网络认证的工作过程是使用已有的社交网络证书进行单点登录,同时可以登录到其它的程序。

    在本教程中,你会构建一个简单的Node.js程序,通过使用通行证作为中间件使用社交认证进行登录。本教程由Agraj Mangal编写,发表在tutsplus.com网站上。

    要获得本教程可访问链接Node.js Apps - Social Authentication with Passport.

    使用Rethink DB和Node.js开发投票App

    本教程主要针对的是对Node.js有基本理解的初学者。在本教程中,你能通过开发一个简单的投票app学习Node.js,该程序给用户提供投票的三个选项,并提供投票人数的实时更新。

    Angular和angural素材设计库用于程序的前端设计,Node.js用于服务器端,rethink DB用来存储投票数据和相关联的用户数据。

    通过编写完成这样一个简单的程序,你就可以掌握创建整个程序的方方面面。

    要获得本教程可访问- Polling App using Rethink DB and Node.js.

    昌伟兄
    昌伟兄
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    角色投票系统 – Node.js, React, MongoDB and Socket.io

    这个教程是为有一定基础的nodejs开发人员量身定做的,如果你是一个nodejs的初学者,那么这个教程并不适合阅读。这是一篇由Sahat Yalkabov编写的经过精心组织的教程,目的是为多人在线游戏(Eve Online)开发一个角色投票应用,这是一个功能完整的项目。Eve Online是一个多人在线游戏,每个玩家都有一个3D形象来代表他们的角色。

    这篇教程覆盖了一下这些内容:使用Node.js Express 框架创建REST API, 使用MongoDB进行数据的存储,使用Socket.IO实时跟踪在线的访问者,使用React(和Flux)进行服务器端的页面绘制,并且最终将这个引用部署到云端。通过这个教程,你不仅能建成一个对Eve Online进行角色头像投票的系统,而且还可以通过充满乐趣的方式学习到许多的知识。

    你可以通过下面的链接访问这个教程 - Character Voting App – Node.js, React, MongoDB and Socket.io

    HAILINCAI
    HAILINCAI
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     
    其它翻译版本(1)

    使用 Node.js 和 Reactive.js 的 WI-FI 仪表板

    这个教程是由 Marcello La Rocca 在 Sitepoint.com 上编写的,适合中级的 Node.js 编程者。Marcello 的引领来自之前的系列教程,它还引导建立了一个仪表板添加更多关于周围可连接 Wi-Fi 的信息。

    在这个教程中,你实现的服务器运行在Ubuntu上,做一点小修改也可以运行在windows和mac上。服务器实现的扩展来自于 Marcello 之前的教程 - 使用 Node.js创建电池。实现服务器搭建之后,你编写客户端和用户接口并使用HTML模板给当前的 Wi-Fi 列表。

    你可以找到这个教程 使用 Node.js 和 Reactive.js 编写 WI-FI 仪表板

    无若
    无若
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    测试驱动的开发 - Node.js 和 Mocha

    这篇由Semaphoreci.com提供的教程将交会你如何使用Mocha来进行单元测试和集成测试。

    Mocha是一个JavaScript测试框架,它既可以运行在浏览器中,也可以运行在Nodejs环境中。Mocha将按照顺序执行所有的测试,并将出现的未捕获异常映射到相应的测试用例上。

    你可以通过使用npm来引入mocha模块。这个教程中的例子实现了一个颜色转换程序,这个程序将RGB转换成16进制形式。这个教程还创建了一个web服务器来测试异步代码。

    你可以通过下面的链接Test Driven Development – Node.js and Mocha找到这个教程。

    HAILINCAI
    HAILINCAI
    翻译于 8个月前
    0人顶
     翻译得不错哦!
     

    在树莓派上使用Node.js

    这篇Node.js教程是"在创造中学习"(learning through making)系列的一部分,该系列由Dave Johnson编写,发表在thisdavej.com网站上。通过本教程,你能学会在树莓派2和树莓派3上安装Node.js。本教程自始至终主要关注的是在树莓派上安装Node.js。 学完本教程后,你可以进一步学习本系列中的其它教程,以便学会在树莓派上使用Node.js,教程包括“探索使用Node.js在树莓派上创建因特网web服务器”和“不用编码而只使用node.js创建web服务器”。

    要获得本教程和其它相关的教程可访问Node.js on Raspberry Pi

    Node.js教程:开发情绪分析应用

    这是另一篇优秀的教程,由Scott Rich编写,发表在IBM developerWorks上。本教程使用Node.js, Express框架, Sentiment模块和ntwitter模块开发了一个基于推特进行情绪分析的小型程序。 在本教程中,你将学习设置express框架,运行并测试hello Node.js程序,以确保框架工作正常,为程序添加情绪分析功能,并将程序连接到twitter,最后将它们整合在一起,以形成一个功能完整的程序。

    Twitter Sentiment Analysis App in Node.js上可以找到这篇教程。

     

    贴士 1: 在开发环境使用 nodemon, 在生产环境使用pm2

    当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样。 当我第一次开发的node app时候,这个让我感到异常挫败和痛苦, 尤其是每当我修改很小东西的时候需要control+c

    幸运的是我发现了一个非常棒的工具Nodemon。 你可以利用以下的命令来安装

    Nodemon 是一个令人惊叹的工具, 当你全局安装它以后, 可以通过 nodemon [file].js 来启动你的node.js scripts,它会告诉nodemon来监视你的script和scripts的所有变化, 这样的Node.js开发方式非常震撼以及让大大提高开发速度。

    那么,生产环境又如何, 除非你用了herokuNodejitsu或者其它一些好的 Node.js 平台(也许它们有类似的功能), 但是碰巧你用了EC2 或者一些其它的云平台来运行你的Node.js app, 你如何能然保证这是一个始终运行的Node.js app

    案就是PM2, PM2 是一个类似于Nodemon的工具,不同之处在于它用于生产环境, 和Nodemon相似的地方在于它会监控你的app的任何修改或者重新部署,但是有更好的一面, PM2 在遭遇到崩溃的时候,它会正确重启你的app。

    PM2的优胜之处在于当你要将app需要多核处理的时候,PM2内部集成的负载均衡可以让你很容易的去指定运行多少个实例。

     

    -i参数目的是指定运行多少个实例,在这个例子中 PM2 使用了一个常量max来扩展你的app运转到你最大的核数,不要忘记Node 平时只会运行在单核!

     

    贴士 3: 轻松调试 Node.js apps

    如果你从一个IDE重度集成的语言比如java 或者C# 转来调试Node.js, 你一定会感到很困扰, 大部分新加入node的开发者采用了’flow’的调试模式,从这一刻开始你最好的朋友就是console.log

    但是依然有更常见的调试方式来代替, Node.js 内置了一个调试器你可以称为 node debug, 不过我更喜欢的 node-inspector

    它们的github说 “Node Inspector 是一个使用Blink Developer Tools (以前称为WebKit Web Inspector)node.js调试器的界面,”

    简而言之,node-inspector 可以让你用任何你想用的编辑器和chrome web tools来调试你的应用,这是多么的性感。

    Node-inspector 可以让你做一些非常酷的事情,比如实时修改,单步调试,注入以及一堆其它非常酷的东西。

    让我们来根据指示一步一步安装

    https://github.com/node-inspector/node-inspector

    贴士 4: Nodefly

    一旦你有你的应用程序正常运行,你可能会问自己,你怎么可以监视它的性能和配置文件,以确保您的应用程序运行在最佳的速度。最简单的答案是一个卓越的服务,我称为Nodefly。

    用简单的一行代码Nodefly开始监视你的应用程序内存泄漏,测量redis用了多久,mongo查询和一堆其它很酷的东西。

    http://www.nodefly.com

     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 01:02 , Processed in 0.063000 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表