English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Node.js基本知识简单汇总

Node.js è nato nel 2009 e, fino ad oggi, ha già sviluppato oltre due anni, il suo tasso di crescita è visibile a tutti gli occhi. Dalla visita superiore a Rails su GitHub, fino alla fine dell'anno scorso quando il fondatore di Node.js, Ryan Dalh, si è unito a Joyent e ha ricevuto finanziamenti aziendali, fino alla pubblicazione di questa versione di porting Windows quest'anno, il futuro di Node.js ha ricevuto il riconoscimento della comunità tecnica. InfoQ ha sempre seguito lo sviluppo di Node.js, e quest'anno ha tenuto conferenze speciali alle due edizioni di Qcon (stazione di Pechino e stazione di Hangzhou). Per promuovere meglio la tecnologia Node.js in Cina, abbiamo deciso di aprire una colonna 'Iniziare con Node.js', invitando i predicatori, gli sviluppatori e gli esperti tecnici del campo Node.js a raccontare tutti gli aspetti di Node.js, affinché i lettori possano avere una comprensione più profonda e possano partecipare attivamente alle discussioni e alla pratica delle nuove tecnologie.

Il primo articolo della serie "Cos'è Node.js" cerca di illustrare dal diversi angoli i concetti di base, la storia di sviluppo, i vantaggi di Node.js, ecc., i sviluppatori che non sono familiari con questo campo possono conoscere alcune basi di Node.js attraverso questo articolo.

Partendo dal nome

Con l'aumentare delle notizie tecniche su Node.js, le modalità di scrittura di Node.js sono anche diverse, ci sono quelli che lo scrivono come NodeJS, altri come Nodejs, quale scrittura è più standard? Ci limitiamo a seguire il say che l'ufficio. Sito web ufficiale di Node.js ha sempre chiamato il progetto "Node" o "Node.js", non è stata trovata altra affermazione, "Node" è usato più spesso, considerando che la parola Node ha un significato e un uso troppo ampio, può causare confusione ai sviluppatori, abbiamo scelto il secondo nome - "Node.js", il suffisso .js indica l'intenzione originale del progetto Node, altri nomi sono vari e non hanno una fonte precisa, non raccomandiamo di usarli.

Node.js non è un'applicazione JS, ma una piattaforma di esecuzione JS

Vedere il nome Node.js, i principianti potrebbero confondersi pensando che sia un'applicazione JavaScript, in realtà, Node.js è scritto in linguaggio C++ e rappresenta un ambiente di esecuzione JavaScript. Perché scegliere il linguaggio C++? Secondo la memoria del fondatore di Node.js, Ryan Dahl, inizialmente aveva l'intenzione di scrivere Node.js in Ruby, ma poi ha scoperto che il virtual machine di Ruby non poteva soddisfare le sue esigenze. Successivamente ha provato con il motore V8, quindi ha scelto il linguaggio C++. Se non è un'applicazione JavaScript, perché si chiama.js? Perché Node.js è un ambiente di esecuzione JavaScript. Parlando di JavaScript, la prima cosa che viene in mente è il browser quotidiano, i browser moderni contengono vari componenti, tra cui il motore di rendering, il motore JavaScript, ecc., tra cui il motore JavaScript è responsabile dell'interpretazione ed esecuzione del codice JavaScript nelle pagine web. Come una delle lingue più importanti per la parte前端 del Web, JavaScript è sempre stato il monopolio degli ingegneri frontend. Tuttavia, Node.js è un ambiente di esecuzione JavaScript per il backend (supporta sistemi come *nux e Windows), il che significa che puoi scrivere codice JavaScript a livello di sistema o server e affidartolo a Node.js per l'interpretazione ed esecuzione, comandi semplici come:

#node helloworld.jsNode.js

Utilizza il motore V8 del browser Google Chrome, che offre prestazioni elevate, e fornisce anche molti API di livello di sistema, come le operazioni sui file e la programmazione di rete. Il codice JavaScript eseguito nel browser è soggetto a vari limiti di sicurezza e ha operazioni limitate sul sistema client. In confronto, Node.js è un runtime in background completo, che offre molte funzionalità che altri linguaggi possono implementare.

Node.js adotta un modello di programmazione event-driven e asincrono, progettato per servizi di rete

