Node.js与Golang使用感觉与小结 javascript
目录 php
1、互联网的基石TCP/IP协议 css
2、HTTP服务器编写与编程语言无关 html
3、构建HTTP服务器须要掌握的知识点 前端
4、HTTP协议基础 java
5、Node.js简介 node
6、是前端选择,仍是后端的福音? nginx
7、Node.js与传统php-fpm模式之间的对比 web
8、安装Node.js apache
9、让浏览器读懂你的心--Content-Type
10、向浏览器发送文件
11、Node.js异步流程控制(序列模式、并发模式、有限并发模式)
12、静态资源文件的简单优化
十3、如今还需少些什么?
十4、Golang 简介
十5、为何要用Golang ?
十6、安装Golang开发环境
十7、如何使用Golang 编写一个HTTP服务器?
十8、Golang 的http包与Node.js的http模块对比
5、Node.js简介
Node.js是一个基于谷歌V8引擎的平台,经过利用V8引擎并遵照COMMONJS标准实现了一个高效稳定的平台。Node.js作web编程是基于数据流的方式,能够直接操控http流,正因为这样的特性,咱们能够方便的去定制发送给客户端的数据,同时因为使用了Javascript而且因为它的异步性,更适合于现代应用程序的开发。目前全世界已经有多家公司在使用,著名的用户如linkin,TaoBao,Myspace等。
6、是前端选择,仍是后端的福音?
Node.js发布以后,在国内外都引发了不小的讨论风暴。甚至国内有很大一批前端工程师认为这个为前端工程师准备的平台,也有一些后端工程师不习惯于Node.js的编程风格。
Javascript是一门饱受争议的语言,它从设计到投入使用只花了很短的一段时间。它借鉴了不少语言的特性,固然也存在了不少语言有的缺点。因为历史的缘由,Javascript早期是没有包的根据,类的话也只是去经过prototype去模拟实现。不过Javascript 倒是世界上最为自由的语言之一,你能够天马行空的利用语法糖去模拟你熟悉的语言。通常状况下不建议去模拟其它语言,当你使用什么语言的时候,最好去思想在这门语言中去解决一样的问题会怎么作,而不是用另外一种语言的思惟去作 Javascript早期彷佛成为了前端开发者的必备工具,可随着时代的发展你们发现原来JS也是能够写服务器端程序的。
事实上,它只是一个高效http服务器的解决方案之一。并不是特别的为前端仍是后端工程师准备,若是你想,你就能够用。可是是否能用好,就在于你本身。纵观软件发展,咱们已经很难以分清什么是前端或后端工程师,以操做系统而言,咱们如今都是在应用层上面做开发(有些书中称为用户态模式),那么相对于那些内核工程师,咱们是前端仍是后端昵?
7、Node.js与传统php-fpm模式之间的对比
传统PHP的运行模式(非libevent之类的运行方式):
大部份PHP运行的环境,基本上都会有一个中间件角色的服务器,它负责与PHP的端口进行通讯(默认是9000端口),如Apache、Nginx均可以做为这样的中间件。当一个http请求从客户端发起后,服务器通常作如下几件事情:
一、根据用户发送的请求报文,判断是哪一种HTTP方法,是POST 仍是GET,而后在根据服务器软件的实现进行下一步处理。
二、判断用户请求的资源是不是静态仍是动态脚本,这一步特别是一些nginx之类的中间件会去处理。若是请求的是静态文件,在权限都符合而且资源存在的状况下会直接发送给浏览器,固然有些已经请求过的文件可能会直接返回一个304状态码,这样浏览器就会利用缓存里面的内容给用户。若是是动态文件,那么中间件就会去判断应该怎么去处理。这也是为何大多数相似于nginx之类的服务器,须要对php之类的脚本在配置文件中进行配置的缘由。
三、若是是php,那么中间件会把请求先转发给php解释器,而后由php解释器运算完成以后,在把结果返回给中间件,中间件在把结果返回给浏览器。中间件在这里做了代理的功能,事实上它作的工做由php经过libevent之类的模块也能够作,可是实现成本太高,因此大部份企业仍是选择nginx或apache去实现这些基础功能,而把精力用于业务的开发上。
Node.js的运行模式---基于数据流的现代编程
对于现代程序开发来讲,最为直接的方式即是对于数据流进行直接控制。这样你能够决定哪些东西返回给用户,哪些东西是你须要隐藏的。一个Node.js的应用接到一个http请求以后会作如下事情:
一、路由器分发处理规则:由于应用自己就是服务器,因此不用转发,不用代理,直接经过自定义的规则去处理请求。
二、具体业务能够按队列形式处理,也能够按异步形式处理。简单来讲,传统的web开发之中,咱们须要作一件事情的时候,通常会等待上一个事情作完,而后才会去处理新的事情。可是在node.js中,你能够同时处理多件事情。并且当它们完成后,会将各自的结果返回给用户。
(图为之前所作PPT中所截取)
平台风格 |
Node.js |
PHP |
安装方式 |
可源码或直接安装二进制安装包 |
经过源码编译安装或使用第三方绿色包等 |
编程风格 |
异步风格且基于数据操做 |
同步风格 |
处理用户请求方式 |
应用自己便是HTTP服务器 |
须要借助如Nginx之类的服务器 |
扩展安装方式 |
npm |
Phpize或在初始安装时配置 |
实时运行模式 |
每次更改须要重启应用,可是也能够参考Java中Play框架去热加载,可是会影响性能。由于热加载的通常缘由是实时对文件改动进行监控。 |
修改文件后直接保存,即时生效,但程序会每次去读取新的php文件,有必定的I/O损耗。 |
语言规则 |
类C风格 |
类C风格 |
性能对比 |
----请自行使用http_load之类工具对比 |
----请自行使用http_load之类工具对比 |
8、安装Node.js
先登陆 http://nodejs.org/download/ 而后下载适合你的平台版本,建议初学者下载二进制安装包,但熟悉以后仍是用源码方式编译安装好。编译安装的好处在于,编译器会根据用户所工做的平台环境进行优化。
假设咱们此时下载了二进制包,那么
一路Next下去就能够了。
要检测是否安装成功,在你的控制台中输入 node -v (windows用户能够在开始菜单中的运行中输入cmd进行,因为文章在windows平台写的,以windows版本为例)
9、让浏览器读懂你的心--Content-Type
写Node.js程序,你只须要一个编辑器,一个运行环境就好~
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': "text/plain; charset=utf-8"});
res.write('世界你好~!\n');
res.end();
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
将里面的代码内容保存为hello.js,而后经过控制台运行 node <你保存的目录>/hello.js 。作完这一切以后,打开你的浏览器输入http://127.0.0.1:3000 按下回车看看效果吧。
经过这个DEMO,你应该能看到一个简单的http服务器的成功产生了吧。固然要作一个功能齐全的服务器还有不少东西须要作,这里只是一个简单的DEMO.在这个DEMO中,你们应该会发现Content-Type这个东东,前面讲进Content-Type这个东东是告诉浏览器要作些什么事情。好比有的时候你发给用户的是否是文本文件而是视频或是图片,那么就须要告诉浏览器调用系统的某些程序来运行或是显示它。
10、向浏览器发送文件
仍是先上代码吧,一切以代码为先。
var server,
ip = "127.0.0.1", port = 3000,http = require('http'), fs = require("fs"), folderPath = "static",//存放文件夹
url = require('url'),
path=require('path'),
urlpath,//请求路径
filePath;//文件路径
var types = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"png": "image/png",
"tiff": "image/tiff",
"txt": "text/plain"
};
server = http.createServer(function (req, res) {
urlpath = url.parse(req.url);
filePath = folderPath + urlpath.pathname;
var content_type= types[path.extname(urlpath.pathname).substr(1)]||'text/plain';
fs.readFile(filePath, function(err, file) {
if (err) {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end();
return;
}
res.writeHead(200, {'Content-Type': content_type});
res.write(file);
res.end();
});
});
server.listen(port, ip);
console.log("Server running at http://" + ip + ":" + port);
发送文件固然存在读取的文件的这一过程,因此须要用到fs包。这个DEMO应该比较简单,只要你有前面的基础,相信很快能明白这个DEMO的意图。这一部份不打算具体说明,由于已经有不少前期的说明,并且网络上也有不少文章,咱们着重须要讲的是Node.js异步流程控制,这一部份中文资料较少,而如今业内据我所知大可能是用AsyncJS或step之类的node库来实现,并非说他们的实现很差,而是中间的原理须要搞懂才能掌握某些被认为的关键技术。
将来完,,,待续
==========================================================
关于做者:
网名:念念之间 现居:深圳
Email:jinfei121@qq.com
QQ:490821193
从03年开始玩论坛,但正式写代码是前几年的事情。刚工做前两主要写php程序,目前主要专职写
Javascript.平时喜欢研究各类新鲜技术~~
Node与Golang的粉丝~~
==========================================================