Alexis Kinsella, 4 novembre 2013
|
Node.js est un serveur JavaScript event driven non bloquant
Initié en 2009
JavaScript ?
Côté serveur ?
Et mono threadé en plus ?
$ brew install node
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Open-XKE\n');
}).listen(9000, 'localhost');
console.log('Server running at http://localhost:9000/');
node app.js
$ curl http://npmjs.org/install.sh | sh
$ npm install -g grunt-cli
$ npm install grunt --save-dev
$ grunt {task}
Très bien, mais je peux faire quoi avec node.js ?
Très bien, mais je peux faire quoi avec node.js ?
Domaines d'application possible
Et que devrais-je éviter de faire avec node.js ?
Et que devrais-je éviter de faire avec node.js ?
ExpressJS est un framework web minimaliste and flexible, fournissant un ensemble robuste de fonctionalités pour construire des applications single et multi pages.
request | Client REST |
mongoose | Client Mongo |
passport | Authentification |
moment | Gestion des dates |
async ou Q | Flow Control |
jsdom | Implémentation DOM |
oauth2orize | Serveur OAuth |
oauth | Client OAuth |
Socket.io | Temps réel |
winston | Logging |
node-mailer | Envoi de mails |
node-soap | Exposer et consommer des web service SOAP |
node-cron | Planificateur de tâches |
Yet another acronym !
domain.create()
.on('error', function (err) {
// handle error
})
.run(hello);
cluster = require("cluster")
http = require("http")
numCPUs = require("os").cpus().length
if cluster.isMaster
# Fork workers.
i = 0
while i < numCPUs
cluster.fork()
i++
cluster.on "exit", (worker, code, signal) ->
console.log "worker " + worker.process.pid + " died"
else
# Workers can share any TCP connection.
# In this case its a HTTP server
http.createServer((req, res) ->
res.writeHead 200
res.end "hello world\n"
).listen 8000
kill -s SIGUSR2 <cluster_pid>
fs = require "fs"
util = require "util"
http = require "http"
recluster = require "recluster"
cluster = recluster "#{__dirname}/app.js"
cluster.run()
fs.watchFile "package.json", (curr, prev) ->
console.log "Package.json changed, reloading cluster..."
cluster.reload()
process.on "SIGUSR2", ->
console.log "Got SIGUSR2, reloading cluster..."
cluster.reload()
console.log "Spawned cluster, kill -s SIGUSR2 #{process.pid} to reload"
Zero Downtime Deployment
Daemonisation
+ | - | |
Upstart |
|
|
#!upstart
description "Xebia Mobile Backend node.js server"
author "akinsella"
start on (local-filesystems and net-device-up IFACE=venet0)
stop on shutdown
respawn
respawn limit 99 5
script
export HOME="/home/xebia"
echo $$ > /var/run/xebia-mobile-backend.pid
exec sudo -u xebia /home/xebia/xebia-mobile-backend.sh >> /var/log/xebia-mobile-backend.sys.log 2>&1
end script
pre-start script
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/xebia-mobile-backend.sys.log
end script
pre-stop script
rm /var/run/xebia-mobile-backend.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/xebia-mobile-backend.sys.log
end script
+ | - | |
Forever |
|
|
+ | - | |
PM2 |
|
|
Distributions
+ | - | |
StrongLoop |
|
|
Hosting
+ | - | |
Heroku, CloudFoundry, Nodejitsu, Appfog, DotCloud, ... |
|
|
+ | - | |
Amazon EC2, Rackspace, Ovh, Gandi, Azure, ... |
|
|
+ | - | |
Serveur dédié |
|
|
Monitoring
+ | - | |
NodeFly |
|
|
+ | - | |
Nodetime |
|
|
+ | - | |
New Relic |
|
|
Alexis Kinsella, Xebia France