高可用架构专用javascript
原文[高可用架构]php
https://mp.weixin.qq.com/s?_biz=MzAwMDU1MTE1OQ==&mid=405001493&idx=1&sn=f0ecab9b31bad83fb065ac37bb728245&scene=1&srcid=0324iTRH12WbXL5VDxXnEhH8&key=710a5d99946419d938a0ffc16a3c72118eefbe33f3f8312ed218bccbde126b60e818c8eb1068a9b07bdc8116a077b911&ascene=0&uin=NDIzMjM3MDk1&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10.5+build(14F27)&version=11000006&passticket=xdp3crkTJPuOH6ggUMKnwvfDGKEnMUvwC5V%2FdxlW%2FKdNO9R8zI1xsDFSR4ZJECUUcss
仔细的对比了一遍,感谢tim yang和庆丰校长的整理,很是严谨,比我讲的要好,另外感谢霍老板封我是StuQ明星讲师[呲牙][呲牙]html
Why Node.js ?前端
历史vue
槽点html5
架构平衡和选择java
企业级node
我眼中的Node.js核心mysql
快速开发实践
全栈 or 全烂 ?
工具链
前端开发4阶段
Hybrid开发
跨平台
全栈的可能
将来
最近比较火的2016年开发者调查了,Node.js和全栈、以及和js相关的技术都有不错的战绩,此次给你们分享一下《全栈工程师之路-Node.js》,准备的还不够充分,水平也有限,你们见谅啊
http://stackoverflow.com/research/developer-survey-2016
桑世龙,目前在天津创业,空弦科技 CTO,开源项目Moajs做者,StuQ明星讲师 公司目前使用技术主要是Node.js, 技术栈算所谓的MEAN(mongodb + express + angular + node); 曾在新浪,网秦等工做过; 算全栈程序员吧,带过前端、后端、数据分析、移动端负责人、作过首席架构师、技术总监,目前主要从事技术架构 + 招人工做
已经7岁的Node.js,你还熟悉么?
之前?如今?
http://i5ting.github.io/history-of-node-js/
IO.js 1.0.0 发布
Joyent 推动创建 Node.js 基金会
Joyent, IBM, Microsoft, PayPal, Fidelity, SAP and The Linux Foundation Join Forces to Support Node.js Community With Neutral and Open Governance
IO.js 和 Node.js 和解提案
npm 支持私有模块
Node 项目领导人 TJ Fontaine 逐步解除核心身份并离开 Joyent 公司
A changing of the guard in Nodeland.
Node.js 和 io.js 在 Node 基金会下合并状况
4.0 版本发布,即新的 1.0 版本
Node v4.2.0,首个长期支持版本(LTS)
Apigee,RisingStack 和 Yahoo 加入 Node.js 基金会
Node Interactive
The first annual Node.js conference by the Node.js Foundation
去年
从v0.10.35 开始
2015-01-14发布了v1.0.0版本(io.js)
2.x(io.js)
3.x(io.js)
2015年09月Node.js基金会已发布Node.js V4.0版 与io.js合并后的第一个版本
2015年10月Node.jsv4.2.0将是首个lts长期支持版本
年末发布到4.2.4 && 5.4.0
目前(2016年3月20日)的2个版本
v4.4.0 LTS(长期支持版本)
v5.9.0 Stable(稳定版本)
总体来讲趋于稳定
成立了nodejs基金会,可以让nodejs在将来有更好的开源社区支持
发布了LTS版本,意味着api稳定
快速发版本,不少人吐槽这个,其实换个角度看,这也是社区活跃的一个体现,但若是你们真的看CHANGELOG,其实都是小改进,并且是边边角角的改进,也就是说nodejs的core(核心)已经很是稳定了,能够大规模使用
Node.js与生俱来的2个特性
event-driven
non-blocking I/O
结果,今天。。。各类【异步】。。。烂大街了
异步已经不是明显优点了
第1、callback hell问题,目前已经很好的解决了,promise/generator/async后面会讲
第2、npm已是开源世界里最大的包管理器了,模块很是丰富(25.6万+)
官方说
Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
之前咱们老是喜欢拿异步说事儿,如今咱们拿Node.js的强大的生态来炫耀
下面介绍点Node.js的大事儿记
2014年 nearform NODE.JS为何会成为企业中的首选技术
2015年 IBM 收购 StrongLoop,拓展云服务业务
Node.js基金会的创始成员包括Joyent、IBM、Paypal、微软、Fidelity和Linux基金会
更多参见 https://nodejs.org/en/foundation/members/
对于企业级开发,Node.js是足够的,不管从性能、安全、稳定性等都是很是棒的。
空弦科技作的是基于云仓储的SaaS服务,给中小卖家提供服务,核心系统是进销存+订单池+WMS。目前来看不存在任何问题,稍后会讲咱们为啥选择Node.js
2015年 Ecma国际大会宣布正式批准ECMA-262第6版,亦即ECMAScript 2015(曾用名:ECMAScript 六、ES6)的语言规范
http://babeljs.io/
babel做为es编译器,已经大量开始使用了,模块作的很是棒,还有人用babel写其余语言编译器
Node.js里在0.12以后才增长es6特性,es7的目前还不支持。
因此在Node.js里使用es里比较高级的特性,是须要babel去编译处理的。
这是node追逐的事实标准
2016年01月22日,微软请求 Node.js 支持 ChakraCore
将来Node.js不仅是基于chrome v8引擎,它还能够支持更多其余js引擎,对生态、效率提高等很是有好处
蔡伟小兄弟的查克拉benchmark的对比
基本结论是 V8 ES5 >> 查克拉 ES6 > 查克拉 ES5 > V8 ES6
先看一下咱们的瓶颈在哪里 ?
1)人(天津很差招人)
Node.js招不到,好多都是从java转的,前端也很差找,好多也是从java转的,咱们至关于从0开始组建团队
2)开发速度
创业公司,5分钟要造火箭。。。你们都懂
因此让开发快速进入状态,提升开发速度,对咱们来讲相当重要
3)稳定
在没有专业运维人员的状况下,如何保证系统可用、稳定
因而就引出了我认为的Node.js的好处
1)即一样不优化,性能比大部分语言好(天生被黑的优越感,没办法)
2)即便优化,也比其余语言简单,好比java
3)有足够多的选择和架构的平衡
4)如实在不够,java补
go不着
没有好的包管理
没有好的调试工具
语法较难
适合高端人群,但对团队开发是有门槛的,不适用大部分团队
Node.js给了咱们足够的选择空间
能够采用面向过程
能够面向对象
能够函数式
甚至能够用各类编译器coffee、typescript、babel(es)等
对于从0开始的团队来说,能够先面向过程、而后随着团队的成熟度,一点一点增长难度
测试相关 tdd/bdd/测试覆盖率
规范化 standard、各类lint、hint
构建相关 gulp、grunt、webpack,大量插件
生成器 yo等
包管理工具npm足够简单易用
以上这些都作大型软件的基础,Node.js在这方面作得很是好
不少人把mean组合(好比mean.io)起来,这样作的好处是若是熟悉,开发速度确实会很是快,但肯定是难度太大,不多有人能搞的定
metetor模糊了服务端和客户端,是同构的典型应用,对于实时场景是很是高效的。
这种东西都算特定场景的快速,通常不敢轻易上,调优难度很是大,若是有人能cover的住,在初期是很是高效的。
能够简单,能够难
能够快、也能够慢
能够开发大型软件
还有一个问题就是若是以上不知足咋办?这时就须要架构平衡了
先说技术选型的3个思考点
在语言层面能够作,那语言层面作
若是语言层面搞不定,那就架构层面作
若是架构层面也搞不定,这东西就不能用了
各自作各自合适的事儿就好,下面分别举例看看
咱们很坦然的面对Node.js的优势和缺点
1)语言层面能解决的
已有大量npm上的模块(目前在25.6万个以上)
本身造轮子(站在海量包上+简单语法+npm=快速)
使用Node.js里的nan本身包装c/c++轮子
绝大部分需求均可以知足了
2)架构层面能解决的
业务边界、模块拆分、面向服务
mq、rpc、cache
运维、监控、自动化
稍微解释一下
首先,架构和是否是Node.js写的不要紧,是独立的
其次,架构师经常使用的东东有足够的Node.js模块支持,好比mq,像rabbitmq有比较好的node模块支持,像rpc里thrift、grpc、tchannel支持的都不错,咱们使用的senecajs,好比redis,咱们使用的ioredis,后面作ha都是同样的。
合适的场景用合适的东西
有不少东西是Node.js不擅长,又不在架构范畴里的,咋办?
3)如实在不够,java补(严格点,应该叫其余语言补) - 好比复杂excel生成 - 好比apns推送(go作其实也很好,不过除了我,没人能维护。。。)
但凡是java或其余语言里比较成熟的库,能够做为独立服务使用的,均可以作Node.js的支持。避免过多的时间用在早轮子上,影响开发进度
执行效率:
一样不优化,性能比大部分语言好
开发效率:
Node.js自己比较简单,开发效率仍是比较高的
完善的生态,好比测试、工具、npm大量模块
缺乏rails同样的大杀器
scaffold脚手架
orm太弱
Node.js的web开发框架express、koa等,简单,小巧,精致,缺点是集成度不够,目前已有的mean或yo或sails等总有某种方面的不满意
因此咱们须要作的
固化项目结构
限定orm
自定义脚手架
恰恰Node.js提供了2点,可让你30分钟写一个脚手架
cli命令模块,编写很是容易
基于js的模板引擎(知名的30+)
api服务
前端(moa-frontend)
SDK(OAuth Provider)
辅助开发cli工具
使用0.10.38,开发moajs框架
express/mongodb
pm2部署
阿里云的slb负载
alinode监控
先后端分离
moa-api
moa-frontend
moa-h5(未能用)
上redis缓存
上rabbitmq
上senaca做为rpc
上kong做为api gateway(todo)
上consul作服务发现和配置(todo)
上elk做为日志分析处理(todo)
使用docker compose做为本地开发环境(todo)
线上docker(todo)
技术栈更新
nodejs 4.x(预计今年6月份)
koa(generator/co)
es6/es7(babel)
4.x在内存和性能上都有很是大的提高,新的语言特性上,异步流程和语法上都须要学习,故不急于升级,待人才梯队完善
目前的作法是小步快走
一次只上同样新技术
造成梯队,便可准备上新东西
善用npm,实现3化
模块化
最小化
服务化
1)小而美的哲学
2)从LAMP到MEAN
3)异步流程控制
4)Node.js Web开发
5)Node.js 模块开发
时间缘由,接下来稍微介绍一下MEAN
"Small is beautiful"是Unix哲学9条里的第一条,但对Node.js来讲,它实在是再合适不过了
http://blog.izs.me/post/48281998870/unix-philosophy-and-nodejs
Write modules that do one thing well. Write a new module rather than complicate an old one.
Write modules that encourage composition rather than extension.
Write modules that handle data Streams, because that is the universal interface.
Write modules that are agnostic about the source of their input or the destination of their output.
Write modules that solve a problem you know, so you can learn about the ones you don’t.
Write modules that are small. Iterate quickly. Refactor ruthlessly. Rewrite bravely.
Write modules quickly, to meet your needs, with just a few tests for compliance. Avoid extensive specifications. Add a test for each bug you fix.
Write modules for publication, even if you only use them privately. You will appreciate documentation in the future.
MEAN是目前最潮的全栈javascript架构
MEAN是一个Javascript平台的现代Web开发框架总称,它是MongoDB + Express +AngularJS + NodeJS 四个框架的第一个字母组合。它与传统LAMP同样是一种全套开发工具的简称。
从个人角度看
mysql用mongodb替换,nosql里最像rdbms的,从开发和性能都是有优点的(老毕已经讲过了)
angular的出现是一个时代,ioc,双向绑定,指令等都曾让无数热血沸腾
nodejs提供了彻底的生态和工具链,你要的它基本都有,感谢npm,早些年nodejs的性能甩php几条街的
express做为nodejs示范项目,它很是精简,是比较合适的web框架
我为何选择MEAN架构?
成熟、稳定,简单,有问题咱们能cover住,因此咱们选了nodejs
把握趋势,之后nodejs的前景很是看好,尤为前后端统一,全栈方向
在架构上能够屏蔽可能风险,不背注一掷,也不会一叶障目,合理的使用其余语言,只要每一个功能都以服务出现,至于它是什么语言写的,并不重要
招人成本的性价比相对较高,技术栈新,容易吸引人才
最重要的一件事儿,是当有问题的时候,有人能cover住,在创业初期这是最最重要的事儿。
个人一篇爆款文章《Node.js最新Web技术栈(2015年5月)》https://cnodejs.org/topic/55651bf07d4c64752effb4b1 讲的就是咱们用的技术栈
js流程控制的演进过程,分如下5部分
1) 回调函数Callbacks
2) 异步JavaScript
3) Promise/a+规范
4) 生成器Generators/ yield(es6)
5) Async/ await(es7)
目前全部版本都支持Promise/a+规范
目前Node.js 4.0 + 支持Generators/ yield
目前不支持ES7里的Async/await,但能够经过babel实现
总体来讲,对异步流程控制解决的仍是比较好的。
Node.js Web开发
express、koa
restify、hapi
其余框架sails、meteor
各类类型web开发都支持的,通常咱们采用非restful的使用express、koa更简单
若是是纯restful,能够采用restify、hapi
另外还有快速模拟api的json-server,对rest支持超方便
Node.js模块开发
普通模块
cli
脚手架scaffold
c/c++ addons
普通模块和cli模块只是差package.json里的
"preferGlobal": "true", "bin": { "kp": "kp.js" },
脚手架scaffold = cli + 模板生成,在Node.js里这2点都很是容易
在Node.js里写c/c++扩展,有nan抽象层,其余就看你们的c/c++水平了
创业公司有不少可变性,要作的系统也无数,如何保证业务系统的边界是很是难的,咱们其实走了不少弯路,图-稍后补
当需求和ue定下来以后,就开始编写静态api,这样app、h五、前端就可使用静态api完成功能,然后端也能够以静态api为标准来实现,总体效率仍是比较高的。
另外还有基于api生成http请求的思考(未完成)
api的最佳实践
http://developer.github.com/v3/ (严格的restful)
微博API (可读性强,相对比较传统)
咱们采用的微博API相似的,约定结构也是相似的
res.api is an express middleware for render json api , it convention over api format like this :
{ data: { }, status: { code : x, msg : 'some message' }}
和java开发里的目录结构相似,该分层的分层,适当的按照express/koa增长中间件、路由等目录,便于开发
使用npmjs的private私有模块(目前作法)
使用npm的本地模块开发方法(测试和部署都很是快)
搭建npm私服(todo)
hz-api-cloud-adminhz-api-cloud-orderhz-api-cloud-stockhz-api-privatehz-api-private-adminhz-dao-cloudhz-dao-privatehz-dao-usercenterhz-doc-apihz-frontendhz-mq hz-smshz-usercenterxbm-sdkhz-api-adminhz-api-crmhz-api-orderhz-api-statisticshz-api-stockhz-confighz-daohz-doc
在web开发里,写了moajs生成器,相似于rails
moag order name:string password:string
其余开发,如iOS开发里模型校验很是烦,因而写了一个json2objc命令行工具,读取json,生成oc代码,能够节省很多时间
前端:moa-frontend
public下面的采用nginx作反向代理
其余的采用express+jade精简代码(ajax与后端交互)
后端:moa-api
即上面讲的生成器scaffold
技术栈
express
jade
bootstrap、bootstrap-table
jquery
gulp
nginx
技术栈
Features
自动加载路由
支持mongodb配置
集成mongoosedao,快速写crud等dao接口
自带用户管理
使用jsonwebtoken作用户鉴权
支持migrate测试
支持mocha测试
默认集成res.api,便于写接口
集成supervisor,代码变更,自动重载
gulp自动监控文件变更,跑测试
gulp routes生成路由说明
使用log4js记录日志
从开发效果上看,仍是很是快的,很是稳定的
更多参见我写的《Moajs框架演进之路》
《从0开始写Node.js框架》
grunt/gulp/fis/webpack
bower/spm/npm
tdd/bdd cucumber/mocha
standard
babel/typescript/coffee
html/css/js(基础)
jQuery、jQuery-ui,Extjs(曾经流行)
Backbone(mvc),Angularjs、Vuejs(当前流行)
React组件化(将来趋势)、Vuejs
Vuejs综合Angular和React的优势,应该是下一个流行趋势
Hybrid混搭开发是指使用html5技术开发的跨浏览器应用,并最终能够将html5.js.css等打包成apk和ipa包的开发方式。它也能够上传到应用商店,提供给移动设备进行安装。它最大的好处是经过h5开发一次,就能够在多个平台上安装。
将来的2点
js一统天下(nodejs作后端,传统web和h5使用javasctipt,更智能的工具如gulp,更简单的写法如coffeescript等)
h5大行其道(网速变快,硬件内存增加)
这个大部分都清楚,很少说
在浏览器上作文章,把页面生成各个移动端的app文件
同样是延续浏览器作文章,不过此次把页面生成各个PC平台的可执行文件
目前比较火的编辑器atom和vscode都是基于Electron打包的。
React的出现影响最大的是jsx的出现,解决了长久以来组件化的问题,
咱们反复的折腾js,依然没法搞定
咱们尝试OO,好比extjs
咱们最终仍是找个中间格式jsx
单纯的React只是view层面的,还不足以应用,因而又有Redux
核心概念:Actions、Reducers 和 Store,简单点说就是状态控制
而后再结合打包加壳,变成app或可执行文件
iOS、Android上用Cordova
PC上使用Electron
总结
组件定义好(React)
控制好组件之间的状态切换(Redux)
打包或加壳(Cordova or Electron)
这部分其实组件化了前端,那么可否用这样的思想来组件化移动端呢?
A framework for building native apps with React. http://facebook.github.io/react-native/
简单点说,就是用React的语法来组件化iOS或Android SDK。
它们都在告诉咱们,大家之后就玩这些组件就行了,你不须要知道复杂的SDK是什么
Medis is a beautiful, easy-to-use Redis management application built on the modern web with Electron, React, and Redux. It's powered by many awesome Node.js modules, especially ioredis and ssh2.
技术点
使用Node.js模块
使用Webpack构建
使用React(视图) + Redux(控制逻辑)
使用Electron加壳打包
亲,你看到将来了么?
讲了node工具,前端4阶段,hybrid,各类跨平台,目前就是为了介绍Node全栈的各类可能,下面讲一下如何能作到Node全栈?
全栈核心
后端不会的ui(界面相关)
前端不会的db(业务相关)
只要打通这2个要点,其余就比较容易了
作后端的人
对数据库是比较熟悉,不管mongodb,仍是mysql、postgres
对前端理解比较弱,会基本的html,css,模板引擎等比较熟悉
4阶段按部就班,build与工具齐飞
前端开发4阶段,个人感受是按照顺序,按部就班
html/css/js(基础)
jQuery、jQuery-ui,Extjs(曾经流行)
Backbone,Angularjs(当前流行)、Vuejs
React(将来趋势)、Vuejs
从前端日后端转,api接口很是容易学会,像express、koa这类框架大部分人一周就能学会,最难的是对db、er模型的理解,说直白点,仍是业务需求落地的理解
咱们来想一想通常的前端有什么技能?
html
css(兼容浏览器)
js会点(可能更多的是会点jquery)
ps切图
firebug和chrome debuger会的人都不太多
用过几个框架,大部分人是仅仅会用
英语通常
svn/git会一点
那么他们若是想在前端领域作的更深有哪些难点呢?
基础:oo,dp,命令,shell,构建等
编程思想上的理解(mvc、ioc,规约等)
区分概念
外围验收,如h5和hybird等
追赶趋势,如何学习新东西
以上皆是痛点。
因此比较好的办法
玩转npm、gulp这样的前端工具类(此时仍是前端)
使用node作先后端分离(此时仍是前端)
express、koa这类框架
jade、ejs等模板引擎
nginx
玩转【后端】异步流程处理(promise/es6的(generator|yield)/es7(async|await))
玩转【后端】mongodb、mysql对应的node模块
从咱们的经验看,这样是比较靠谱的。
https://github.com/moajs/moa-frontend
就是最简单先后端分离,里面没有任何和db相关,
技术栈
express
jade
bootstrap,bootstrap-table
jquery
gulp
nginx
通常的前端都很是容易学会,基本2周就已经很是熟练了,个人计划是半年后,让他们接触【异步流程处理】和【数据库】相关内容,学习后端代码,就能够全栈了
移动端分
native原生开发
hybrid混搭式开发
原生开发就是iOS用oc/swift,Android用java或scala等,就算偶尔嵌入webview,能玩js的机会也很是好少
因此移动端转全栈的方法,最好是从cordova(之前叫phonegap)开始作hybrid开发。
只要关注www目录里的h5便可,比较简单
若是h5不足以完成的状况下,能够编写cordova插件,即经过插件让js调用原生sdk里功能
cordova的cli能够经过npm安装,学习npm的好方法
学习gulp构建工具
只要入了h5的坑,其实就很是好办了。
而后h五、zeptojs、iscroll、fastclick等
而后微信经常使用的,如weui、vux(vue+weui)、jmui(react+weui)
而后能够玩点框架,好比jquery mobile,sencha touch
而后能够玩点高级货,ionicframework(基于angularjs、cordova)
而后前端4阶段,依次打怪升级
而后node
这个基本上是我走的路,从2010年写iOS、作phonegap(当时是0.9.3)、一路走到如今的总结吧
多是一场春梦,也可能一个变革机遇,咱们更相信它是变革机遇,拭目以待吧
谢谢你们
有的,将来swift和lua是有可能的。swift的语法和性能上有很大优点,lua在openresty的推进下也有机会,不过没有swift大
像WebAssembly之类的就不太看好了
若是是的话谁负责编写?大家目前已是一我的分模块从前端写到后端了吗?
目前没作到文档即静态api,因此目前是直接提供json和部分json-server
负责是后端开发的leader在写,他的进度会比正常开发要早一周左右
目前不是一我的写全部的先后端,团队成立不久,天津Node.js会的很少,因此仍是先后端分离。可是经过moa-frontend可让前端了解express等后端知识,适当的时候会给予机会,前端转后端
nodejs里json-server 比较好
我其实很想围绕静态api,写各类请求的生成器,只要api出来,文档和各平台的http请求代码就生成出来,同时能够对正式api进行压测,惋惜目前还没精力写
足够轻量级,少选大框架,作好前端该有的优化
注意touch和click的区别,好比fastclick或zeptojs的tap手势
Chrome profile(css3动画)
使用weinre真机测试
咱们团队仍是倾向于分工专业化,各个服务粒度很是小,便于轮岗、还有就是能够为之后像google那样代码开放作准备
可是有不少状况下,是须要有机动的突击队的(尤为是创业时期),这样能够随便组合,另外就是全栈为remote提供了更多便利性。
能够尝试一下淘宝系的h5虚拟化,鬼道曾经在as大会上讲过的,咱们目前还没能力作这么深层次的优化
1)你问的不是Node.js,而是Node.js要操做的数据库。 2)耗性能的计算能够在架构上平衡的 - 若是能够延时,mq就能够了 - 若是是非延时状况,能够采用其余语言编写对应服务,不必非要必定要Node.js 3)咱们目前的场景,尚未在计算遇到瓶颈
语义上更加清晰
整个返回的json就只有data和status,若是status.code!=0,我取msg就行了,若是等于0,处理data数据
这种设计不见得多好,不过结构清晰,对于开发者来讲,是比较容易接受的