Upload
pedro-j-molina
View
573
Download
0
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/termica0
demo / 1234 (sed buenos)
Repositorio de fuentes:
http://bit.ly/termica2
Demo. Apps móviles usando el backend
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
@pmolinam