utorak, 23 aprila, 2024
Sam svoj majstor

Node.js

Autor: Nikola Hardi

node.js tehnologija

Node.js je najjednostavnije opisati kao tehnologiju koja se zasniva na sledećih nekoliko ideja: event-based programiranje i nonblocking Io API, napravljen za brze, interaktivne aplikacije koje su pokrenute na distribuiranim platformama koje se lako skaliraju. Ovakav uvod zahteva i malo detaljnije objašnjenje, ali prvo da vidimo malo kôda.

Jednostavan TCP server

var net = require('net') var server = net.createServer( function(socket) { socket.write("Echo server\n"); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');

U ovom kôdu je najpre učitan ugrađeni modul net. Zatim je kreiran server za koji je vezana callback funkcija i ona je odmah i definisana. Ovaj jednostavan primer sve primljene poruke prosleđuje na taj isti socket. Dakle imamo tzv. echo server. Nakon kreiranja servera, on je i aktiviran tako da „osluškuje” na portu 1337. Ovaj kôd možemo sačuvati u .js datoteci proizvoljnog imena. Kod pokrećemo komandom node ime-datoteke.js.

Event loop i nonblocking API

Činjenica je da su ulazno/izlazne operacije bilo kakve prirode sporije nego rad ostatka sistema. Problem se javlja u situacijama kada ceo sistem čeka na završetak „spore” operacije jer za to vreme ostatak slobodnih resursa može biti efikasnije iskorišćen, a nije.

Prvo rešenje je bilo uvođenje višeprocesnih sistema gde su ulazno/izlazne operacije kreirane kao novi procesi, tako da je izvršavanje osnovnog procesa programa moglo da teče i po pokretanju „spore” operacije. Takve „spore” operacije su imale poseban proces i operativni sistem je zadužen za opsluživanje oba opisana procesa. Ovo rešenje radi dovoljno dobro do određenog broja procesa, nakon čega se javlja problem sa trošenjem resursa na izmenu konteksta (context switching), što je loše.

Problem sa imenom konteksta je donekle rešen uvođenjem koncepta višenitnog programiranja (multithreading). Niti se mogu opisati kao kvazi procesi koji dele određene resurse kao što je memorija. Time je donekle umanjen prethodni problem, ali ovaj način programiranja može da postane vrlo zamršen i naporan jer uvodi nove probleme.

Rešenje za koje su se odlučili node.js programeri je programiranje zasnovano na događajima (event-driven) i neblokirajućim ulazno/izlaznim operacijama. Ideja je da za određene događaje vežemo funkcije u kojima je definisano kako rezultat događaja treba da bude obrađen. Gotovo sve je implementirano u obliku callback funkcija. Koncept neblokirajućih operacija je u početku problematično shvatiti, ali praktično se svodi na to da poziv funkcije traje vrlo kratko, ali vreme kada ćemo dobiti rezultat je neodređeno, ali to ne utiče na brzinu izvršavanja različitih delova naše aplikacije. Dakle, funkcioniše po principu: kada rezultat stigne, pozovi određenu funkciju.

HTTP server

Sledi primer jednostavnog HTTP servera koji osluškuje na portu 8080 i na zahtev klijenta odgovara sa „Zdravo svete”

var http = require('http'); var server == http.createServer(); server.on('request', function(req, res) { res.writeHead(200, { 'Content-Type':'text/plain' }); res.write('Zdravo svete'); res.end(); }); server.listen(8080);

Ovaj primer kôda je vrlo sličan prethodnom i takođe se sastoji od učitavanja modula, kreiranja servera, registrovanja i definisanja callback funkcije i samog pokretanja servera na željenom portu.

Node Package Manager

U prethodnim primerima kôda može se primetiti šema koja se ponavlja.

  • Učitavanje modula
  • Definisanje i vezivanje callback-ova
  • Pokretanje servera

Uz node.js stižu razni predinstalirani moduli, kao što su: http, net, fs… Osim njih, na raspolaganju su nam i razni drugi moduli koji nisu sastavni deo jezgra node.js-a. Jedan node.js modul može da se pojavi u tri oblika:

– kao datoteka, – folder ili – ugrađeni modul.

Zanimljiva stvar je da moduli u obliku foldera sadrže poseban JSON fajl (package.json) u kojem su navedene informacije o nazivu modula, verziji, datotekama koje on sadrži…

NPM (Node Package Manager) je pomoćni alat koji ima više uloga, kao što su: razrešavanje i instaliranje zavisnosti za pojedine module, pretraga baze postojećih modula i njihova instalacija. Još jedna važna stvar u vezi sa NPM upravnikom paketa jeste ta da može da radi u lokalnom i globalnom režimu. Kada je reč o lokalnom režimu rada, preuzeti moduli će biti smešteni u trenutni folder i oni će biti dostupni samo u trenutnom projektu. Kod globalnog režima moduli su nakon instalacije dostupni u svim projektima na sistemu, odnosno u svim node.js aplikacijama.

Socket.IO

Kao što je rečeno u uvodu, node.js je vrlo pogodan za brze, realtime aplikacije. Ovde se naravno ne misli na hard realtime aplikacije već na interaktivnost. Klasične web aplikacije se oslanjaju na HTTP protokol koji ima nikoliko zahteva: GET, POST, PUT… Svi ovi zahtevi se upućuju od strane klijenta ka serveru. Ovo nas dovodi u neprijatnu situaciju kada klijent želi da ima najsvežije podatke sa servera jer mora stalno da šalje zahteve, da „zapitkuje” (polling). Tehnologije kao što je AJAX omogućavaju da krajnji korisnici nisu svesni ovog problema, ali programeri i te kako jesu.

Slična situacija se javlja kod mrežnog programiranja, međutim tada obe strane veze, i klijent i server, imaju mogućnost da šalju poruke. Naravno, reč je o socket-ima. Sličan koncept je nedavno uveden i u programiranje modernih web aplikacija u vidu WebSocketa. Node.js podržava rad sa WebSocketima ali mnogo češće je u upotrebi modul Socket.IO čisto iz praktičnih razloga jer je jednostavniji za rad. Socket.IO moramo da instaliramo pomoću NPM jer on nije ugrađen u jezgro node.js-a.

Drugim rečima, Socket.IO nam omogućava da server obavesti sve priključene klijente kada ima nove podatke čime je izbegnut polling.

npm install socket.io

Express

Jednostavno rečeno, express je web application framework za node. Njegova svrha je, najkraće rečeno, da automatizuje mnoge zadatke koji se često ponavljaju pri pisanju web aplikacija. Ovo obuhvata zadatke koji pokrivaju i drugi slični framework-ovi. Express je zaista minimalistički framework i može da servira i takozvani statički sadržaj (css, javascript…). Postoji mogućnost da se koristi na dva načina, kao običan modul ili uz generator aplikacija koji će da kreira osnovnu hijerarhije direktorijuma i generiše neophodne fajlove koji su potrebni za početak rada jedne aplikacije.

Zaključak

Nije lako zaustaviti se i zaključiti priču o Node-u. Jednom kada ga isprobate stalno ćete dobijati nove ideje šta biste sve mogli da napravite i za šta bi sve bio sjajan. Bitno je reći da je Node sada već jedan stabilan projekat, koriste ga mnoga poznata imena kao što su The New York times, ebay, Yahoo, LinkedIn, MySpace i mnogi drugi. Jednostavan je za učenje, neverovatno brz ako se koristi na ispravan način i svakako nešto novo na šta treba obratiti pažnju.