Graphql - o que é, onde e porque usar?

PaulaSantana12 259 views 36 slides May 05, 2019
Slide 1
Slide 1 of 36
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36

About This Presentation

Entendendo o Graphql e seu uso, utilizando um servidor Java como exemplo.


Slide Content

GraphQl O que é, onde e porque usar? ‹#› PHP C++ JAVA HTML

Agenda Definição Problema Pontos importantes Estrutura Implementação O que ninguém fala Conclusão ‹#›

My name is Paula

Porque estamos vendo este tema?

‹#›

‹#› Definição

GraphQL é uma linguagem de consulta para APIs e um tempo de execução para atender essas consultas com seus dados existentes. ‹#›

História O Facebook começou um projeto interno com o intuito de resolver o problema de do feed de notícias, que antes é renderizado em HTML e eles tinham o desafio de construir nativamente no IOS, porém se debateram com a quantidade de dados que eram relacionadas a esta área da aplicação, daí surgiu o GraphQL, que em 2015 foi anunciado na RubyConf e disponibilizado para a comunidade. ‹#›

Especificação Hoje o GraphQl é um especificação, ou seja, outros projetos como o Falcor da Netflix seguem este mesmo modelo. O público-alvo desta especificação não é o desenvolvedor do cliente, mas aqueles que têm ou estão ativamente interessados ​​em construir suas próprias implementações e ferramentas GraphQL. ‹#›

O que não é… Não está vinculado a nenhum banco de dados ou mecanismo de armazenamento específico.

‹#› Problema

‹#› Microserviços UX Rest Mobile

Under-fetching Múltiplas chamadas que o cliente tem que fazer para montar uma experiência para o usuário, isso se resume em várias idas e voltas no servidor(round trips) para se ter os dados necessários. /ofertas /preferencias /produtos/{id} /produtos/{id}/ofertas

Over-Fetching Recebimento de dados desnecessários para um contexto do cliente. { "type": { "color": "#808080", "order": 0, "name": "Blackout", "description": "No production deployments during this blackout period", "ghostedDate": 0, "id": "00000000-0000-1100-0000-000000000011", "version": 0, "dateCreated": 0 }, "startDate": 1413384452, "endDate": 1413394452, "isOneDay": false, "releases": [], "description": "Optional description", "name": "Example event", "id": "4f47d1fe-f25a-4f9e-a91a-c8fb0668e99a", "version": 0, "dateCreated": 1421692929323 }

Versionamento e manutenção de API Necessidade de cada cliente, aparece a necessidade de modificação dos recursos oferecidos, isso requer versionamento e gestão dos recursos existentes e novos.

Falta de independência entre front e backend Front-end sempre fica dependendo do backend para evoluir a experiência visual das aplicações.

Payload Problemas com payloads em plataformas mobile visto que muitos clientes acabam usando aplicativos mobile e com internet muitas vezes bem limitada, afetando a experiência e melhoria no consumo da banda da aplicação .

Alternativa Rotas específicas por URL : ainda teria a questão da dependência, quando sua experiência mudar o serviço rest deverá ser alterado também. Isso considerando que você terá rotas específicas para cada cliente de cada view, nem sempre uma aplicação web e mobile tem os mesmos dados para a mesma tela, isso gera duplicidade que por sua vez gera mais dificuldades na hora de dar manutenção.

‹#› Pontos Importantes

O que temos? Único endpoint Fortemente tipado o cliente obtém os dados que realmente vai utilizar

Quem utiliza? Airbnb, Atlassian, Audi, CNBC, GitHub, Major League Soccer, Netflix, Shopify, The New York Times, Twitter, Pinterest, etc.. ‹#› https://graphql.org/users/

Querys Mutations Types Schemas ‹#›

Type ‹#› tipo Starship { id : ID ! nome : String ! length ( unidade : LengthUnit = METER ) : Float } Int : Um inteiro de 32 bits assinado. Float : Um valor de ponto flutuante de precisão dupla assinado. String : Uma seqüência de caracteres UTF-8. Boolean : true Ou false . ID : O tipo escalar de ID representa um identificador exclusivo

Query e Mutation type Query { recentPosts(count: Int, offset: Int): [Post]! } type Mutation { writePost(title: String!, text: String!, category: String) : Post! }

‹#› Implementação

1 <dependency> <groupId>com.graphql-java</groupId> <artifactId> graphql-spring-boot-starter </artifactId> <version>5.0.2</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId> graphql-java-tools </artifactId> <version>5.2.4</version> </dependency>

type Post { id: ID! title: String! text: String! category: String author: Author! } type Author { id: ID! name: String! thumbnail: String posts: [Post]! } # The Root Query for the application type Query { recentPosts(count: Int, offset: Int): [Post]! } # The Root Mutation for the application type Mutation { writePost(title: String!, text: String!, category: String) : Post! } Salvar : Onde -> /resources Como -> .graphqls

Type Query Beans GraphQLQueryResolver GraphQLMutationResolver Mutation

Query <campo> is<campo> – type Boolean get<campo> public List<Oferta> getObterOfertas() { return ofertasRepository.findAll(); }

‹#›

‹#› O que ninguém fala

CASE Client - server Cache com Apolo Versionamento tão complexo quanto com REST Certeza 1 - atrapalha o desenvolvimento mobile Certeza 2 - melhora a experiência do cliente Ubiratran Soares ‹#›

Pontos de atenção I mplementar um cache simplificado com o GraphQL é mais complexo do que implementá-lo no REST. Limitação dos recursos Governança ‹#›

“Com grandes poderes vem grandes responsabilidades”

‹#›

Thanks! Any questions? /paula-macedo-santana-dev @ psanrosa13 psanrosa13/demographql