Microservicios
sobre MEAN Stack
Dr. Pedro J. Molina
Desarrollador 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 APIs
agnó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 Microservices
2015, 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
resource
query/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();
});
*req
res
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 login
cf create-service mongodb 100 mydb-sancho
cf push myapp-quijote -m 1024M -b sdk-for-nodejs -t 180 -i 1
cf bind-service mydb-sancho myapp-quijote
cf scale myapp-quijote -i 1
---
applications:
- name: myapp-quijote
command: node app/server.js
Despliegue con Docker (1/2)
 Dockerfile
FROM node:latest
ENV NODE_ENV=production
WORKDIR /app
RUN npm install -g grunt-cli
ADD package.json /app/
RUN npm install
ADD . /app
RUN grunt release
ENV PORT=80
EXPOSE 80
ENTRYPOINT ["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.0
docker run user/appName –d –P --link db:db
dbapp
Despliegue con Docker Compose
db:
image: dockerfile/mongodb
ports:
- "27017"
app:
build: .
environment:
NODE_ENV: production
PORT: 80
SERVICE_NAME: app
links:
- "db:DB"
ports:
- "80"
lb:
image: jasonwyatt/nginx-loadbalancer
links:
- app
environment:
APP_PATH: "/"
ports:
- "80:80"
docker-compose.yml
Despliegue con Docker Compose
docker-compose up –d
docker-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
pjmolina@gmail.com
@pmolinam

Microservicios sobre MEAN Stack

  • 1.
    Microservicios sobre MEAN Stack Dr.Pedro J. Molina Desarrollador Independiente @pmolinam
  • 2.
    ¿Qué hago?  DomainSpecific 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:
  • 3.
    ¿JavaScript?  WAT Programminghttp://bit.ly/watProg >[] + [] //empty string >[] + {} [object Object] >{} + {} NaN >{} + [] 0
  • 4.
    Sí: JavaScript  LenguajeUniversal:  ECMAScript  Navegadores y móviles  Google V8  Se ejecuta rápido  NodeJS  JS en el servidor  La comunidad JS es ¡enorme!
  • 5.
  • 6.
    Microservicios (1/3) Estilo arquitecturalpara desarrollo de Software Aplicaciones complejas compuestas por pequeños servicios, independientes y autónomos que se comunican usando APIs agnó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
  • 7.
    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
  • 8.
    Microservicios (3/3)  Microservicios= SOA para Hipsters  Abanderados  Netflix  Amazon  Building Microservices 2015, Sam Newman
  • 9.
    Demo. Ejemplo Sitio enProducción: http://bit.ly/madjs demo / 1234 (sed buenos) Repositorio de fuentes: http://bit.ly/madjs2
  • 10.
    Demo. Apps móvilesusando los microservicios
  • 11.
    Stack y Arquitectura ClientExpressJS BaucisJS Mongoose MongoDB HTTP req resource query/command data 401 | 403 AuthN/AuthZ middleware <req.user, res> Microservice
  • 12.
    Express JS  http://expressjs.com varexpress = require('express'); var app = express(); app.get('/hello', function(req, res) { res.status(200).send('hello world'); }); /helloreq res
  • 13.
    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(); }); *req res next()
  • 14.
    Mongoose  ORM paraMongoDB http://mongoosejs.com  Validación  Hooks pre/post acceso var Vegetable = new mongoose.Schema({ name: String }); var VegModel = mongoose.model('vegetable', Vegetable);
  • 15.
    Baucis  https://www.npmjs.com/package/baucis  RecursosHATEOAS/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);
  • 16.
    Swagger  OpenAPI Initiativehttps://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
  • 17.
    HAL Estándar de Hipermediaen 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
  • 18.
    IU Administrativa  Portalcon Bootstrap y AngularJS 1.4  Permite administrar el Backend y la seguridad  Opcional  Reemplazable por otra capa de vista
  • 19.
    Tareas grunt  clean eslint  copy  uglify  mochaTest  coverage
  • 20.
    Herramientas  npm  bower(~)  grunt  eslint  mocha / jasmine / karma  istanbul
  • 21.
    Escalabilidad  Clusters deMongoDB  Sesión persistida en MongoDB  connect-mongo  PaaS (como Heroku)  Balanceador de carga (nginx, haproxy)
  • 22.
    Carga  Sistema enproducció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
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    Configuración  Configuración comocó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)
  • 28.
    Despliegue en Heroku gitremote 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
  • 29.
    Despliegue en IBMBluemix  IBM Bluemix usa CloudFoundry /manifest.yml cf login cf create-service mongodb 100 mydb-sancho cf push myapp-quijote -m 1024M -b sdk-for-nodejs -t 180 -i 1 cf bind-service mydb-sancho myapp-quijote cf scale myapp-quijote -i 1 --- applications: - name: myapp-quijote command: node app/server.js
  • 30.
    Despliegue con Docker(1/2)  Dockerfile FROM node:latest ENV NODE_ENV=production WORKDIR /app RUN npm install -g grunt-cli ADD package.json /app/ RUN npm install ADD . /app RUN grunt release ENV PORT=80 EXPOSE 80 ENTRYPOINT ["node", "/app/app/server.js"]
  • 31.
    Despliegue con Docker(2/2)  Build  Run docker build –t user/appName . docker run --name db -d -P mongo:3.0 docker run user/appName –d –P --link db:db dbapp
  • 32.
    Despliegue con DockerCompose db: image: dockerfile/mongodb ports: - "27017" app: build: . environment: NODE_ENV: production PORT: 80 SERVICE_NAME: app links: - "db:DB" ports: - "80" lb: image: jasonwyatt/nginx-loadbalancer links: - app environment: APP_PATH: "/" ports: - "80:80" docker-compose.yml
  • 33.
    Despliegue con DockerCompose docker-compose up –d docker-compose scale app=3  ¡¡Arriba, arriba!! db app lb app app #0 #1 #2 80 80 27017
  • 34.
  • 35.
    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
  • 36.
    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
  • 37.
    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
  • 38.
    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
  • 39.
    Frontend: Hagan susapuestas…  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…
  • 40.
    Referencias  Código deejemplo 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
  • 41.
    Contacto ¿Te gusto loque viste o todo lo contrario? En cualquier caso, ¡retroaliméntame! Pedro J. Molina pjmolina@gmail.com @pmolinam