La parola 'event-driven' non è陌生的,在某些传统语言的网络编程中,我们会用到回调函数,比如当socket资源达到某种状态时,注册的回调函数就会执行。Node.js的设计思想以事件驱动为核心,它提供的绝大多数API都是基于事件的、异步的风格。以Net模块为例,其中的net.Socket对象就有以下事件:connect、data、end、timeout、drain、error、close等,使用Node.js的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的,这意味着虽然在代码结构中,这些函数看似是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。事件驱动、异步编程的设计(感兴趣的读者可以查阅笔者的另一篇文章《Node.js的异步编程风格》),重要的优势在于,充分利用了系统资源,执行代码无需阻塞等待某种操作完成,有限的资源可以用于其他的任务。此类设计非常适合于后端的网络服务编程,Node.js的目标也在于此。在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。

Dal modulo di supporto fornito da Node.js, possiamo vedere che molte funzioni, inclusa la gestione dei file, sono eseguite in modo asincrono, il che differisce dai linguaggi tradizionali. Inoltre, per facilitare lo sviluppo del server, Node.js offre molti moduli di rete, tra cui HTTP, DNS, NET, UDP, HTTPS, TLS, che permettono agli sviluppatori di costruire rapidamente server web. Prendiamo ad esempio un file helloworld.js semplice:

var http = require('http');
http.createServer(function (req, res) {}}
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(80, "127.0.0.1");

Il codice sopra configura un server HTTP semplice (esempio di部署 disponibile in http://helloworld.cnodejs.net/ in cui i lettori possono accedere), ascoltando sulla porta 80, per qualsiasi richiesta HTTP, il server restituisce una risposta con lo stato di header 200, il valore di Content-Type 'text/plain', il testo 'Hello World'. Da questo piccolo esempio, possiamo notare alcuni punti:

La programmazione di rete di Node.js è molto conveniente, i moduli forniti (qui è http) offrono API facili da usare, con poche righe di codice si può costruire un server.

Rappresenta la gestione degli eventi e la programmazione asincrona, specificando un callback funzione (realizzata tramite funzione anonima in JavaScript) nel parametro della funzione createServer, quando arriva una richiesta HTTP, Node.js chiama questa funzione callback per gestire la richiesta e rispondere. Certo, questo esempio è relativamente semplice, senza molte registrazioni di eventi, nei prossimi articoli i lettori vedranno molti esempi pratici.

Caratteristiche di Node.js

Parliamo ora delle caratteristiche di Node.js. Le caratteristiche di gestione degli eventi e programmazione asincrona sono state descritte in dettaglio in precedenza, non ripeteremo.

Node.js ha prestazioni elevate. Secondo il fondatore Ryan Dahl, le prestazioni sono un fattore importante considerato da Node.js, la scelta di C++ e V8 rispetto a Ruby o altri virtual machine è basata sul fine delle prestazioni. Node.js è anche molto audace nel design, esegue in modalità single-process, single-thread (sorprendente, vero? Questo è lo stesso modo in cui JavaScript esegue), il meccanismo di驱动 degli eventi è implementato da Node.js mantenendo efficientemente la coda degli eventi attraverso un singolo thread interno, senza l'uso delle risorse e delle transizioni di contesto delle thread, il che significa che di fronte a grandi volumi di richieste HTTP, Node.js gestisce tutto con la gestione degli eventi, i programmatori abituati allo sviluppo di servizi di rete con linguaggi tradizionali potrebbero essere molto familiari con la concorrenza e la collaborazione multi-thread, ma di fronte a Node.js, dobbiamo accettare e comprendere le sue caratteristiche. Dalla nostra esperienza possiamo ipotizzare che questo design potrebbe concentrare la pressione di carico sul CPU (gestione della coda degli eventi?) piuttosto che sulla memoria (ricordi i giorni in cui il Java Virtual Machine lanciava l'eccezione OutOfMemory?), meglio vedere di persona, ecco un test di prestazioni di Node.js effettuato dal team di piattaforma di dati condivisi di Taobao:

Configurazione del server fisico: RHEL 5.2, CPU 2.2GHz, memoria 4G

Scena d'uso di Node.js: proxy MemCache, ogni volta preleva 100 byte di dati

Dimensione del pool di connessioni: 50

Numero di utenti connessi: 100

Risultati del test (modalità socket): memoria (30M), QPS (16700), CPU (95%)

