ʹÓÃͨ¹ý»Øµ÷µÄÒì²½ I/O ¿ª·¢²¢·¢Ä£ÐÍ£¬²¢¹¹½¨ÁÄÌì·þÎñÆ÷
±¾ÎÄ̽ÌÖ Node.js£¬ÕâÊÇÒ»¸öÓÃÓÚ UNIX? ÀàÆ½Ì¨ÉÏ V8 JavaScript?
ÒýÇæµÄʼþÇý¶¯µÄ I/O ¿ò¼Ü£¬Éè¼ÆÕâÒ»¿ò¼ÜµÄÄ¿µÄÊÇΪÁ˱àд¿ÉÉìËõµÄÍøÂç³ÌÐò£¬Èç Web ·þÎñÆ÷¡£±¾ÎÄͨ¹ýÒ»¸öÍêÕûµÄÀý×Ó˵Ã÷ÈçºÎÔÚ
Node.js Öй¹½¨ÁÄÌì·þÎñÆ÷£¬·ÖÎöÁËÕâ¸ö¿ò¼ÜÒÔ¼°Î§ÈÆËüµÄÉú̬ϵͳ£¨°üÀ¨ÔƼÆËã²úÆ·£©£¬²¢¶ÔÕâ¸ö¿ò¼Ü½øÐÐÁË×ܽᡣ
Ëæ×ż¼Êõ´´Ð±íÃæÉϼÌÐøÒÔÖ¸Êý¼¶ËÙ¶È·¢Õ¹£¬ÐÂ˼Ïë²ã³ö²»Çî¡£·þÎñÆ÷¶ËµÄ JavaScript
¾ÍÊÇÕâЩÐÂ˼ÏëÖ®Ò»¡£ Node.js ÊÇÒ»ÖÖʼþÇý¶¯µÄ I/O ¿ò¼Ü£¬ÓÃÓÚ UNIX ÀàÆ½Ì¨É쵀 V8
JavaScript ÒýÇæ£¬ÊʺÏÓÚ±àд¿ÉÉìËõµÄÍøÂç³ÌÐò£¬Èç Web ·þÎñÆ÷¡£ Node.js ÕýÊÇÕâÖÖÐÂ˼ÏëµÄʵÏÖ¡£
Node.js ²¢·ÇÓë JavaScript ¿¹ºâ£¬¶øÊÇʹÓÃËü×÷ΪÍêÕûµÄ¿ª·¢¶ÑÕ»£¬´Ó·þÎñÆ÷¶Ë´úÂëÒ»Ö±ÑÓÉìµ½ä¯ÀÀÆ÷¡£Node.js
»¹³ä·ÖÀûÓÃÁËÁíÒ»ÖÖ ´´ÐÂ˼Ï룺ͨ¹ý»Øµ÷ÀûÓÃÒì²½ I/O µÄ²¢·¢ÐÔÄ£ÐÍ¡£
Node.js ÔÆ¼ÆËãÆ½Ì¨
ÔÚÔÆ¼ÆËã»·¾³ÖÐʹÓà Node.js ¿ò¼Üʱ£¬ÄÜÏÔʾ³öËüµÄÒ»¸ö¾Þ´óÓŵ㡣¶ÔÓÚÓ¦ÓóÌÐò¿ª·¢ÈËÔ±£¬ÕâÍùÍù¹é½áʹÓÃÆ½Ì¨¼´·þÎñ
(PaaS) »ò»ù´¡¼Ü¹¹¼´·þÎñ (IaaS) Ä£ÐÍ¡£¶ÔÓÚ¿ª·¢ÈËÔ±¶øÑÔ£¬×î³éÏóºÍ¹«ÈÏ×î·½±ãµÄ·½·¨ÊÇʹÓà PaaS
Ìṩ³ÌÐò¡£Í¼ 1 Ê®·Ö¼òµ¥µØËµÃ÷ÁË PaaS ºÍ IaaS Ä£Ð͵Ľṹ¡£

