opensouthcode: microservicios sobre mean stack

41
Microservicios sobre MEAN Stack Dr. Pedro J. Molina Desarrollador Independiente @pmolinam

Upload: pedro-j-molina

Post on 08-Feb-2017

573 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios

sobre MEAN Stack

Dr. Pedro J. MolinaDesarrollador Independiente

@pmolinam

Page 2: Opensouthcode: Microservicios sobre MEAN Stack

¿Qué hago?

Domain Specific Languages

Generación de código

Microservicios

JavaScript, TypeScript, C#

Backends

Despliegues en nube

Arquitectura de Software

Consultoría

CTO

DSLs

App Builders

Project Manager

Arquitectura de Software

DSLs

DSLs

Generación de código

Desarrollador Independiente

Colaboro con Lemoncode Formación

Anteriormente:

Page 3: Opensouthcode: Microservicios sobre MEAN Stack

¿JavaScript?

WAT Programming http://bit.ly/watProg

>[] + []//empty string

>[] + {}[object Object]

>{} + {}NaN

>{} + []0

Page 4: Opensouthcode: Microservicios sobre MEAN Stack

Sí: JavaScript

Lenguaje Universal:

ECMAScript Navegadores y móviles

Google V8 Se ejecuta rápido

NodeJS JS en el servidor

La comunidad JS es ¡enorme!

Page 5: Opensouthcode: Microservicios sobre MEAN Stack

Stack MEAN Dev

Local:27001

Local:5000

-

Navegador

Nube

db:27001

app:80

-

Navegador

Producción

cluster:27001

app :80

-

Navegador

lb: 443

Page 6: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios (1/3)

Estilo arquitectural para desarrollo de Software

Aplicaciones complejas compuestas por pequeños servicios, independientes y autónomos que se comunican usando APIsagnósticas de lenguaje.

Altamente desacoplados, enfocados en tareas pequeñas. ¿Cómo de pequeño?

Dueño (onwership) claro y conocido.

http://martinfowler.com/articles/microservices.html

Page 7: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios (2/3)

Ventajas Componibles Evolución rápida Stack adecuado al trabajo Aislamiento ante fallos Despliegues rápidos Mejor disponibilidad

Contras Latencia (en composición) Correlación de eventos (trazas) Heterogeneidad Volumen en despliegue requiere automatización

http://es.slideshare.net/stonse/pros-and-cons-of-a-microservices-architecture-talk-at-aws-reinvent

Page 8: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios (3/3)

Microservicios = SOA para Hipsters

Abanderados Netflix

Amazon

Building Microservices2015, Sam Newman

Page 9: Opensouthcode: Microservicios sobre MEAN Stack

Demo. Ejemplo

Sitio en Producción:

http://bit.ly/termica0

demo / 1234 (sed buenos)

Repositorio de fuentes:

http://bit.ly/termica2

Page 10: Opensouthcode: Microservicios sobre MEAN Stack

Demo. Apps móviles usando el backend

Page 11: Opensouthcode: Microservicios sobre MEAN Stack

Stack y Arquitectura

Client ExpressJS BaucisJS Mongoose MongoDB

HTTP req

resourcequery/command

data

401 | 403

AuthN/AuthZ middleware

<req.user, res>

Microservice

Page 12: Opensouthcode: Microservicios sobre MEAN Stack

Express JS

http://expressjs.com

var express = require('express');var app = express();

app.get('/hello', function(req, res) {res.status(200).send('hello world');

});

/helloreq res

Page 13: Opensouthcode: Microservicios sobre MEAN Stack

Express Middleware

CORS

AuthN PassportJS

AuthZ

Etc.

app.all('*', function(req, res, next) {res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");res.header("Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,DELETE");next();

});

*reqres

next()

Page 14: Opensouthcode: Microservicios sobre MEAN Stack

Mongoose

ORM para MongoDB http://mongoosejs.com

Validación

Hooks pre/post acceso

var Vegetable = new mongoose.Schema({ name: String });

var VegModel = mongoose.model('vegetable', Vegetable);

Page 15: Opensouthcode: Microservicios sobre MEAN Stack

Baucis

https://www.npmjs.com/package/baucis

Recursos HATEOAS/Level 3

REST APIs sobre MongoDB NodeJS ExpressJS

var Vegetable = new mongoose.Schema({ name: String });

mongoose.model('vegetable', Vegetable);

baucis.rest('vegetable');

var app = express();

app.use('/api', baucis());

app.listen(8012);

Page 16: Opensouthcode: Microservicios sobre MEAN Stack

Swagger

OpenAPI Initiative https://openapis.org

Descripción de Servicios / APIs

Documenta el API

Facilita su uso por desarrolladores

Herramientas Contract first

Documentar APIs existents

Generación de Proxies, Skeletons, SDKs nativos

Integración con Herramientas de API Management

Page 17: Opensouthcode: Microservicios sobre MEAN Stack

HAL

Estándar de Hipermedia en Recursos

HATEOAS

{

“id”: 1234

“name”: “Alicia”

“_links”: {

“self”: { “href”: “/article/10”},

“prev”: { “href”: “/article/9”},

“next”: { “href”: “/article/11”},

“action-delete”: {

“verb”: “DELETE”,

“href”: “/article/10”

}

}

}

http://stateless.co/hal_specification.html

Page 18: Opensouthcode: Microservicios sobre MEAN Stack

IU Administrativa

Portal con Bootstrap y AngularJS 1.4

Permite administrar el Backend y la seguridad

Opcional

Reemplazable por otra capa de vista

Page 19: Opensouthcode: Microservicios sobre MEAN Stack

Tareas grunt

clean

eslint

copy

uglify

mochaTest

coverage

Page 20: Opensouthcode: Microservicios sobre MEAN Stack