Dai risultati sopra, possiamo vedere che in questo scenario di test, il qps può raggiungere 16700 volte, la memoria utilizzata è solo 30M (di cui 22M sono utilizzati dal V8 heap), e il CPU raggiunge il 95%, potendo diventare un collo di bottiglia. Inoltre, molti praticanti hanno fatto analisi di prestazioni su Node.js, in sintesi, le sue prestazioni sono convincenti e sono anche una delle ragioni per cui è popolare. Poiché Node.js utilizza un modello di processo singolo e un thread singolo, come può un Node.js con prestazioni singole al nucleo sfruttare i CPU a multi nucleo popolari oggi? Il fondatore Ryan Dahl suggerisce di eseguire più processi Node.js e utilizzare alcuni meccanismi di comunicazione per coordinare le varie attività. Attualmente, ci sono già molti moduli di supporto multi processo Node.js pubblicati da terze parti, e gli articoli successivi nel blog spiegheranno in dettaglio la programmazione di Node.js su CPU a multi nucleo.

Un'altra caratteristica di Node.js è che il linguaggio di programmazione che supporta è JavaScript. Non verrà discussa qui una comparazione dei pro e dei contro tra linguaggi dinamici e linguaggi statici. Solo tre punti:

var hostRequest = http.request(requestOptions,function(response) {
  var responseHTML ='';
  response.on('data', function (chunk) {
    responseHTML = responseHTML + chunk;
  });
  response.on('end',function(){
    console.log(responseHTML);
    // fare qualcosa di utile
  });
});

Nel codice sopra, dobbiamo gestire la variabile responseHTML nell'evento end, grazie alla caratteristica di closure di JavaScript, possiamo definire la variabile responseHTML al di fuori delle due funzioni di callback, modificarne il valore nella funzione di callback corrispondente all'evento data, e infine accedere a essa e trattarla nell'evento end.

JavaScript è la lingua principale degli ingegneri frontend, ha una certa influenza nella comunità tecnica. E con lo sviluppo continuo delle tecnologie Web, in particolare l'aumento dell'importanza del frontend, molti ingegneri frontend hanno iniziato a esplorare le "applicazioni back-end", negli ambienti aziendali che utilizzano Node.js, gli ingegneri hanno dichiarato che hanno scelto Node.js perché sono abituati a JavaScript.

Le caratteristiche di funzione anonima e closure di JavaScript sono molto adatte alla programmazione a eventi e asincrona, come possiamo vedere dall'esempio helloworld, dove le funzioni di callback sono realizzate con funzioni anonime, molto comode. Il ruolo della closure è ancora più importante, vediamo un esempio di codice di seguito:

JavaScript ha prestazioni migliori tra i linguaggi dinamici, alcuni sviluppatori hanno condotto analisi di prestazioni su linguaggi dinamici come JavaScript, Python, Ruby e altri, scoprendo che JavaScript ha prestazioni migliori rispetto agli altri linguaggi, grazie anche al motore V8 che è tra i migliori della sua categoria, quindi anche Node.js beneficia di questo.

Breve storia dello sviluppo di Node.js

Nel febbraio 2009, Ryan Dahl ha annunciato sul blog la creazione di un server web leggero basato su V8 e una serie di librerie.

Nel maggio 2009, Ryan Dahl ha rilasciato la versione iniziale di alcuni pacchetti di Node.js su GitHub, e nei mesi successivi, qualcuno ha iniziato a sviluppare applicazioni con Node.js.

Nel novembre 2009 e aprile 2010, entrambe le edizioni di JSConf hanno organizzato conferenze su Node.js.

Alla fine del 2010, Node.js ha ricevuto il finanziamento del servizio di cloud computing Joyent, e il fondatore Ryan Dahl ha iniziato a lavorare a tempo pieno per Joyent per sviluppare Node.js.

Nel luglio 2011, Node.js ha rilasciato la versione per Windows con il supporto di Microsoft.

Casi di applicazione di Node.js

Nonostante Node.js sia nato appena due anni fa, la sua crescita sta rapidamente superando Ruby/Rails. Ecco alcuni esempi di applicazioni aziendali che utilizzano Node.js, ascoltiamo le voci dei clienti.

Nell'applicazione mobile più recente di LinkedIn, NodeJS è la base di back-end di questa applicazione mobile. Kiran Prasad, responsabile dello sviluppo mobile di LinkedIn, ha dichiarato ai media che l'intera piattaforma software mobile è costruita con NodeJS:

LinkedIn utilizza una vasta gamma di tecnologie, ma nel settore dei server mobili ci affidiamo completamente a Node.

