• Nenhum resultado encontrado

Orquestração de microservices com REST na Americanas.com

N/A
N/A
Protected

Academic year: 2021

Share "Orquestração de microservices com REST na Americanas.com"

Copied!
38
0
0

Texto

(1)

Orquestração de microservices com REST

na Americanas.com

Amer

icana

s.com

(2)

Jeferson

Leão

Amer

icana

s.com

Submarin

o.com

Shoptime.c

om

Soubarato.com

(3)

Microservices

Manutenção

Escalabilidade

Inovação

O que acontece com a informação?

API d

e Clien

te

Prod

utos

(4)

API d

e Clien

te

API d

e Car

rinho

API de

Frete

Cliente

End

ereç

os

Prod

utos

Tota

l

(5)

Integração

(6)

Integração

Complexidade

APIs

Clientes

Código duplicado

Middlewares

BFFs

Roundtrips

Inte

graç

ão

3G

Brows

ers

(7)

Roundtrips

Inte

graç

ão

Concorr

ência

JS

Java

Objective C

3G

Brows

ers

Encad

eam

ento

Falhas

s

(8)

Encad

eam

ento

s

(9)

Falco

r

GraphQ

L

Modelo Único

Os dados são a API

Backend e Frontend

Linguagem de consulta

Filtragem de dados

Backend e Frontend

(10)

Linguagem de consulta

Encadeamento de chamadas

Paralelismo

Latência reduzida

(11)
(12)

http://hero.api/hero/:name

hero

Map

eam

ento

s

http://villain.api/villain/:name

villain

URLs são m

apeadas e

(13)

chamadas d

e recursos

Cons

ultas

(14)

Parale

lização

Hero

Villain

http://hero.api/hero/Restman

http://villain.api/villain/SOAPLord

APIs

(15)

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 })

(16)

from hero

with

name =

"Restman"

from villain

with

name =

"SOAPLord"

Resposta

(17)

{ "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

(18)

Enc

ade

ame

nto

Hero

Sidekick

http://hero.api/hero/Restman

http://hero.api/sidekick/123

APIs

{ "id": "123", "name": "Restman", "power": 9000 }

(19)

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 })

(20)

from hero

with

name =

"Restman"

from sidekick

with

hero = hero.id

(21)

Iter

ação

from hero

with

name =

"Restman"

from villain

with

name =

"SOAPLord"

(22)

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

(23)

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 }))

(24)

from search

with

role =

"hero"

from hero as heroes

with

name = search.results.name

Lista de

Parâmetros

(25)

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 de

Parâmetros

(26)

from hero

with

name

=

"restQL Master"

from battle

as

combat

with

skills

= hero.skills -> flatten

Par

âmetr

os

de lista

(27)

Par

â

de lista

from

heroes

as

hero

with

name =

"restQL Master"

only

skills,

name,

archEnemy

Filtr

age

m

E qu

and

o um

a ch

ama

da f

alha

?

(28)

Filtr

age

m

APIs

E qu

and

o um

a ch

ama

da f

alha

?

A

B

C

D

(29)

Encadeamentos

200 OK

A

B

(30)

from

heroes

as

hero

with

name =

"$name"

Var

iáv

(31)

Var

iáv

eis

http://restql.server/run-query

Base URL

Namespace

Nome da

consulta

Versionamento

/heroes

/by-name

/1

(32)

Namespace

Nome da

consulta

Variáveis

Versionamento

/heroes

/by-name

/1

...

?name=Restman

(33)

Persistência

Versionamento

Organização

MongoDB

O restQL

gera

pouquíss

ima

carga no

banco

(34)

carga no

banco

Performance

HttpKit

Clojure

Servidor Assíncrono

O restQ

L supor

ta ma

is carg

a que

as

APIs q

ue con

sulta

core.async

(35)

Extensibilidade

Sistema de plugins

Instrumentação

(36)

Pragmat

ismo

Simplificação

Robuste

z

Produ

(37)
(38)

Perguntas?

/B2W-BIT/restQL-server

Referências

Documentos relacionados

Quando água pura e uma solução de glicose são colocadas em um frasco separados por uma membrana semipermeável (permeável apenas para o solvente), temos que esta membrana permite a

de empresas em dificuldade Crédito Fiscal Extraordinário ao Investimento II Dedução de prejuízos fiscais Adicional de solidariedade sobre o sector

 Compreender a importância do domínio das técnicas da escrita para a produção de uma informação de qualidade e saber aplica-las às especificidades dos diferentes géneros

A seqüência analítica • Definição do problema • Escolha do método • Amostragem • Pré-tratamento da amostra • Medida • Calibração • Avaliação •

O desenvolvimento das interações entre os próprios alunos e entre estes e as professoras, juntamente com o reconhecimento da singularidade dos conhecimentos

Todo ser humano é único e, por isso, toda sala de aula é um berço de diversidade. O que os sistemas educacionais fizeram ao longo dos tempos foi homogeneizar o sistema educacional

O profissional de saúde, em particular o médico, possui a tendência de se deixar dominar pelos aspectos concretos e objetivos da ciência. Resultados obtidos por ensaios clínicos

Norte Magnético e Geográfico O ângulo formado entre os dois meridianos, geográfico e magnético, chama-se declinação magnética, que é ocidental quando contada do meridiano