Herramientas

npm

bower (~)

grunt

eslint

mocha / jasmine / karma

istanbul

Page 21: Opensouthcode: Microservicios sobre MEAN Stack

Escalabilidad

Clusters de MongoDB

Sesión persistida en MongoDB connect-mongo

PaaS (como Heroku)

Balanceador de carga (nginx, haproxy)

Page 22: Opensouthcode: Microservicios sobre MEAN Stack

Carga

Sistema en producción

Backends para aplicaciones móviles Android e iOS + portal web

80.000 peticiones diarias en ventana de 4 horas

Promedio = 333 ppm, aprox 6 pps 100-200ms

Picos de 1000 ppm, aprox 17 pps

En 2 instancias 1x 1Gb RAM en Heroku por 100 $/mes + 18 $/mes de mLab

Page 23: Opensouthcode: Microservicios sobre MEAN Stack

Registro y descubrimiento

Consul

Page 24: Opensouthcode: Microservicios sobre MEAN Stack

Monitorización

newRelic

Page 25: Opensouthcode: Microservicios sobre MEAN Stack

Monitorización

Prometheus

Page 26: Opensouthcode: Microservicios sobre MEAN Stack

Logs

papertrail

Page 27: Opensouthcode: Microservicios sobre MEAN Stack

Configuración

Configuración como código (hard-coded json)

Configuración en la base de datos

Configuración por variables de entorno process.env.VAR1

Configuración en Consul (centralizada)

Page 28: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue en Heroku

git remote add heroku https://git.heroku.com/app1.git

Si conoces git, sabes desplegar en Heroku

Configurar:

/Procfile

Desplegar:

git push heroku master

web: node app/server.js

Page 29: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue en IBM Bluemix

IBM Bluemix usa CloudFoundry/manifest.yml

cf logincf create-service mongodb 100 mydb-sanchocf push myapp-quijote -m 1024M -b sdk-for-nodejs -t 180 -i 1cf bind-service mydb-sancho myapp-quijotecf scale myapp-quijote -i 1

---applications:- name: myapp-quijotecommand: node app/server.js

Page 30: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue con Docker (1/2)

DockerfileFROM node:latestENV NODE_ENV=productionWORKDIR /appRUN npm install -g grunt-cli ADD package.json /app/RUN npm installADD . /appRUN grunt releaseENV PORT=80EXPOSE 80ENTRYPOINT ["node", "/app/app/server.js"]

Page 31: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue con Docker (2/2)

Build

Run

docker build –t user/appName .

docker run --name db -d -P mongo:3.0docker run user/appName –d –P --link db:db

dbapp

Page 32: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue con Docker Compose

db: image: dockerfile/mongodbports: - "27017"

app: build: . environment: NODE_ENV: productionPORT: 80 SERVICE_NAME: app

links: - "db:DB" ports: - "80"

lb: image: jasonwyatt/nginx-loadbalancerlinks: - appenvironment: APP_PATH: "/"

ports: - "80:80"

docker-compose.yml

Page 33: Opensouthcode: Microservicios sobre MEAN Stack

Despliegue con Docker Compose

docker-compose up –ddocker-compose scale app=3

¡¡Arriba, arriba!!

db

app

lb app

app

#0

#1

#2

80

80 27017

Page 34: Opensouthcode: Microservicios sobre MEAN Stack

Hivepod.io

Page 35: Opensouthcode: Microservicios sobre MEAN Stack

Características destacables (1/2)

Escalable horizontalmente

Gestión de usuario y roles

Seguridad RBAC

Soporte a OAuth2 Login sindicable con Google, Facebook, Github

Localización

Page 36: Opensouthcode: Microservicios sobre MEAN Stack

Características destacables (2/2)

Soporte a binarios (en MongoDB o en S3)

Soporte a reescalado de imágenes en servidor

Importación/Exportación a XLST y CSV

Webhooks

Extensible vía Módulos

Mínimas dependencias: Desplegable en diversos proveedores de nube

Page 37: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios en MEAN: Contras

JavaScript WAT Programming

Missing Strongly-typing a lot TypeScript

Unit Test no son un capricho mocha, chai, Jasmine, karma, istanbul, etc

Versionado en NPM Falta de un SDK base estable (a la Java o .NET)

Demasiadas baldosas en movimiento #npmgate

Cambios que rompen compatibilidad que no respetan Semantic Versioning

Front-end JS es una non-stop fiesta cada 6 meses

Page 38: Opensouthcode: Microservicios sobre MEAN Stack

Microservicios en MEAN: Pros

Stack muy portable Corre en Windows, Linux, Mac sin cambios La mayoría de los proveedores de nube lo soportan activamente

Prototipado rápido

Escalado horizontal muy sencillo

ExpressJS es muy extensible

Ligero: provisiona muy rápido comparado con Java o .NET clásico

Page 39: Opensouthcode: Microservicios sobre MEAN Stack

Frontend: Hagan sus apuestas…

Pedirán datos desde un browser y esperando por la promesa que se los demos.

Microservicios.

Backend: Apuesta segura

Pero guarden la ropa antes de nadar…

Page 40: Opensouthcode: Microservicios sobre MEAN Stack

Referencias

Código de ejemplo https://github.com/pjmolina/event-backend

Swagger OpenAPI https://openapis.org

BaucisJS https://github.com/wprl/baucis

Hivepod https://www.hivepod.io Buildup http://www.buildup.io

WAT Programming http://bit.ly/watProg

Page 41: Opensouthcode: Microservicios sobre MEAN Stack

Contacto

¿Te gusto lo que viste o todo lo contrario?

En cualquier caso, ¡retroaliméntame!

Pedro J. Molina

[email protected]

@pmolinam