O GraphQL dá bastante poder ao cliente.
Isso é especialmente útil quando a equipe que
implementa
o cliente é totalmente separada da que implementa o servidor. Mas há casos mais simples,
em que as
equipes do cliente e servidor trabalham juntas. Então, não haveria tanta dificuldade em
manter uma API
RESTful customizada para o cliente.
Poderíamos buscar outros dados da API do GitHub: o número de issues abertas, a data da
última
release, informações sobre o último commit, etc.
Uma coisa é certa: com uma consulta GraphQL, eu faria menos requisições e receberia
menos dados
desnecessários. Mais flexibilidade e mais eficiência.
Considerando o Modelo de Maturidade de Richardson, podemos considerar que o GraphQL
está no
Nível 0:
não diferentes recursos, apenas uma URI como ponto de entrada para toda a API GraphQL
não há a ideia de diferentes verbos HTTP, só é usado POST
não há diferentes representações, apenas um JSON que contém uma estrutura GraphQL
A Netflix lançou como parte de sua iniciativa open-source o Ribbon, um Client Side Load
Balancer
integrado com outras ferramentas do Netflix OSS.
Uma das necessidades do Ribbon é saber o IP ou DNS name das instâncias de um
determinado
serviço. Isso pode ser feito por uma configuração estática (
ConfigurationBasedServerList ), ou de
maneira dinâmica, de modo a remover, de tempos em tempos, instâncias indisponíveis e
adicionar novas
instâncias ( DiscoveryEnabledNIWSServerList ). Nesse capítulo, focaremos na
configuração estática.
Em um capítulo posterior, estudaremos a configuração dinâmica da lista de instâncias.
O Ribbon possui diferentes rules, que são lógicas de escolha de uma instância da lista.
Entre elas:
RoundRobinRule : usa o algoritmo round robin, que rotaciona a lista de instâncias,
alternando
sequencialmente entre as instâncias disponíveis. É o algoritmo padrão. Se tivermos 3
instâncias, as
chamadas seriam à primeira, à segunda e à terceira, e então à primeira novamente, e assim
por
diante.
AvailabilityFilteringRule : um algoritmo que pula as instâncias indisponíveis. Por
padrão,
uma instância é considerada indisponível se há falha em 3 conexões consecutivas. Depois
de 30
segundos, há nova tentativa de conexão. Se houver falha nas novas tentativas, há um
aumento
exponencial do tempo de espera. Todos esses valores são configuráveis.
WeightedResponseTimeRule : é coletado o tempo de resposta de cada instância. Quanto
maior o
tempo de resposta, menor a probabilidade da instância ser obtida da lista.
Além disso, o Ribbon mantém estatísticas da latência e frequência de falha de cada
instância.
No livro Microservice Patterns (RICHARDSON, 2018a), Chris Richardson recomenda usar
um
Microservice Chassis, um framework ou coleção de frameworks, para implementar
questões transversais
às funcionalidades da aplicação.
Mas, para Richardson, um obstáculo é que frameworks são restritos a uma plataforma
específica. É
possível usar Spring Boot e Spring Cloud em aplicações escritas em Java ou Kotlin (e talvez
em outras
linguagens da JVM). Mas se alguns serviços forem escritos em Go, Elixir ou NodeJS,
precisaremos de
Microservices Chassis específicos.
Uma alternativa emergente identificada por Chris Richardson é implementar essas
preocupações
transversais na própria infraestrutura de redes, mediando tanto a comunicação entre os
serviços como as
requisições de clientes externos: é um Service Mesh.