Tecnologías para microservicios

430 visualizaciones

Publicado el

Repaso a diferentes tecnologías a tener en cuenta para crear microservicios. Charla impartida en dotNetMalaga, 10/12/216.

Publicado en: Software
0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
430
En SlideShare
0
De insertados
0
Número de insertados
11
Acciones
Compartido
0
Descargas
0
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Tecnologías para microservicios

  1. 1. Tecnologías para MICROSERVICIOS Dr. Pedro J. Molina Fundador de http://pjmolina.com @pmolinam
  2. 2. ¿Qué hago?  Metadev  Consultoría, Formación  Cloud, Microservicios, Stack MEAN, CI  Productos en Modelado y DSL  Colaboro con Lemoncode  Cursos y mater de frontend  Ex:  CTO, Director de I+D, Arquitecto de Software, Desarrollador
  3. 3. ¿Qué es un Microservicio?  Estilo arquitectural  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 claro y conocido. http://martinfowler.com/articles/microservices.html
  4. 4. Sobre la importancia de aislar los microservicios: Si la necesita, cada microservicio tiene su propia capa de persistencia. Aislados
  5. 5. Microservicios 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
  6. 6. ¿Qué es un Microservicio?
  7. 7. Microservicio Disrupción Empresarial Ley de Conway “Las organizaciones que diseñan sistemas están limitadas a producir diseños que copian las estructuras de comunicación de esas organizaciones”. Melvin Conway, 1968 Inversión  Disrupción  Startups centradas en Transformación Digital que disrupcionan un mercado  Aprovechan la agilidad de los microservicios para iterar y pivotar más rápido descubriendo y asentando nuevos procesos más óptimos  Uber, Netflix, Amazon…
  8. 8. APIs agnósticas de lenguaje 1. CORBA >> C + IDL 2. SOA >> XML + SOAP + WDSL … 3. REST >> JSON + HTTP
  9. 9. Tipos MIME  Declaran el tipo de codificación a emplear  Los más frecuentes:  JSON application/json  XML text/xml  HTML text/html  Texto plano text/plain  CSV text/csv GET /actors/42 Accept: text/xml 200 OK Content-Type: text/xml <actor id="42"> <name>Jessica</name> <lastname>Alba</lastname> <filmography url= "/films/42" /> </actor>
  10. 10. REST  REpresentational State Transfer  Protocolo sin estado  URIs únicas para cada recurso  Semántica asociada a operaciones  GET/PUT/POST/DELETE en HTTP  Hipermedia (navegable) GET /actors/42 Accept: application/json 200 OK Content-Type: application/json { "id": 42 "name": "Jessica" "lastname": "Alba" "filmography": "/films/42" }
  11. 11. Niveles REST Richarson Maturity Model  http://martinfowler.com/articles/richardsonMaturityModel.html  Nivel 0. HTTP y nada mas (RPC bajo HTTP)  Nivel 1. Recursos: GET /factura/217  Nivel 2. Verbos y códigos de error HTTP POST /factura/ 201 Created  Nivel 3. Controles Hipermedia <link rel=“lines” uri=“/factura/217/lines” />
  12. 12. HATEOAS  Hypertext As The Engine Of Application State  API autodocumentadas, autoexplorables  Clientes más inteligentes / dinámicos
  13. 13. 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
  14. 14. Microservicios  Microservicios = ¿SOA para Hipsters?  Abanderados  Netflix  Amazon  Thoughtworks  Building Microservices 2015, Sam Newman
  15. 15. Stacks para Microservicios NodeJS  Express + Baucis  SenecaJS  FeatherJS  Serverless: Claudia Java  Jersey  Dropwizard  Spring / Spring Boot  Play  SparkJava  http://www.gajotres.net/best-available-java- restful-micro-frameworks/ .NET Core  NancyFx  WebAPI  https://docs.microsoft.com/en- us/dotnet/articles/csharp/tutorials/microservices Go  go-kit/kit  micro/go-micro  goa.design  coding/kite  Serverless: Sparta, Apex, Gordon
  16. 16. Persistencia  NoSQL  MongoDB, CouchDB, Dynamo, DocumentDB  RDBM  MySql, Posgress, Oracle, Sql Server  Key-Value Stores  Redis  Memcache  Colas  RabitMQ, ZeroMQ, AMZ SQS, Azure Queues  Blobs  Amazon S3  Azure Blobs
  17. 17. Stack MEAN Dev Local :27001 Local :5000 - Navegador Nube db :27001 app :80 - Navegador Producción cluster :27001 app :80 - Navegador lb: 443
  18. 18. Demo. Ejemplo Sitio en Producción: https://dotnetmalaga.herokuapp.com demo / 1234 ¡Sed buenos! }:-b Repositorio de fuentes: https://github.com/pjmolina/event-backend
  19. 19. Demo. Portal usando los servicios https://dotnetmalaga2.herokuapp.com
  20. 20. MEAN Stack: Arquitectura Client ExpressJS BaucisJS Mongoose MongoDB HTTP req resource query/command data 401 | 403 AuthN/AuthZ middleware <req.user, res> Microservice
  21. 21. NodeJS + 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
  22. 22. 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()
  23. 23. .NET Core + NancyFX  http://nancyfx.org public class SampleModule : Nancy.NancyModule { public SampleModule() { Get["/hello"] = _ => “hello world"; } } /helloreq res
  24. 24. Go Serverless!  Código sin preocuparse* por la infrastructura  Amazon Lambda Functions http://docs.aws.amazon.com/lambda  Google Cloud Functions  IBM OpenWhisk  Azure Functions
  25. 25. Go Serverless: AWS Lambda  http://nancyfx.org exports.handler = function(event, context) { switch (event.operation) { case 'ping': context.succeed('pong'); return; case 'getSample': event.customArgs = ["rose:", "/tmp/rose.png"]; im.convert(event.customArgs, function(err, output) { if (err) context.fail(err); else { var resultImgBase64 = new Buffer( fs.readFileSync("/tmp/rose.png")) .toString('base64'); try { fs.unlinkSync("/tmp/rose.png");} catch (e) {} context.succeed(resultImgBase64); } }); break; default: return context.fail(new Error('Unrecognized operation "' + event.operation + '"')); } }; Ejemplo: AWS Lambda
  26. 26. 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
  27. 27. Escalabilidad  Clusters de MongoDB  Sesión persistida en MongoDB  connect-mongo  Balanceador de carga (nginx, haproxy, etc.)  Opciones:  Gestionalo tu según necesidades: IaaS  PaaS (como Heroku)  Serverless
  28. 28. 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
  29. 29. Registro y descubrimiento Consul
  30. 30. Monitorización newRelic
  31. 31. Monitorización Prometheus
  32. 32. Logs papertrail
  33. 33. 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)
  34. 34. 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
  35. 35. 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
  36. 36. 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"]
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. Hivepod.io
  41. 41. Hivepod.io https://www.hivepod.io class SessionTalk { string Title; string? Description; Speaker Author; } class Speaker { string Name; string Lastname; }
  42. 42. Microservicios en MEAN: Contras  JavaScript  WAT Programming  Se echa de menos Strongly-typing a lot  TypeScript ¡úsalo! Nada lo impide.  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 (mejora sobre npm: yarn)  Cambios que rompen compatibilidad que no respetan Semantic Versioning  Front-end JS es una non-stop fiesta cada 6 meses
  43. 43. 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 y levanta muy rápido comparado con Java o .NET clásico
  44. 44. Frontend vs Backend Pero monstruos al fin y al cabo… Monstruos diferentes
  45. 45. Referencias  Código de ejemplo https://github.com/pjmolina/event-backend  Podcast sobre Microservicios con “El Bruno” https://elbruno.com/2016/05/27/podcast-introduccin-a-microservicios-con-pmolinam/  Swagger  OpenAPIs https://openapis.org  Hivepod https://www.hivepod.io

×