Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Microservicios sobre MEAN Stack

796 views

Published on

Material de la charla del JSDay.ES 2016 celebrado el 20 de abril de 2016.

Published in: Technology
  • serverless
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Microservicios sobre MEAN Stack

  1. 1. Microservicios sobre MEAN Stack Dr. Pedro J. Molina Desarrollador Independiente @pmolinam
  2. 2. ¿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:
  3. 3. ¿JavaScript?  WAT Programming http://bit.ly/watProg >[] + [] //empty string >[] + {} [object Object] >{} + {} NaN >{} + [] 0
  4. 4. 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!
  5. 5. Stack MEAN Dev Local :27001 Local :5000 - Navegador Nube db :27001 app :80 - Navegador Producción cluster :27001 app :80 - Navegador lb: 443
  6. 6. 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
  7. 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. 8. Microservicios (3/3)  Microservicios = SOA para Hipsters  Abanderados  Netflix  Amazon  Building Microservices 2015, Sam Newman
  9. 9. Demo. Ejemplo Sitio en Producción: http://bit.ly/madjs demo / 1234 (sed buenos) Repositorio de fuentes: http://bit.ly/madjs2
  10. 10. Demo. Apps móviles usando los microservicios
  11. 11. Stack y Arquitectura Client ExpressJS BaucisJS Mongoose MongoDB HTTP req resource query/command data 401 | 403 AuthN/AuthZ middleware <req.user, res> Microservice
  12. 12. 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
  13. 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. 14. 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);
  15. 15. 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);
  16. 16. 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
  17. 17. 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
  18. 18. IU Administrativa  Portal con Bootstrap y AngularJS 1.4  Permite administrar el Backend y la seguridad  Opcional  Reemplazable por otra capa de vista
  19. 19. Tareas grunt  clean  eslint  copy  uglify  mochaTest  coverage
  20. 20. Herramientas  npm  bower (~)  grunt  eslint  mocha / jasmine / karma  istanbul
  21. 21. Escalabilidad  Clusters de MongoDB  Sesión persistida en MongoDB  connect-mongo  PaaS (como Heroku)  Balanceador de carga (nginx, haproxy)
  22. 22. 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
  23. 23. Registro y descubrimiento Consul
  24. 24. Monitorización newRelic
  25. 25. Monitorización Prometheus
  26. 26. Logs papertrail
  27. 27. 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)
  28. 28. 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
  29. 29. 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
  30. 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. 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. 32. 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
  33. 33. 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
  34. 34. Hivepod.io
  35. 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. 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. 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. 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. 39. 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…
  40. 40. 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
  41. 41. Contacto ¿Te gusto lo que viste o todo lo contrario? En cualquier caso, ¡retroaliméntame! Pedro J. Molina pjmolina@gmail.com @pmolinam

×