Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Orquestração de microservices com RESTna Americanas.com
Americanas.com
Submarino.com
JefersonLeão
Americanas.com
Submarino.com
Shoptime.com
Soubarato.com
Microservices
ManutençãoEscalabilidade
Inovação
O que acontece com a informação?
API de ClienteProdutos
API de Cliente
API de Carrinho
API de Frete
Cliente
EndereçosProdutos Total
Entregas
Integração
A B C
Integração
Complexidade
APIs Clientes
Código duplicado
MiddlewaresBFFs
RoundtripsIntegração 3GBrowsers
RoundtripsIntegração
Concorrência
JS
Java
Objective C
3GBrowsers
Encadeamentos
Falhas
Encadeamentos
Hackathon
Falcor GraphQL
Modelo ÚnicoOs dados são a APIBackend e Frontend
Linguagem de consultaFiltragem de dadosBackend e Frontend
Olhando para fora
Linguagem de consulta
Encadeamento de chamadas
ParalelismoLatência reduzida
Pragmatismo
A B C
http://hero.api/hero/:name hero
Mapeamentos
http://villain.api/villain/:name villain
URLs são mapeadas echamadas de recursos
chamadas de recursos
Consultas
Paralelização
ParalelizaçãoHero
Villainhttp://hero.api/hero/Restman
http://villain.api/villain/SOAPLord
APIs
JSfunction 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
Encadeamento
Encadeamento
Hero
Sidekick
http://hero.api/hero/Restman
http://hero.api/sidekick/123
APIs
{ "id": "123", "name": "Restman", "power": 9000}
JSfunction 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
Iteração
from hero with name = "Restman"
from villain with name = "SOAPLord"
Iteração
Search
Herohttp://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
JSfunction 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 }))
}
from search with role = "hero"
from hero as heroes with name = search.results.name
Lista deParâmetros
Hero
Battle
http://hero.api/hero/Restman
http://battle.api/battle?skill=Semantic&skill=Http&skill=Innovation
APIs
{ "name": "Restman", "skills": [ {"name": "Semantic"}, {"name": "Http"} {"name": "Innovation"} ]}
Lista deParâmetros
from hero with name = "restQL Master"
from battle as combat with skills = hero.skills -> flatten
Parâmetros
de lista
Parâde lis
ta
from heroes as hero with name = "restQL Master" only skills, name, archEnemy
Filtragem
E quando uma chamada falha?
Filtragem
APIs
E quando uma chamada falha?
AB
C D
Encadeamentos
200 OK
A B
C D
from heroes as hero with name = "$name"
Variáveis
Variáveis
http://restql.server/run-query
Base URL
Namespace
Nome daconsulta
Versionamento
/heroes /1/by-name
Namespace
Nome daconsulta
Variáveis
Versionamento
/heroes /1/by-name... ?name=Restman
PersistênciaVersionamento
Organização
MongoDB
O restQL gera
pouquíssima
carga no banco
carga no banco
Performance
HttpKit
Clojure
Servidor Assíncrono
O restQL suporta mais carga que as
APIs que consulta
core.async
ExtensibilidadeSistema de plugins
InstrumentaçãoEncoders
Pragmatismo
SimplificaçãoRobustez
Production Ready
Obrigado
Perguntas?
/B2W-BIT/restQL-server
http://restql.b2w.io