Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Existe Vida Além do REST?

Existe Vida Além do REST?

Construir uma API pode parecer simples. Transformar models em JSON, uma forma de autenticação e pronto, temos uma "API". O padrão REST é adotado como solução na maioria das vezes, mas, sem o conhecimento adequado, o design de uma API pode ficar confuso e despadronizado, dificultando a utilização dos usuários. Além disso, outras tecnologias fornecem soluções diferentes para problemas encontrados durante a concepção e/ou consumo de uma API. Essa talk analisa o REST e outras tecnologias com exemplos para que você entenda seus usuários e tome a decisão certa para sua API.

Ravan Scafi

March 28, 2017
Tweet

More Decks by Ravan Scafi

Other Decks in Technology

Transcript

  1. Existe vida além do
    REST ?

    View Slide

  2. GET /whoami
    Ravan Scafi
    Back-end Developer na Leroy Merlin Brasil
    Co-organizador do Meetup do Laravel SP
    @ravanscafi

    View Slide

  3. API?
    O que é uma API?

    View Slide

  4. Interface
    é um elemento que proporciona uma ligação
    física ou lógica entre dois sistemas ou partes
    de um sistema que não poderiam ser conectados
    diretamente.

    View Slide

  5. Parte 1
    Recursos vs Operações

    View Slide

  6. Quando
    Pensamos
    em APIs...

    View Slide

  7. REST
    REpresentational State Transfer

    View Slide

  8. REST
    Baseado em Endpoints
    GET /api/users/rscafi HTTP/1.1
    Host: meusite.dev

    View Slide

  9. GET /api/users/rscafi HTTP/1.1
    Host: meusite.dev
    REST
    Separado por Recursos
    (Substantivos)

    View Slide

  10. GET /api/users/rscafi HTTP/1.1
    Host: meusite.dev
    REST
    Verbos HTTP indicam a ação

    View Slide

  11. REST
    Relação
    Cliente-Servidor

    View Slide

  12. REST
    Segue convenções HTTP

    View Slide

  13. REST
    Controle por Hypermedia
    (HATEOAS - RMM)

    View Slide

  14. GET /api/users/rscafi HTTP/1.1
    Host: meusite.dev
    {
    "id": "rscafi",
    "name": "Ravan Scafi",
    "website": "http://ravan.me",
    "_links": {
    "self": {
    "href": "http://meusite.dev/api/users/rscafi"
    }
    }
    }

    View Slide

  15. REST
    Endpoints cacheáveis

    View Slide

  16. REST
    Uniforme

    View Slide

  17. REST
    Feito para durar décadas

    View Slide

  18. Problemas
    (Spoiler: Parte 1!)
    REST

    View Slide

  19. REST - Problemas
    Recomendações nem sempre são
    seguidas

    View Slide

  20. REST - Problemas
    Excesso de Roundtrips
    dependendo da operação

    View Slide

  21. REST - Problemas
    Nem sempre os Verbos HTTP
    disponíveis falam com clareza

    View Slide

  22. Exemplo - Slack
    Um usuário pode ser “kickado”, “banido”
    ou pode “deixar” um canal

    View Slide

  23. Exemplo - Slack
    DELETE /users/rscafi HTTP/1.1
    Host: api.slack.com

    View Slide

  24. Exemplo - Slack
    DELETE /users/rscafi HTTP/1.1
    Host: api.slack.com
    Content-Type: application/json
    {“status”: “kicked”}

    View Slide

  25. Exemplo - Slack
    DELETE /users/rscafi HTTP/1.1
    Host: api.slack.com
    Content-Type: application/json
    {“status”: “kicked”,
    “kick_channel”: “random”}

    View Slide

  26. Exemplo - Slack
    DELETE /channels/random/users/rscafi HTTP/1.1
    Host: api.slack.com

    View Slide

  27. Exemplo - Slack
    DELETE /channels/random/users/rscafi HTTP/1.1
    Host: api.slack.com
    Content-Type: application/json
    {“status”: “kicked”}

    View Slide

  28. REST - Problemas
    Operações “BULK”
    fogem do Padrão

    View Slide

  29. O que fazer?
    ?

    View Slide

  30. RPC
    Remote Procedure Call
    !

    View Slide

  31. RPC
    Baseado em Endpoints
    GET /api/getUser HTTP/1.1
    Host: meusite.dev
    Content-Type: application/json
    {“id”: “rscafi”}

    View Slide

  32. GET /api/getUser HTTP/1.1
    Host: meusite.dev
    Content-Type: application/json
    {“id”: “rscafi”}
    RPC
    Similar à chamada de funções

    View Slide

  33. “Equivalência” em PHP
    // definição
    function getUser ($id) {
    //
    }
    // chamada
    getUser('rscafi');

    View Slide

  34. RPC
    Popularizado pelo SOAP
    (Simple Object Access Protocol)

    View Slide

  35. SOAP - Exemplo

    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next"
    soapenv:mustUnderstand="0"
    xmlns:ns1="https://www.google.com/apis/ads/publisher/v201605">
    123456
    DfpApi-Java-2.1.0-dfp_test





    WHERE parentId IS NULL LIMIT 500




    View Slide

  36. RPC
    Porém o SOAP perdeu espaço para as
    APIs REST

    View Slide

  37. REST - Exemplo
    GET /ads?parentId=null&limit=500 HTTP/1.1
    HOST: api.example.com

    View Slide

  38. RPC
    Mas não existe somente o SOAP!

    View Slide

  39. RPC baseado em JSON - Exemplo
    POST /getAdUnitsByStatement HTTP/1.1
    HOST: api.example.com
    Content-Type: application/json
    {"filter": "WHERE parentId IS NULL LIMIT 500"}

    View Slide

  40. RPC
    Foco em Operações

    View Slide

  41. Exemplo - Slack
    POST /api/channels.kick HTTP/1.1
    Host: slack.com
    Content-Type: application/json
    {
    "token": "xxxx-xxxxxxxxx-xxxx",
    "channel": "random",
    "user": "rscafi"
    }

    View Slide

  42. RPC
    Relação entre (Micro) Serviços

    View Slide

  43. RPC
    A partir de uma Definição de serviços,
    código é gerado

    View Slide

  44. RPC
    Complexidade Abstraída

    View Slide

  45. 10.000.000.000
    de chamadas RPC
    POR SEGUNDO!
    Google

    View Slide

  46. gRPC
    Framework “universal”, open source e performático

    View Slide

  47. gRPC
    HTTP/2

    View Slide

  48. gRPC
    Protocol Buffers

    View Slide

  49. gRPC
    Linguagem de Definição de Serviços

    View Slide

  50. gRPC
    service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    message HelloRequest {
    string name = 1;
    }
    message HelloReply {
    string message = 1;
    }

    View Slide

  51. gRPC
    Gera código para as maiores
    linguagens

    View Slide

  52. gRPC
    protoc --proto_path=examples/protos \
    --php_out=examples/php \
    --grpc_out=examples/php \
    --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \
    ./examples/protos/helloworld.proto

    View Slide

  53. gRPC
    Cria stubs de Classes, onde os métodos
    correspondem a uma rota RPC

    View Slide

  54. gRPC
    $request = new Helloworld\HelloRequest();
    $request->setName($name);
    list($reply, $status) = $client->SayHello($request)->wait();
    $message = $reply->getMessage();

    View Slide

  55. Problemas
    RPC

    View Slide

  56. RPC - Problemas
    Abstrai complexidade (!)

    View Slide

  57. RPC - Problemas
    Pode complicar mais do que se não
    estivesse presente

    View Slide

  58. REST vs RPC
    Foco Complexidade Comunicação
    REST Recursos Exposta Sistemas
    RPC Operações Abstraída Serviços

    View Slide

  59. Parte 2
    Clientes

    View Slide

  60. Quem vai
    consumir esses
    dados?

    View Slide

  61. API

    View Slide

  62. API

    View Slide

  63. API

    View Slide

  64. Como evitar
    isso?

    View Slide

  65. BFF
    Backend For Frontend

    View Slide

  66. BFF
    Abordagem criada pelo SoundCloud

    View Slide

  67. BFF
    Clientes da API eram muito diferentes
    entre si

    View Slide

  68. Clientes do SoundCloud
    Web
    Mobile Parceiros

    View Slide

  69. BFF
    Cada equipe mantém uma API para
    atender às suas necessidades

    View Slide

  70. BFF
    Menos burocracia para evoluir as APIs

    View Slide

  71. API
    Monstro
    Web
    API
    Mobile
    API
    SoundCloud’ BFFs

    View Slide

  72. Problemas
    BFF

    View Slide

  73. APIs fragmentadas e em linguagens
    diferentes
    BFF - Problemas

    View Slide

  74. Código duplicado!
    BFF - Problemas

    View Slide

  75. Maior complexidade por cliente
    BFF - Problemas

    View Slide

  76. Mas e o REST?
    Então é ele o problema?

    View Slide

  77. API
    Geral
    Android
    API
    Web
    API
    iOS
    API
    Netflix’ API Gateway
    (existe o Zuul na frente, mas isso é tema pra
    outra talk)

    View Slide

  78. Até funciona,
    mas...

    View Slide

  79. Problemas
    Parte 2
    REST

    View Slide

  80. REST - Problemas
    Includes vs Endpoints
    em recursos relacionados

    View Slide

  81. REST - Problemas
    Overfetching / Underfetching

    View Slide

  82. REST - Problemas
    HATEOAS não diz nada sobre formato
    de Requisições e Respostas

    View Slide

  83. REST - Problemas
    Não possui uma Especificação formal

    View Slide

  84. REST - Problemas
    API pode rapidamente ficar gigantesca
    para atender a todos os clientes

    View Slide

  85. REST - Problemas
    É difícil evoluir os dados sem saber o
    que os clientes de fato consomem

    View Slide

  86. REST - Problemas
    Quanto mais complexa a API fica,
    menos eficaz é o Cache

    View Slide

  87. GraphQL
    Graph Query Language

    View Slide

  88. GraphQL
    Queries + Mutations + Documentação

    View Slide

  89. GraphQL
    Única rota servindo de “tunel” para as
    queries

    View Slide

  90. GraphQL
    POST /graphql HTTP/1.1
    Host: meusite.dev
    Content-Type: application/graphql
    {
    users {
    name
    }
    }

    View Slide

  91. GraphQL
    Dados da API são descritos

    View Slide

  92. GraphQL
    type User {
    name: String
    website: String
    hobbies: [Hobby]
    }

    View Slide

  93. GraphQL
    Um Request pede por dados específicos

    View Slide

  94. {
    user(name: "Ravan Scafi") {
    website,
    hobbies {
    name
    }
    }
    }

    View Slide

  95. GraphQL
    O retorno é exatamente o que foi
    requisitado

    View Slide

  96. {
    "user": {
    "website": "http://ravan.me",
    "hobbies": [
    {"name": "PHP"},
    {"name": "Viajar"}
    ]
    }
    }

    View Slide

  97. GraphiQL

    View Slide

  98. GraphQL
    Mutations enviam dados para o
    servidor

    View Slide

  99. GraphQL
    Especificação “completa” e
    documentada

    View Slide

  100. GraphQL
    Dados podem evoluir com (maior)
    facilidade

    View Slide

  101. Problemas
    (achou que tinha bala de prata?)
    GraphQL

    View Slide

  102. GraphQL - Problemas
    Técnicas de cache são difíceis

    View Slide

  103. GraphQL - Problemas
    Implementação pode ser complexa

    View Slide

  104. GraphQL - Problemas
    Próprias (e novas) convenções

    View Slide

  105. GraphQL - Problemas
    Upload de arquivos é “hacky”

    View Slide

  106. REST vs GraphQL
    Foco Implementação Clientes Cache
    REST Resiliência Evolutiva Parecidos Robusto
    GraphQL Performance
    Deve atender a
    especificação
    Diferentes Difícil

    View Slide

  107. Conclusões

    View Slide

  108. REST
    Atende bem em CRUDs e onde as
    convenções HTTP possam ser aplicadas.

    View Slide

  109. RPC
    Atende bem entre serviços e quando o
    foco é em operações.

    View Slide

  110. GraphQL
    Garante performance de Clientes e
    permite evolução mais rápida.

    View Slide

  111. Dicas de Ouro

    View Slide

  112. Você pode
    usar mais de
    uma solução!

    View Slide

  113. (mas Por favor,
    não na mesma
    API)

    View Slide

  114. Versionamento é
    sempre difícil

    View Slide

  115. Não existe bala de
    prata.

    View Slide

  116. Entenda seus
    dados e seus
    Usuários/Clientes

    View Slide

  117. Empatia
    é a chave

    View Slide

  118. Empatia
    é a capacidade de se identificar com outra
    pessoa, de sentir o que ela sente, de querer o
    que ela quer, de apreender do modo como ela
    apreende etc.

    View Slide

  119. Obrigado!
    @ravanscafi

    View Slide

  120. Estamos Contratando!
    Dev BackEnd, Dev FrontEnd, DevOps
    [email protected]

    View Slide

  121. Agradecimentos
    Agradecimentos especiais a todos do SlidesCarnival que
    fizeram e disponibilizaram o template da apresentação
    gratuitamente.

    View Slide