sexta-feira, 30 de dezembro de 2011

Codeigniter + Node.js + Vows.js


Continuando o post anterior iniciaremos o desenvolvimento da aplicação Node.js que notificará os clientes assim que os jobs de redimensionamento das imagens forem finalizados.

Asynchronous BDD com Vows.

Com todas as bibliotecas já instaladas e configuradas o primeiro passo é desenvolver os scrips da aplicação e como não poderia deixar de ser vamos iniciar pelos testes que guiarão o desenvolvimento.  Vamos utilizar a biblioteca de BDD Vows e para mais informações de como instalar o módulo acesse o site do projeto em: http://vowsjs.org.


Criar o arquivo application/servers/spec/server-now-test.js





Criar o servidor node
Criar o arquivo /home/fabrizio/public_html/dev.localhost/codeigniter-academic/application/servers/server-now.js para iniciar o desenvolvimento da aplicação Node.js



Iniciar a aplicação Node.js e rodar os testes.
$ node application/servers/server-now.js 
$ vows application/servers/spec/server-now-test.js --spec

A saída deve ser como a imagem abaixo.


Middleware
Como pode ser observado na aplicação Node.js foi inserido um middleware que intercepta a requisição e verifica se o cliente que está solicitando o serviço tem autorização.  Para isso foi criado um módulo de autenticação básica que não permite que os clientes sem permissão possam enviar mensagens aqueles clientes conectados na aplicação.

Um middleware pode ser inserido na cadeia de outros serviços que recebem, tratam e repassam a requisição, desta forma este middleware vai recuperar o header, verificar se o usuario e senha são válidos, e passar para frente a requisição.
var server = express.createServer();
server.configure(function () {
server.use(express.logger());
server.use(auth.basicAuth);
server.use(express.bodyParser()); 
server.use(express.static(__dirname + '/public'));
});


Modulo de Autenticação
Criar um módulo para o Node.js é muito simples.  Vamos criar o diretório application/servers/node_modules/basic-auth e nele criar o arquivo application/servers/node_modules/basic-auth/package.json
que vai descrever o novo módulo.


Criar o script application/servers/node_modules/basic-auth/basic-auth.js para desenvolver uma autenticação http básica.  Esta é uma funcionalidade muito simples, mas que pode ser refatorada para tornar o acesso ao servidor mais seguro. Mas para efeito didático, por hora é o suficiente. Baseou-se no script disponível em https://github.com/dawnerd/node-basic-auth




Administrando Serviços no Ubuntu
Vamos configurar aplicações facilitadoras na administração dos serviços que necessitam rodar em background, assim como manipular os arquivos de log da nossa aplicação Node.js.


Processo do Node.js como um Daemon 
Upstart é o init daemon default que o Ubuntu  utiliza para rodar processos em background. Com ele é possível levantar os processos da aplicação Node.js em background. Conheça mais no wiki do projeto http://wiki.ubuntu-br.org/Upstart.

Criar o arquivo /etc/init/node-resize.conf com as configurações e o caminho do script do nosso serviço Node.js


Agora basta dar permissão de execução ao arquivo e já é possível iniciar, parar e administrar o processo de forma simples com o uso do Upstart.
$ sudo chmod +x /etc/init.d/node-resize.conf
$ status nodetcp
$ sudo start nodetcp
$ sudo stop nodetcp
$ initctl help
$ initctl list | grep nodetcp
$ netstat -tnlp


Manipulando os arquivos de  Logs
O Logrotate do Ubuntu (http://manpages.ubuntu.com/logrotate) facilita a adminstração dos arquivos de logs permitindo dividir e rotacionar grandes arquivos.

Criar o arquivo /etc/logrotate.d/node-server para configurar como o log será rotacionado.
/var/log/node-resize.log {
 weekly;
 rotate 4;
}


Finalizando
Agora é só levantar a aplicação Node.js com o Upstart e rodar os testes para verificar se todos passam.
No próximo post vamos refatorar o Job do Worker de redimensionamento das imagens para que ele utilize esta aplicação Node.js para notificar o término de sua tarefa.
$ sudo start node-resize 
$ vows application/servers/spec/server-now-test.js --spec


REFERÊNCIAS
http://howtonode.org/how-to-module
http://www.adityaravishankar.com/2011/10/nowjs-node-js-tutorial-creating-multi-room-chat-server/
http://simas.posterous.com/writing-a-php-daemon-application
http://vowsjs.org/#installing
http://www.lifeyun.com/node-js-building-for-scalability-with-server-side-javascript.html
http://www.vivaolinux.com.br/artigo/Node.js-para-administradores-de-sistema
http://vowsjs.org

Nenhum comentário:

Postar um comentário