¿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
¿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
Sobre la importancia de aislar los microservicios:
Si la necesita,
cada microservicio tiene su propia capa de persistencia.
Aislados
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
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…
APIs agnósticas de lenguaje
1. CORBA >> C + IDL
2. SOA >> XML + SOAP + WDSL …
3. REST >> JSON + HTTP
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>
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"
}
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”
/>
HATEOAS
Hypertext As The Engine Of Application State
API autodocumentadas, autoexplorables
Clientes más inteligentes / dinámicos
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
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()
.NET Core + NancyFX
http://nancyfx.org
public class SampleModule : Nancy.NancyModule
{
public SampleModule()
{
Get["/hello"] = _ => “hello world";
}
}
/helloreq res
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
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
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
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
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
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
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