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

Microservicios sobre MEAN Stack

Embed Size (px)

Citation preview

Microservicios

sobre MEAN Stack

Dr. Pedro J. MolinaDesarrollador Independiente

@pmolinam

¿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:

¿JavaScript?

WAT Programming http://bit.ly/watProg

>[] + []//empty string

>[] + {}[object Object]

>{} + {}NaN

>{} + []0

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!

Stack MEAN Dev

Local:27001

Local:5000

-

Navegador

Nube

db:27001

app:80

-

Navegador

Producción

cluster:27001

app :80

-

Navegador

lb: 443

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

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

Microservicios (3/3)

Microservicios = SOA para Hipsters

Abanderados Netflix

Amazon

Building Microservices2015, Sam Newman

Demo. Ejemplo

Sitio en Producción:

http://bit.ly/madjs

demo / 1234 (sed buenos)

Repositorio de fuentes:

http://bit.ly/madjs2

Demo. Apps móviles usando los microservicios

Stack y Arquitectura

Client ExpressJS BaucisJS Mongoose MongoDB

HTTP req

resourcequery/command

data

401 | 403

AuthN/AuthZ middleware

<req.user, res>

Microservice

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

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()

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);

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);

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

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

IU Administrativa

Portal con Bootstrap y AngularJS 1.4

Permite administrar el Backend y la seguridad

Opcional

Reemplazable por otra capa de vista

Tareas grunt

clean

eslint

copy

uglify

mochaTest

coverage

Herramientas

npm

bower (~)

grunt

eslint

mocha / jasmine / karma

istanbul

Escalabilidad

Clusters de MongoDB

Sesión persistida en MongoDB connect-mongo

PaaS (como Heroku)

Balanceador de carga (nginx, haproxy)

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

Registro y descubrimiento

Consul

Monitorización

newRelic

Monitorización

Prometheus

Logs

papertrail

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)

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

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

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"]

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

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

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

Hivepod.io

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

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

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

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

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…

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

Contacto

¿Te gusto lo que viste o todo lo contrario?

En cualquier caso, ¡retroaliméntame!

Pedro J. Molina

[email protected]

@pmolinam