Orquestração de microservices com REST
na Americanas.com
Amer
icana
s.com
Jeferson
Leão
Amer
icana
s.com
Submarin
o.com
Shoptime.c
om
Soubarato.com
Microservices
Manutenção
Escalabilidade
Inovação
O que acontece com a informação?
API d
e Clien
te
Prod
utos
API d
e Clien
te
API d
e Car
rinho
API de
Frete
Cliente
End
ereç
os
Prod
utos
Tota
l
Integração
Integração
Complexidade
APIs
Clientes
Código duplicado
Middlewares
BFFs
Roundtrips
Inte
graç
ão
3G
Brows
ers
Roundtrips
Inte
graç
ão
Concorr
ência
JS
Java
Objective C
3G
Brows
ers
Encad
eam
ento
Falhas
s
Encad
eam
ento
s
Falco
r
GraphQ
L
Modelo Único
Os dados são a API
Backend e Frontend
Linguagem de consulta
Filtragem de dados
Backend e Frontend
Linguagem de consulta
Encadeamento de chamadas
Paralelismo
Latência reduzida
http://hero.api/hero/:name
hero
Map
eam
ento
s
http://villain.api/villain/:name
villain
URLs são m
apeadas e
chamadas d
e recursos
Cons
ultas
Parale
lização
Hero
Villain
http://hero.api/hero/Restman
http://villain.api/villain/SOAPLord
APIs
JS
function loadData() {
const heroPromise = loadHero({name: "Restman"})
const villainPromise = loadVillain({name: "SOAPLord"})
return Promise.all([heroPromise, villainPromise])
.then(([hero, villain]) => ({ hero: hero,
villain: villain })
from hero
with
name =
"Restman"
from villain
with
name =
"SOAPLord"
Resposta
{ "hero": { "details": { "success": true, "status": 200 }, "result": { "id": "123", "name": "Restman", "power": 9000 } }, "villain": { "details": { "success": true, "status": 200 }, "result": {
"name": "Soap Lord", "power": 8000 } } }
Resposta
Enc
ade
ame
nto
Enc
ade
ame
nto
Hero
Sidekick
http://hero.api/hero/Restman
http://hero.api/sidekick/123
APIs
{ "id": "123", "name": "Restman", "power": 9000 }JS
function loadData() {
const heroPromise = loadHero({name: "Restman"}) const sidekickPromise = heroPromise.then(hero =>
loadSidekick({heroId: hero.id})) return Promise.all([heroPromise, sidekickPromise])
.then(([hero, sidekick]) => ({ hero: hero,
sidekick: sidekick })
from hero
with
name =
"Restman"
from sidekick
with
hero = hero.id
Iter
ação
from hero
with
name =
"Restman"
from villain
with
name =
"SOAPLord"
Iter
ação
Search
Hero
http://hero.api/search?role=hero
http://hero.api/hero/Restman
APIs
[ {"name": "Restman"} {"name": "Microservant"} {"name": "Clojurian"} ]http://hero.api/hero/Microservant
http://hero.api/hero/Clojurian
JS
function loadData() {
const searchPromise = loadSearch({role: "hero"})
const heroesPromise = searchPromise.then(search => {
const heroes = search.map(item => loadHero({name: item.name}) return Promise.all(heroes)
})
return Promise.all([searchPromise, heroesPromise]) .then(([search, heroes]) => ({
search: search, heroes: heroes }))