(Ragioni di utilizzo) Primo, la sua flessibilità. Secondo, se conosci Node, scoprirai che è particolarmente bravo a comunicare con altri servizi. Le applicazioni mobili devono interagire con le nostre API di piattaforma e database. Non abbiamo fatto molte analisi di dati. rispetto alla tecnologia Ruby on Rails utilizzata in precedenza, il team di sviluppo ha rilevato che Node migliora molto le prestazioni. Hanno eseguito 15 virtual server (15 istanze) su ogni macchina fisica, di cui 4 istanze possono gestire il doppio del traffico. L'valutazione della capacità è basata sui risultati dei test di carico.

Il sito web di servizi sociali aziendali Yammer ha utilizzato Node per creare un server proxy cross-domain per la propria piattaforma, i sviluppatori di terze parti possono utilizzare questo server per implementare la comunicazione AJAX tra il codice JavaScript托管 nel proprio dominio e l'API della piattaforma Yammer. Il direttore tecnico della piattaforma Yammer, Jim Patterson, ha espresso i propri punti di vista sui vantaggi e gli svantaggi di Node:

(Vantaggi) Poiché Node è basato su un modello di eventi e non bloccante, è particolarmente adatto a gestire richieste concorrenti, quindi i server proxy costruiti su Node si comportano molto meglio rispetto ad altre tecnologie implementative (come Ruby). Inoltre, il codice client che interagisce con il server proxy Node è scritto in linguaggio JavaScript, quindi sia il client che il server sono scritti in una singola lingua, il che è molto bello.

(Svantaggi) Node è un progetto open source relativamente nuovo, quindi non molto stabile, è sempre in evoluzione e manca di un gran numero di librerie di terze parti di supporto. Sembra essere come Ruby/Rails negli anni passati.

Il noto sito di gestione di progetti GitHub ha anche tentato un'applicazione Node. Questa applicazione Node si chiama NodeLoad, è un server di download di archivi (lo si utilizza ogni volta che si scarica un tarball o un file zip di una branch di archiviazione). Il server di download di archivi precedente di GitHub era stato scritto in Ruby. Nel sistema precedente, la richiesta di download degli archivi creava un task Resque. Questo task eseguiva effettivamente un comando git archive sul server di archiviazione, prelevando i dati da un file server. Poi, la richiesta iniziale assegnava a te un'applicazione Ruby Sinatra di piccole dimensioni in attesa di questo task. In realtà, questa faceva solo controllare l'esistenza del flag memcache, poi reindirizzava all'indirizzo di download finale. Il sistema precedente eseguiva circa 3 istanze di Sinatra e 3 worker di Resque. Gli sviluppatori di GitHub hanno ritenuto che fosse un'ottima opportunità per l'applicazione Node. Node si basa su un modello di eventi, rispetto al modello bloccante di Ruby, Node è in grado di gestire meglio gli archivi git. Durante la scrittura del nuovo server di download, gli sviluppatori hanno ritenuto che Node fosse particolarmente adatto a questa funzione, oltre a utilizzare la libreria Node socket.io per monitorare lo stato dei download.

Not only abroad, but the advantages of Node have also attracted the attention of domestic developers. Taobao has actually applied Node technology:

MyFOX is a data processing middleware responsible for extracting data from a MySQL cluster, performing calculations, and outputting statistical results. Users submit a SQL statement, and MyFOX generates the query statements required for each database shard based on the semantics of the SQL command, sends them to each shard, and then summarizes and calculates the results. The characteristics of MyFOX are CPU-intensive, without file IO, and only handles read-only data. Initially, MyFOX was written in PHP, but encountered many problems. For example, PHP is single-threaded, and MySQL needs blocking queries, making it difficult to handle concurrent data requests. The later solution was to use nginx and dirzzle, and implement the interface based on the HTTP protocol, and use curl_multi_get to send requests. However, the MyFOX project team finally decided to implement MyFOX using Node.js.

There are many reasons to choose Node.js, such as considering interest and community development, and also hoping to improve concurrency and exhaust the CPU. For example, frequently opening and closing connections will make a large number of ports in a waiting state. When the number of concurrent connections increases, it often leads to connection failure due to insufficient ports (in TIME_WAIT state). Previously, it was often through modifying system settings to reduce waiting time to bypass this error. However, using a connection pool can well solve this problem. In addition, in the past, MyFOX would appear very dense access pressure under some cache invalidation conditions, and using Node.js can share query states, allowing certain requests to 'wait a moment' so that the system can replenish the cache content.

Summary

This article briefly introduces the basic knowledge of Node.js, including concepts, features, history, cases, and so on. As a platform that is only 2 years old, the development momentum of Node.js is evident. More and more enterprises are beginning to pay attention to and try Node.js, and front-end and back-end developers should understand the relevant content.