De um sistema legado
para microsserviços
com GraphQL
Sebastian Ferrari
sebas@taller.net.br
@sebas5384
Momentum (do inglês)
● Momento linear na física.
● Impulso, ímpeto ou velocidade adquirida.
Microservices
Momentum
Motivo ?
Legacy System
Proxy
● Migração de sistemas legados monólitos.
● Mudanças são lentas, custosas e com alto risco.
● Baixíssima experimentação.
● Tecnologias antigas, dificulta contratação de
novos talentos.
● Tecnologias proprietárias com licenças, vendor
lock-in, customização lenta e custosa…
Novos problemas
● Baixa interoperabilidade entre os serviços e
seus consumidores / clients.
○ Padrões abertos e bem definidos.
○ Ontologia é um modelo de dados que
representa um conjunto de conceitos
dentro de um domínio e os
relacionamentos entre estes.
● Muito esforço para criar documentação e
manter atualizada!
● Resposta dos serviços não é tolerante a falhas.
● Relação entre recursos/models inconsistente.
● Começa com 1 serviço e rapidamente vai para
mais de 20.
● A complexidade aumenta.
GraphQL
Schema language
type Project {
name: String
tagline: String
contributors: [User]
}
type User {
name: String
projects: [Project]
}
type Query {
users: [User]
}
Query language
query {
users {
name
projects {
name
tagLine
}
}
}
Result
{
users: [{
name: 'Sebastian McKenzie',
projects: [{
name: 'Babel',
tagLine: 'Use next generation...'
}]
}, {
name: 'Sashko Stubailo',
projects: [{
name: 'Apollo Client',
tagLine: 'A fully-featured, production ready...'
}]
}]
}
types.gql
type User {
id: String
name: String
}
type Query {
user (id: String): User
}
Apollo
resolvers.js
const resolvers = {
Query: {
user: (root, { id }) =>
fetch(`/api/users/${id}`)
}
}
export default resolvers
Johnny Cash
React Apollo
react-apollo
import { withQuery } from '@apollo/react-hoc'
import gql from 'graphql-tag'
const UserAvatar = ({ data: { user } }) => (
<div>
<img src={ user.photo } alt={ user.name } />
<h4>{ user.name }</h4>
</div>
)
const query = gql`
query UserInfo {
user (id: '1') {
name
photo
}
}
`
const withData = withQuery(query)
export default withData(UserAvatar)
Conectar o uma GraphQL query a um
componente.
Por que
GraphQL ?
● Pensamento grafo !! mais do que recursos.
● Tipagem estática.
○ Documentação automática.
○ Erros de validação de graça.
● Tolerante a falha. Um campo pode falhar, mas o
resto da resposta é resolvida.
● Monitoração de performance por campo, não
só por query ou request.
● Query Declarativa de vários serviços
● Cada campo / “resolver” é independente.
● Linguagem ubíqua onde os domínios de
negócio usam a o mesmo idioma para se
comunicar com a área técnica. (DDD)
● Adoção progressiva + thin layer
● Application Layer (DDD Eric Evans) ou Service
Layer (Martin Fowler)
Legacy System
GraphQL Gateway
Microservices
Domain Layer
Business Logic
bit.ly/2tKxYxI
Legacy System
Backend for Frontends (BFF)
Microservices
Domain Layer
Business Logic
● Aumento na performance do client, menos
round trips.
○ /user/1 -> /user/1/comments -> …
● Menos código no client !!
● Mudanças mais rápidas sem quebrar clients,
com detecção de breaking changes no build.
● API evolutiva, não revolucionária com v1 v2…
○ uglyField
@deprecated(reason: “Use other new field")
Developer
Experience (DX)
Quem usa em produção?
Agregação de
schemas (APIs)
- Stitching e Delegation
- Apollo Federation
- API’s Fractais
Antes
Depois
Account Product Review
Review
Service
De um sistema legado para micro serviços com GraphQL
De um sistema legado para micro serviços com GraphQL

De um sistema legado para micro serviços com GraphQL

  • 1.
    De um sistemalegado para microsserviços com GraphQL Sebastian Ferrari sebas@taller.net.br @sebas5384
  • 2.
    Momentum (do inglês) ●Momento linear na física. ● Impulso, ímpeto ou velocidade adquirida.
  • 3.
  • 4.
  • 5.
  • 6.
    ● Migração desistemas legados monólitos. ● Mudanças são lentas, custosas e com alto risco. ● Baixíssima experimentação. ● Tecnologias antigas, dificulta contratação de novos talentos. ● Tecnologias proprietárias com licenças, vendor lock-in, customização lenta e custosa…
  • 7.
  • 10.
    ● Baixa interoperabilidadeentre os serviços e seus consumidores / clients. ○ Padrões abertos e bem definidos. ○ Ontologia é um modelo de dados que representa um conjunto de conceitos dentro de um domínio e os relacionamentos entre estes.
  • 11.
    ● Muito esforçopara criar documentação e manter atualizada! ● Resposta dos serviços não é tolerante a falhas. ● Relação entre recursos/models inconsistente. ● Começa com 1 serviço e rapidamente vai para mais de 20. ● A complexidade aumenta.
  • 14.
    GraphQL Schema language type Project{ name: String tagline: String contributors: [User] } type User { name: String projects: [Project] } type Query { users: [User] } Query language query { users { name projects { name tagLine } } } Result { users: [{ name: 'Sebastian McKenzie', projects: [{ name: 'Babel', tagLine: 'Use next generation...' }] }, { name: 'Sashko Stubailo', projects: [{ name: 'Apollo Client', tagLine: 'A fully-featured, production ready...' }] }] }
  • 15.
    types.gql type User { id:String name: String } type Query { user (id: String): User } Apollo resolvers.js const resolvers = { Query: { user: (root, { id }) => fetch(`/api/users/${id}`) } } export default resolvers
  • 16.
  • 17.
    React Apollo react-apollo import {withQuery } from '@apollo/react-hoc' import gql from 'graphql-tag' const UserAvatar = ({ data: { user } }) => ( <div> <img src={ user.photo } alt={ user.name } /> <h4>{ user.name }</h4> </div> ) const query = gql` query UserInfo { user (id: '1') { name photo } } ` const withData = withQuery(query) export default withData(UserAvatar) Conectar o uma GraphQL query a um componente.
  • 18.
  • 19.
    ● Pensamento grafo!! mais do que recursos. ● Tipagem estática. ○ Documentação automática. ○ Erros de validação de graça. ● Tolerante a falha. Um campo pode falhar, mas o resto da resposta é resolvida. ● Monitoração de performance por campo, não só por query ou request.
  • 21.
    ● Query Declarativade vários serviços ● Cada campo / “resolver” é independente. ● Linguagem ubíqua onde os domínios de negócio usam a o mesmo idioma para se comunicar com a área técnica. (DDD) ● Adoção progressiva + thin layer ● Application Layer (DDD Eric Evans) ou Service Layer (Martin Fowler)
  • 22.
  • 23.
  • 24.
    Legacy System Backend forFrontends (BFF) Microservices Domain Layer Business Logic
  • 25.
    ● Aumento naperformance do client, menos round trips. ○ /user/1 -> /user/1/comments -> … ● Menos código no client !! ● Mudanças mais rápidas sem quebrar clients, com detecção de breaking changes no build. ● API evolutiva, não revolucionária com v1 v2… ○ uglyField @deprecated(reason: “Use other new field")
  • 28.
  • 32.
    Quem usa emprodução?
  • 33.
    Agregação de schemas (APIs) -Stitching e Delegation - Apollo Federation - API’s Fractais
  • 36.
  • 37.
  • 39.
  • 40.