ͼ 1. PaaS Óë IaaS ½á¹¹
×î½ü£¬Ò»¸ö¼¤¶¯ÈËÐĵĿªÔ´ÏîÄ¿ Cloud Foundry ¹«²¼ÁË´úÂëÒÔ´´½¨Ò»¸öÄܹ»ÔËÐÐ
Node.js µÄ˽ÓÐ PaaS¡£ ͬÑùµÄÖ÷»úÒýÇæÒ²¿ÉÓÃÔÚ¹«¹²ÔƺÍÉÌÒµÔÆÖУ¬¶øÇÒËüÃǽÓÊÜÈí¼þ²¹¶¡¡£
»ù´¡¼Ü¹¹¹ÜÀíÊÇÒ»´óÍ´µã£¬Èç¹ûÄܹ»½«ÕâÏ×÷Íâ°ü£¨ÓÀÔ¶£¡£©¸ø¹æÄ£¾ÓªµÄÌṩÉÌ£¬ÇÒÎÞÂÛÊÇÔ´´úÂ룬»¹ÊÇÎïÀíÓ²¼þ×ÊÔ´£¬¶ÔÓÚ¿ª·¢ÈËԱȷʵÊÇÒ»¸ö¼¤¶¯ÈËÐĵÄʱ¿Ì¡£
ʹÓà Node.js shell
ÔÚÎÒÃÇ×ÅÊÖ±àдһ¸öÍêÕûµÄ Node.js Àý×Ó֮ǰ£¬ÈÃÎÒÃÇÏÈ¿ªÊ¼½éÉÜÈçºÎʹÓý»»¥Ê½
shell¡£Èç¹ûÉÐδ°²×° Node.js£¬Äú¿ÉÒԲο¼×ÊÔ´²¿·Ö£¬È»ºó°´ÕÕ˵Ã÷°²×°Ëü£¬»òÕßʹÓÃÔÚÏߵĽ»»¥Ê½
Node.js Õ¾µãÖ®Ò»£¬ËüÔÊÐíÄúÖ±½ÓÔÚä¯ÀÀÆ÷ÖÐÊäÈë´úÂë¡£
ÒªÔÚ Node.js ÖÐÒÔ½»»¥·½Ê½±àд JavaScript º¯Êý£¬ÔÚÃüÁîÐÐÌáʾÖÐÊäÈënode£¬ÈçÏÂËùʾ£º
lion% node > var foo = {bar: 'baz'}; > console.log(foo); { bar: 'baz' } > |
ÔÚÕâ¸öÀý×ÓÖУ¬´´½¨Á˶ÔÏófoo£¬È»ºóµ÷ÓÃconsole.log ½«ËüÊä³öµ½¿ØÖÆÌ¨¡£ ÕâÊ®·ÖÓÐЧ¶øÇÒÓÐȤ£¬²»¹ýµ±ÄúʹÓÃ
tab Íê³É¹¦ÄÜÀ´Ì½ÌÖ foo ʱ£¬ÈçÏÂÃæµÄÀý×ÓËùʾ£¬ÕæÕýµÄÀÖȤ²Å¸Õ¸Õ¿ªÊ¼¡£ Èç¹ûÊäÈë foo.bar.£¬È»ºó°´ÏÂ
tab ¼ü£¬Äú½«¿´µ½¶ÔÏóÉϵĿÉÓ÷½·¨¡£
> foo.bar. [...output suppressed for space...] foo.bar.toUpperCase foo.bar.trim foo.bar.trimLeft foo.bar.trimRight |
ÊÔÓà toUpperCase ·½·¨ËƺõºÜÓÐȤ£¬ÏÂÃæÏÔʾÁËËüµÄÓ÷¨£º
> foo.bar.toUpperCase(); 'BAZ' |
Äú¿ÉÒÔ¿´µ½£¬¸Ã·½·¨½«×Ö·û´®×ª»»Îª´óд×Öĸ¡£ÕâÀཻ»¥Ê½¿ª·¢·Ç³£ÊʺÏÓÚʹÓÃÏñ
Node.js ÕâÑùµÄʼþÇý¶¯ÐÍ¿ò¼Ü½øÐпª·¢¡£
ÔÚÍê³É¼òµ¥½éÉÜÖ®ºó£¬ÎÒÃÇ¿ªÊ¼ÕæÕýµØ¹¹½¨Ò»Ð©¶«Î÷¡£
Óà Node.js ¹¹½¨ÁÄÌì·þÎñÆ÷
Node.js Èñàд»ùÓÚʼþµÄÍøÂç·þÎñÆ÷±äµÃÊ®·Ö¼òµ¥¡£ÀýÈ磬ÈÃÎÒÃÇ´´½¨Ò»Ð©ÁÄÌì·þÎñÆ÷¡£
µÚÒ»¸ö·þÎñÆ÷Ê®·Ö¼òµ¥£¬¼¸ºõûÓÐʲô¹¦ÄÜ£¬Ò²Ã»ÓÐÈκÎÒì³£´¦Àí¡£
Ò»¸öÁÄÌì·þÎñÆ÷ÔÊÐí¶à¸ö¿Í»§¶ËÁ¬½Óµ½Ëü¡£Ã¿¸ö¿Í»§¶Ë¶¼¿ÉÒÔ±àдÏûÏ¢£¬È»ºó¹ã²¥¸øËùÓÐÆäËûÓû§¡£ÏÂÃæ¸ø³öÁË×î¼òµ¥µÄÁÄÌì·þÎñÆ÷µÄ´úÂë¡£
net = require('net');
var sockets = [];
var s = net.Server(function(socket) {
sockets.push(socket);
socket.on('data', function(d) {
for (var i=0; i < sockets.length; i++ ) {
sockets[i].write(d);
}
});
});
s.listen(8001); |
ÔÚ²»µ½ 20 ÐдúÂëÖУ¨Êµ¼ÊÉÏ£¬ÕæÕýʵÏÖ¹¦ÄܵĴúÂëÖ»ÓÐ 8 ÐУ©£¬ÄúÒѾ¹¹½¨ÁËÒ»¸öÄܹ»Ê¹ÓõÄÁÄÌì·þÎñÆ÷¡£
ÏÂÃæÊÇÕâ¸ö¼òµ¥³ÌÐòµÄÁ÷³Ì£º
1.µ±Ò»¸öÌ×½Ó×Ö½øÐÐÁ¬½Óʱ£¬½«¸ÃÌ×½Ó×Ö¶ÔÏ󸽼ӵ½Ò»¸öÊý×é¡£
2.µ±¿Í»§¶ËдÈëËüÃǵÄÁ¬½Óʱ£¬½«¸ÃÊý¾Ýдµ½ËùÓеÄÌ×½Ó×Ö¡£
ÏÖÔÚ£¬ÈÃÎÒÃǼì²éËùÓдúÂ룬²¢½âÊÍÕâ¸öÀý×ÓÈçºÎʵÏÖÁÄÌì·þÎñÆ÷Ô¤¶¨¹¦ÄÜ¡£µÚÒ»ÐÐÔÊÐí·ÃÎÊ
net Ä£¿éµÄÄÚÈÝ£º
ÈÃÎÒÃÇʹÓÃÕâ¸öÄ£¿éÖÐµÄ Server¡£
Äú½«ÐèÒªÒ»¸öλÖÃÀ´±£´æËùÓпͻ§¶ËÁ¬½Ó£¬ÒÔ±ãÔÚдÈëÊý¾Ýʱ¿ÉÒÔдµ½ËüÃÇÖÐÈ¥¡£
ÏÂÃæÊÇÓÃÓÚ±£´æËùÓпͻ§¶ËÌ×½Ó×ÖÁ¬½ÓµÄ±äÁ¿£º
ÏÂÒ»ÐпªÊ¼Ò»¸ö´úÂë¿é£¬¹æ¶¨µ±Ã¿¸ö¿Í»§¶ËÁ¬½ÓʱҪ×öµÄÊÂÇé¡£
var s = net.Server(function(socket) { |
´«µÝµ½ Server ÖеÄΩһ²ÎÊýÊǽ«Õë¶Ôÿ¸ö¿Í»§¶ËÁ¬½Ó½øÐе÷ÓõÄÒ»¸öº¯Êý¡£ ÔÚÕâ¸öº¯ÊýÖУ¬½«¿Í»§¶ËÁ¬½ÓÌí¼Óµ½ËùÓпͻ§¶ËÁ¬½ÓµÄÁбíÖУº
ÏÂÒ»²¿·Ö´úÂ뽨Á¢ÁËÒ»¸öʼþ´¦ÀíÆ÷£¬¹æ¶¨Á˵±Ò»¸ö¿Í»§¶Ë·¢ËÍÊý¾ÝʱҪ×öµÄÊÂÇ飺
socket.on('data', function(d) {
for (var i=0; i < sockets.length; i++ ) {
sockets[i].write(d);
}
});
|
socket.on() ·½·¨µ÷ÓÃΪ½Úµã×¢²áÒ»¸öʼþ´¦ÀíÆ÷£¬ÒԱ㵱ijЩʼþ·¢ÉúʱËüÖªµÀÈçºÎ´¦Àí¡£
µ±½ÓÊÕµ½À´×Ô¿Í»§¶ËµÄÊý¾Ýʱ£¬Node.js »áµ÷ÓÃÕâ¸öÌØÊâµÄʼþ´¦ÀíÆ÷¡£ÆäËûµÄʼþ´¦ÀíÆ÷°üÀ¨ connect¡¢end¡¢timeout¡¢drain¡¢error
ºÍ close¡£socket.on() ·½·¨µ÷ÓõĽṹÀàËÆÓÚÇ°ÃæÌá¹ýµÄ Server() µ÷ÓᣠÄú´«ÈëÒ»¸öº¯Êý¸øÕâÁ½Õߣ¬µ±ÓÐÊ·¢Éúʱµ÷Óô˺¯Êý¡£ÕâÖֻص÷·½·¨ÔÚÒì²½Íø
Âç¿ò¼ÜÖкܳ£¼û¡£ ÕâÊǵ±¿ªÊ¼Ê¹ÓÃÏñ Node.js ÕâÑùµÄÒì²½¿ò¼Üʱ£¬ÓµÓйý³Ì±à³Ì¾ÑéµÄÈË»áÓöµ½µÄÖ÷ÒªÎÊÌâ¡£
ÔÚÕâÖÖÇé¿öÏ£¬µ±ÈÎÒâ¿Í»§¶Ë·¢ËÍÊý¾Ý¸ø·þÎñÆ÷ʱ£¬¾Í»áµ÷ÓÃÕâ¸öÄäÃûº¯Êý²¢½«Êý¾Ý´«È뺯ÊýÖС£Ëü»ùÓÚÄúÒѾ»ýÀÛµÄÌ×½Ó×Ö¶ÔÏóÁÐ±í½øÐеü´ú£¬
²¢¸øËüÃÇÈ«²¿·¢ËÍÏàͬµÄÊý¾Ý¡£Ã¿¸ö¿Í»§¶ËÁ¬½Ó¶¼½«½ÓÊÕµ½ÕâЩÊý¾Ý¡£
Õâ¸öÁÄÌì·þÎñÆ÷Ê®·Ö¼òµ¥£¬ËüȱÉÙһЩ·Ç³£»ù´¡µÄ¹¦ÄÜ£¬±ÈÈçʶ±ðÊÇË·¢ËÍÄÄÌõÏûÏ¢£¬»òÕß´¦Àíij¸ö¿Í»§¶Ë¶Ï¿ªµÄÇé¿ö¡£
£¨Èç¹ûÒ»¸ö¿Í»§¶Ë´ÓÕą̂ÁÄÌì·þÎñÆ÷¶Ï¿ª£¬ÈκÎÈË·¢ËÍÏûÏ¢£¬·þÎñÆ÷¶¼»á±ÀÀ£¡££©
ÏÂÃæµÄÔ´´úÂ루ÔÚÏÂÔØÊ¾ÀýÎļþÖнÐ×ö chat2.js £©ÊÇÒ»¸ö¾¹ý¸Ä½øµÄÌ×½Ó×Ö·þÎñÆ÷£¬Æä¹¦ÄÜÓÐËùÔöÇ¿£¬Äܹ»´¦Àí¡°Ôã¸âµÄÇé¿ö¡±£¨±ÈÈç¿Í»§¶Ë¶Ï¿ª£©¡£
net = require('net');
var sockets = [];
var name_map = new Array();
var chuck_quotes = [
"There used to be a street named after Chuck Norris, but it was changed because
nobody crosses Chuck Norris and lives.",
"Chuck Norris died 20 years ago, Death just hasn't built up the courage to tell
him yet.",
"Chuck Norris has already been to Mars; that's why there are no signs of life.",
"Some magicians can walk on water, Chuck Norris can swim through land.",
"Chuck Norris and Superman once fought each other on a bet. The loser had to start
wearing his underwear on the outside of his pants."
]
function get_username(socket) {
var name = socket.remoteAddress;
for (var k in name_map) {
if (name_map[k] == socket) {
name = k;
}
}
return name;
}
function delete_user(socket) {
var old_name = get_username(socket);
if (old_name != null) {
delete(name_map[old_name]);
}
}
function send_to_all(message, from_socket, ignore_header) {
username = get_username(from_socket);
for (var i=0; i < sockets.length; i++ ) {
if (from_socket != sockets[i]) {
if (ignore_header) {
send_to_socket(sockets[i], message);
}
else {
send_to_socket(sockets[i], username + ': ' + message);
}
}
}
}
function send_to_socket(socket, message) {
socket.write(message + '\n');
}
function execute_command(socket, command, args) {
if (command == 'identify') {
delete_user(socket);
name = args.split(' ', 1)[0];
name_map[name] = socket;
}
if (command == 'me') {
name = get_username(socket);
send_to_all('**' + name + '** ' + args, socket, true);
}
if (command == 'chuck') {
var i = Math.floor(Math.random() * chuck_quotes.length);
send_to_all(chuck_quotes[i], socket, true);
}
if (command == 'who') {
send_to_socket(socket, 'Identified users:');
for (var name in name_map) {
send_to_socket(socket, '- ' + name);
}
}
}
function send_private_message(socket, recipient_name, message) {
to_socket = name_map[recipient_name];
if (! to_socket) {
send_to_socket(socket, recipient_name + ' is not a valid user');
return;
}
send_to_socket(to_socket, '[ DM ' + get_username(socket) + ' ]: ' + message);
}
var s = net.Server(function(socket) {
sockets.push(socket);
socket.on('data', function(d) {
data = d.toString('utf8').trim();
// check if it is a command
var cmd_re = /^\/([a-z]+)[ ]*(.*)/g;
var dm_re = /^@([a-z]+)[ ]+(.*)/g;
cmd_match = cmd_re.exec(data)
dm_match = dm_re.exec(data)
if (cmd_match) {
var command = cmd_match[1];
var args = cmd_match[2];
execute_command(socket, command, args);
}
// check if it is a direct message
else if (dm_match) {
var recipient = dm_match[1];
var message = dm_match[2];
send_private_message(socket, recipient, message);
}
// if none of the above, send to all
else {
send_to_all(data, socket);
};
});
socket.on('close', function() {
sockets.splice(sockets.indexOf(socket), 1);
delete_user(socket);
});
});
s.listen(8001); |
ÉÔ΢¸ß¼¶Ò»µãµÄÖ÷Ì⣺ÁÄÌì·þÎñÆ÷µÄ¸ºÔØÆ½ºâ
ͨ³££¬¸ºÔذ´±ÈÀýÔö³¤Ò²ÊDz¿Êðµ½ÔÆ»·¾³µÄÀíÓÉÖ®Ò»¡£ÕâÖÖ²¿ÊðÐèҪʵÏÖһЩ¸ºÔØÆ½ºâ»úÖÆ¡£
´ó¶àÊýÇáÁ¿¼¶ Web ·þÎñÆ÷£¬±ÈÈç nginx ºÍ lighttpd£¬¶¼Äܹ»Õë¶Ô¶ą̀
HTTP ·þÎñÆ÷½øÐиºÔØÆ½ºâ£¬µ«Èç¹ûÄúÏëÒªÔÚ·Ç HTTP ·þÎñÆ÷Ö®¼äʵÏÖÆ½ºâ£¬nginx ¿ÉÄÜÎÞ·¨Âú×ãÒªÇó¡£¶øÇÒ¾¡¹Ü´æÔÚͨÓõÄ
TCP ¸ºÔØÆ½ºâÆ÷£¬Äú¿ÉÄܲ»»áϲ»¶ËüÃÇʹÓõĸºÔØÆ½ºâËã·¨¡£»òÕßËüÃÇûÓÐÌṩÄúÏëҪʹÓõÄһЩ¹¦ÄÜ¡£»òÕߣ¬ÄúÖ»ÊÇÏëÏíÊܹ¹Ôì×Ô¼ºµÄ¸ºÔØÆ½ºâÆ÷µÄÀÖȤ¡£
ÏÂÃæÊÇ×î¼òµ¥µÄ¸ºÔØÆ½ºâÆ÷¡£ËüûÓÐʵÏÖÈκιÊÕϻָ´£¬Ï£ÍûËùÓеÄÄ¿µÄµØ¶¼ÊÇ¿ÉÓõ쬶øÇÒûÓнøÐÐÈκδíÎó´¦Àí¡£ËüÊ®·Ö¼òÔ¼¡£
»ù±¾µÄÀíÄîÊÇ£¬Ëü½ÓÊÕÒ»¸öÀ´×Ô¿Í»§¶ËµÄÌ×½Ó×ÖÁ¬½Ó£¬Ëæ»úÌôѡһ¸öÄ¿±ê·þÎñÆ÷½øÐÐÁ¬½Ó£¬È»ºó½«À´×Ô¿Í»§¶ËµÄËùÓÐÊý¾Ýת·¢¸ø¸Ã·þÎñÆ÷£¬²¢½«À´×Ը÷þÎñÆ÷µÄËùÓÐÊý¾Ý¶¼·¢»Øµ½¿Í»§¶Ë¡£
net = require('net');
var destinations = [
['localhost', 8001],
['localhost', 8002],
['localhost', 8003],
]
var s = net.Server(function(client_socket) {
var i = Math.floor(Math.random() * destinations.length);
console.log("connecting to " + destinations[i].toString() + "\n");
var dest_socket = net.Socket();
dest_socket.connect(destinations[i][1], destinations[i][0]);
dest_socket.on('data', function(d) {
client_socket.write(d);
});
client_socket.on('data', function(d) {
dest_socket.write(d);
});
});
s.listen(9001); |
destinations µÄ¶¨ÒåÊÇÎÒÃÇÒª½øÐÐÆ½ºâµÄºó¶Ë·þÎñÆ÷µÄÅäÖᣠÕâÊÇÒ»¸ö¼òµ¥µÄ¶àάÊý×飬Ö÷»úÃûÊǵÚÒ»¸öÔªËØ£¬¶Ë¿ÚºÅÊǵڶþ¸öÔªËØ¡£
Server() µÄ¶¨ÒåÀàËÆÓÚÁÄÌì·þÎñÆ÷µÄÀý×Ó¡£Äú´´½¨Ò»¸öÌ×½Ó×Ö·þÎñÆ÷£¬²¢ÈÃËü¼àÌýÒ»¸ö¶Ë¿Ú¡£Õâ´ÎËü½«¼àÌý
9001 ¶Ë¿Ú¡£
Õë¶Ô Server() ¶¨ÒåµÄ»Øµ÷Ê×ÏÈËæ»úÑ¡ÔñÒ»¸öÒªÁ¬½Óµ½µÄÄ¿µÄµØ£º
var i = Math.floor(Math.random() * destinations.length); |
Äú¿ÉÄÜÒѾʹÓùýÂÖѯËã·¨»òʹÓá°×îÉÙÁ¬½ÓÊý¡±Ëã·¨Íê³ÉһЩ¶îÍâµÄ¹¤×÷È»ºóÀëÈ¥£¬µ«ÎÒÃÇÏ뾡¿ÉÄܵر£³Ö¼òµ¥¡£
Õâ¸öÀý×ÓÖÐÓÐÁ½¸öÖ¸¶¨µÄÌ×½Ó×Ö¶ÔÏó£º client_socket ºÍ dest_socket¡£
client_socket ÊǸºÔØÆ½ºâÆ÷Óë¿Í»§¶ËÖ®¼äµÄÁ¬½Ó¡£
dest_socket ÊǸºÔØÆ½ºâÆ÷Ó뱻ƽºâ·þÎñÆ÷Ö®¼äµÄÁ¬½Ó¡£
ÕâÁ½¸öÌ×½Ó×Ö·Ö±ð´¦ÀíÒ»¸öʼþ£º½ÓÊÕµ½µÄÊý¾Ý¡£µ±ËüÃÇÆäÖÐÒ»¸öÊÕµ½Êý¾Ýʱ£¬¾Í»á½«Êý¾Ýдµ½ÁíÒ»¸öÌ×½Ó×Ö¡£
ÈÃÎÒÃÇÍêÕûµØÁ˽⵱һ¸ö¿Í»§¶Ëͨ¹ý¸ºÔØÆ½ºâÆ÷Á¬½Óµ½Í¨ÓÃÍøÂç·þÎñÆ÷ÉÏ£¬·¢ËÍÊý¾Ý£¬È»ºó½ÓÊÕÊý¾Ýʱ·¢ÉúµÄÊÂÇé¡£
µ±Ò»¸ö¿Í»§µÄÁ¬½Óµ½¸ºÔØÆ½ºâÆ÷ʱ£¬Node.js ÔÚ¿Í»§¶ËÓë×Ô¼º±¾ÉíÖ®¼ä´´½¨Ò»¸öÌ×½Ó×Ö£¬ÎÒÃdzÆÖ®Îª
client_socket¡£
µ±Á¬½Ó½¨Á¢Ö®ºó£¬¸ºÔØÆ½ºâÆ÷Ìôѡһ¸öÄ¿µÄµØ²¢´´½¨Ò»¸öÖ¸Ïò¸ÃÄ¿µÄµØµÄÌ×½Ó×ÖÁ¬½Ó£¬ÎÒÃdzÆÖ®Îª
dest_socket¡£
µ±¿Í»§¶Ë·¢ËÍÊý¾Ýʱ£¬¸ºÔØÆ½ºâÆ÷½«ÏàͬµÄÊý¾ÝÍÆË͵½Ä¿µÄµØ·þÎñÆ÷¡£
µ±Ä¿µÄµØ·þÎñÆ÷×ö³öÏìÓ¦²¢½«Ò»Ð©Êý¾Ýдµ½ dest_socket ʱ£¬¸ºÔØÆ½ºâÆ÷ͨ¹ý
client_socket ½«ÕâЩÊý¾ÝÍÆËͻؿͻ§¶Ë¡£
¿ÉÒÔ¶ÔÕâ¸ö¸ºÔØÆ½ºâÆ÷½øÐÐһЩ¸Ä½ø£¬°üÀ¨´íÎó´¦Àí£¬ÔÚͬһ¸ö½ø³ÌÖÐǶÈëÁíÒ»¸ö½ø³ÌÒÔ¶¯Ì¬Ôö¼ÓºÍÒÆ³ýÄ¿µÄµØ£¬Ôö¼Ó²»Í¬µÄƽºâËã·¨£¬ÒÔ¼°Ôö¼ÓһЩÈÝ´í´¦Àí¡£
³¬Ô½ÔÉú½â¾ö·½°¸£ºExpress Web ¿ò¼Ü
Node.js Å䱸ÓÐ HTTP ·þÎñÆ÷¹¦ÄÜ£¬µ«½ÏΪµÍ¼¶¡£Èç¹ûÒªÔÚ Node.js
Öй¹½¨Ò»¸ö Web Ó¦ÓóÌÐò£¬Äú¿ÉÄܻῼÂÇ Express¡ª¡ªÒ»¸öΪ Node.js ´òÔìµÄ Web Ó¦ÓóÌÐò¿ª·¢¿ò¼Ü¡£ËüÃÖ²¹ÁË
Node.js µÄһЩ²»×ã¡£
ÔÚÏÂÒ»¸öÀý×ÓÖУ¬ÈÃÎÒÃÇÖØµã¹Ø×¢Ê¹Óà Express ʤ¹ý¼òµ¥µÄ Node.js
µÄһЩÃ÷ÏÔÓÅÊÆ¡£ ÇëÇó·ÓɾÍÊÇÆäÖÐÖ®Ò»£¬»¹ÓÐÒ»¸öÊÇΪ HTTP "verb" ÀàÐÍ×¢²áÒ»¸öʼþ£¬±ÈÈç¡°get¡±»ò¡°post¡±¡£
ÏÂÃæ¸ø³öÁËÒ»¸öÊ®·Ö¼òµ¥µÄ Web Ó¦ÓóÌÐò£¬ËüÖ»ÊÇÑÝʾÁË Express
µÄһЩ»ù±¾¹¦ÄÜ¡£
var app = require('express').createServer();
app.get('/', function(req, res){
res.send('This is the root.');
});
app.get('/root/:id', function(req, res){
res.send('You sent ' + req.params.id + ' as an id');
});
app.listen(7000); |
ÕâÁ½ÐÐÒÔ app.get() ¿ªÊ¼µÄ´úÂëÊÇʼþ´¦ÀíÆ÷£¬µ± GET ÇëÇó½øÈëʱ¾Í»á´¥·¢¡£
ÕâÁ½´Î·½·¨µ÷ÓõĵÚÒ»¸ö²ÎÊýÊÇÒ»¸öÕýÔò±í´ïʽ£¬ÓÃÓÚÖ¸¶¨Óû§¿ÉÄÜ´«ÈëµÄ URL¡£µÚ¶þ¸ö²ÎÊýÊÇÕæÕý´¦ÀíÇëÇóµÄÒ»¸öº¯Êý¡£
ÕýÔò±í´ïʽ²ÎÊýÊÇ·ÓÉ»úÖÆ¡£Èç¹ûÇëÇóÀàÐÍ£¨GET¡¢POSTµÈ£©Óë×ÊÔ´£¨/,
/root/123£©Æ¥Å䣬¾Í»áµ÷Óô¦ÀíÆ÷º¯Êý¡£ÔÚµÚÒ»´Î app.get() µ÷ÓÃÖУ¬/ ±»¼òµ¥µØÖ¸¶¨Îª×ÊÔ´¡£¶øÔÚµÚ¶þ´Îµ÷ÓÃÖУ¬ÔÚÖ¸¶¨/root
ʱºóÃæ»¹¼ÓÁËÒ»¸ö ID¡£Ó³Éä regex µÄ URL ÖÐ×ÊÔ´Ç°ÃæµÄðºÅ(:) ×Ö·û±íÃ÷£¬Õⲿ·ÖÉÔºó¿É×÷Ϊһ¸ö²ÎÊýʹÓá£
µ±ÇëÇóÀàÐÍÓëÕý¹æ±í´ïʽƥÅäʱ£¬¾Í»áµ÷Óô¦ÀíÆ÷º¯Êý¡£ ´Ëº¯Êý´øÓÐÁ½¸ö²ÎÊý£¬Ò»¸öÇëÇó£¨req£©
ºÍÒ»¸öÏìÓ¦£¨res£©¡£ Ç°ÃæÌáµ½µÄ²ÎÊý±»¸½¼Ó¸øÇëÇó¶ÔÏó¡£¶ø Web ·þÎñÆ÷´«»Ø¸øÓû§µÄÏûÏ¢±»´«Èëµ½ÏìÓ¦¶ÔÏó¡£
ÕâÊÇÒ»¸ö·Ç³£¼òµ¥µÄÀý×Ó£¬µ«ÒѾÇå³þµØËµÃ÷¡°ÕæÕýµÄÓ¦ÓóÌÐò¡±ÈçºÎÀûÓÃÕâ¸ö¿ò¼ÜÀ´¹¹½¨¸ü¼Ó·á¸»ºÍÍêÕûµÄ¹¦ÄÜ¡£Èç¹û²åÈëÒ»¸öÄ£°åϵͳºÍһЩÊý¾ÝÒýÇæ£¨´«Í³µÄ»ò
NoSQL ¾ù¿É£©£¬Äú¿ÉÒÔÇáËɹ¹½¨³öÒ»×鹦ÄÜÀ´Âú×ãÕæÕýÓ¦ÓóÌÐòµÄÐèÇó¡£
Express µÄÌØµãÖ®Ò»ÊǸßÐÔÄÜ¡£ÕâÓëÆäËû¿ìËÙ Web Ó¦ÓóÌÐò¿ò¼ÜµÄ³£¼ûÌØÐÔÒ»Æð£¬ÈÃ
Express ÔÚ×¢ÖØ¸ßÐÔÄܺͺ£Á¿¿ÉÉìËõÐÔµÄÔÆ²¿ÊðÁìÓòÖÐÕ¼¾ÝÁËÖØÒªµÄλÖá£
Ó¦Á˽âµÄ֪ʶ
ÓÐÁ½¸ö¸ÅÄî/Ç÷ÊÆÐèÒªÁ˽⣺
1.¼ü/ÖµÊý¾Ý¿âµÄͻȻÁ÷ÐС£
2.ÆäËûÒì²½µÄ Web ·¶ÐÍ¡£
¼ü/ÖµÊý¾Ý¿â... ΪʲôͻȻÁ÷ÐУ¿
ÒòΪ JavaScript ÊÇ Web µÄͨÓÃÓïÑÔ£¬¶ÔÓÚ JavaScript
Object Notation (JSON) µÄÌÖÂÛͨ³£Ô¶Ô¶ÂäºóÓÚ JavaScript Ïà¹ØµÄÑо¿¡£
JSON ÊÇÔÚ JavaScript ÓëһЩÆäËûÓïÑÔÖ®¼ä½»»»Êý¾ÝµÄ×î³£ÓÃ;¾¶¡£JSON
±¾ÖÊÉÏÊÇÒ»ÖÖ¼ü/Öµ´æ´¢£¬Òò´ËÌìÉúÊÊÓÃÓÚ¶Ô¼ü/ÖµÊý¾Ý¿â¸ÐÐËȤµÄ JavaScript ºÍ Node.js
¿ª·¢ÈËÔ±¡£±Ï¾¹£¬Èç¹ûÄܹ»ÒÔ JSON ¸ñʽ´æ´¢Êý¾Ý£¬JavaScript ¿ª·¢ÈËÔ±µÄ¹¤×÷¾Í½«±äµÃÇáËɺܶࡣ
ÓÐÒ»¸ö²»Ì«Ïà¹ØµÄÇ÷ÊÆ£¬ÔÚ NoSQL Êý¾Ý¿â»·¾³ÖÐÒ²»áÉæ¼°¼ü/ÖµÊý¾Ý¿â¡£CAP
¶¨Àí£¨Ò²½Ð×ö Brewer ¶¨Àí£©Ö¸³ö£¬Ò»¸ö·Ö²¼Ê½ÏµÍ³ÓÐ 3 ¸öºËÐÄÊôÐÔ£º Ò»ÖÂÐÔ¡¢¿ÉÓÃÐԺͷÖÇøÈÝÈÌÐÔ£¨formal
proof of CAP£©¡£ ÕâÌõ¶¨ÀíÊÇ NoSQL ·¢Õ¹±³ºóµÄÍÆ¶¯Á¦Á¿£¬ËüΪÎþÉü´«Í³¹ØÏµÊý¾Ý¿âµÄÄ³Ð©ÌØÐÔÒÔ»»È¡£¨Í¨³£ÊǸ߿ÉÓÃÐÔ£©ÌṩÁËÀíÂÛ»ù´¡¡£Ò»Ð©Á÷Ðеļü/ÖµÊý¾Ý¿â
°üÀ¨ Riak¡¢Cassandra¡¢CouchDB ºÍ MongoDB¡£
Òì²½ Web ·¶ÐÍ
ʼþÇý¶¯µÄÒì²½ Web ¿ò¼ÜÒѾ´æÔÚÁËÏ൱³¤Ò»¶Îʱ¼ä¡£ÆäÖÐ×îÁ÷ÐкÍ×îеÄÒì²½
Web ¿ò¼ÜÊÇ Tornado£¬ËüʹÓà Python ÓïÑÔ±àд£¬ÔÚ Facebook ÄÚ²¿Ê¹ÓᣠÏÂÃæÕâ¸öÀý×Ó˵Ã÷ÁË
hello_world ÔÚ Tornado ÖУ¨ÔÚÏÂÔØÊ¾ÀýÎļþÖнÐ×ö hello_tornado.py
£©ÊÇʲôÑù×Ó¡£
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start() |
Twisted.web Ò²ÊÇÓà Python ÓïÑÔдµÄ£¬¹¤×÷·½Ê½Ò²Ê®·ÖÀàËÆ¡£
×îºó̸µ½ÕæÕýµÄ Web ·þÎñÆ÷±¾Éí£¬Óë Apache ²»Í¬£¬nginx
²»Ê¹ÓÃỊ̈߳¬¶øÊÇʹÓÃÒ»ÖÖʼþÇý¶¯µÄ£¨Òì²½£©¼Ü¹¹À´´¦ÀíÇëÇó¡£ Òì²½ Web ¿ò¼ÜʹÓà nginx ×÷ΪÆä
Web ·þÎñÆ÷ÊÇÊ®·Ö³£¼ûµÄÇé¿ö¡£
½áÊøÓï
Node.js ÔÚ Web ¿ª·¢ÈËÔ±Öзdz£ÒýÈ˹Ø×¢¡£ËüÔÊÐí¿ª·¢ÍŶÓͬʱÔÚ¿Í»§¶ËºÍ·þÎñÆ÷¶ËÉϱàд
JavaScript¡£ ËüÃÇ»¹¿ÉÒÔ½áºÏÓë JavaScript Ïà¹ØµÄÇ¿´ó¼¼Êõ£ºJQuery¡¢V8¡¢JSON
ºÍʼþÇý¶¯µÄ±à³Ì¡£ ÁíÍ⻹ÓлùÓÚ Node.js ¿ª·¢µÄÉú̬ϵͳ£¬±ÈÈç Express Web ¿ò¼Ü¡£
Node.js µÄÓŵãÒýÈ˹Ø×¢£¬ËüÒ²´æÔÚһЩȱµã¡£Èç¹ûÊÇ CPU Ãܼ¯Ðͱà³Ì£¬¾ÍÎÞ·¨ÌåÏÖ
Node.js ÌṩµÄ·Ç×èÈû I/O ·½ÃæµÄÓŵ㡣 ÓÐЩ¼Ü¹¹¿ÉÒÔ½â¾öÕâÀàÎÊÌ⣬±ÈÈ罫һ¸ö³ØÖеĽø³Ì·ÖÁ÷µ½Ã¿¸ö
Node.js ʵÀýÉÏÔËÐУ¬µ«ÐèÒªÓÉ¿ª·¢ÈËԱȥʵÏÖËü¡£
|