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.

Opensouthcode: Microservicios sobre MEAN Stack

890 views

Published on

Material presentado en el OpenSouthCode. La Térmica, 7 de mayo de 2016 - Malaga, España.

Published in: Technology
  • Be the first to comment

Opensouthcode: 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/termica0 demo / 1234 (sed buenos) Repositorio de fuentes: http://bit.ly/termica2
  10. 10. Demo. Apps móviles usando el backend
  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

×