Bonjour, Habr!
Le
livre d' Alex Banks et Eva Porsello, que nous avons donnĂ© Ă la traduction il y a quelques jours, vous servira de brĂšve digression dans le langage de requĂȘte GraphQL. Le livre des mĂȘmes auteurs sur
React et Redux est devenu un véritable best-seller (nous attendons le 5Úme tirage de l'imprimerie). Soit dit en passant, merci à tous ceux qui nous ont signalé des inexactitudes dans le code et les termes;) nous avons fait le livre sur une technologie si rapidement obsolÚte trop rapidement.
L'auteur de l'article d'aujourd'hui, Robin Viruch, travaille également sur un livre sur GraphQL et les bibliothÚques pour ce langage, et dans l'article d'aujourd'hui explique briÚvement les avantages et les caractéristiques de GraphQL comme alternative à REST

Lorsqu'il s'agit de requĂȘtes rĂ©seau entre les applications client et serveur, REST est le plus souvent choisi comme pont entre les mondes client et serveur. Dans REST, tout se dĂ©veloppe autour de l'idĂ©e «nous avons besoin de ressources accessibles par URL». Vous pouvez lire une ressource Ă l'aide d'une
HTTP GET
, créer une ressource à l'aide d'une demande
HTTP POST
, la mettre Ă jour et la supprimer Ă l'aide
HTTP PUT
demandes
HTTP PUT
et
DELETE
. Ces opĂ©rations sont appelĂ©es CRUD (CrĂ©er, Lire, Mettre Ă jour, Supprimer). La ressource peut ĂȘtre tout contenu reçu des auteurs, des utilisateurs ou extrait d'articles. Lorsque vous utilisez REST, le format de transfert de donnĂ©es n'est pas codĂ© en dur, mais le plus souvent JSON est utilisĂ© Ă cet effet. Au final, REST permet la communication entre les applications via le protocole HTTP normal en utilisant des URL et des mĂ©thodes HTTP.
Bien que REST soit restĂ© un standard de facto pendant un certain temps, une autre technologie dĂ©veloppĂ©e par Facebook a gagnĂ© en popularitĂ© ces derniĂšres annĂ©es: elle s'appelle GraphQL. Cet article, une introduction Ă GraphQL, parle des avantages et des inconvĂ©nients de ce langage de requĂȘte.
Qu'est-ce que GraphQL?Avant de plonger dans la discussion sur les forces et les faiblesses de GraphQL, répondons d'abord à la question suivante: qu'est-ce que GraphQL? GraphQL est un
langage de requĂȘte freeware créé par Facebook en 2012. Avant mĂȘme de soumettre le produit Ă l'open source, la langue Ă©tait dĂ©jĂ utilisĂ©e sur Facebook comme technologie interne pour travailler avec des applications mobiles. Pourquoi avec des applications mobiles? GraphQL a Ă©tĂ© dĂ©veloppĂ© comme une alternative Ă l'architecture REST typique. Il permet au client de demander uniquement les donnĂ©es souhaitĂ©es - ni plus, ni moins. Le client est responsable de tout, c'est-Ă -dire de vous. Dans ce cas, des difficultĂ©s surviennent dans l'architecture REST, car c'est l'interface de base de donnĂ©es qui dĂ©termine les informations qui seront disponibles pour chaque ressource Ă chaque URL. L'Ă©chantillonnage des donnĂ©es n'est pas demandĂ© dans la partie client. Par consĂ©quent, le frontend doit dans tous les cas demander toutes les informations sur la ressource, mĂȘme s'il n'a besoin que d'une partie de ces donnĂ©es. Ce problĂšme est appelĂ© «rééchantillonnage». Dans le pire des cas, l'application cliente doit lire non seulement une, mais plusieurs ressources, pour l'accĂšs auquel il est nĂ©cessaire d'effectuer de nombreuses requĂȘtes rĂ©seau. Cela conduit non seulement Ă un rééchantillonnage, mais Ă©galement Ă des demandes de type avalanche sur le rĂ©seau. Cependant, ayant un langage de requĂȘte tel que GraphQL, utilisĂ© non seulement sur le serveur, mais aussi sur le cĂŽtĂ© client, le client dĂ©cide des donnĂ©es dont il a besoin - et pour cela envoie une seule demande au serveur. Lorsque Facebook a dĂ©veloppĂ© des applications mobiles en utilisant le langage GraphQL, il a Ă©tĂ© possible de rĂ©duire considĂ©rablement la charge du rĂ©seau, car beaucoup moins de donnĂ©es ont commencĂ© Ă ĂȘtre transmises via celui-ci.
Facebook a publié la spécification GraphQL et son implémentation de référence en JavaScript pour un accÚs gratuit. Depuis lors, cette spécification a été implémentée dans de nombreux autres langages de programmation majeurs. De plus, l'écosystÚme qui s'est développé autour de GraphQL se développe non seulement horizontalement, se propageant à d'autres langages de programmation, mais aussi verticalement (les bibliothÚques sont construites au-dessus de GraphQL, par exemple, Apollo, Relay).
GraphQL fournit les types d'opĂ©rations suivants: demande (lecture), modification (Ă©criture) ou abonnement (lecture continue). Chacune de ces opĂ©rations n'est qu'une chaĂźne qui doit ĂȘtre assemblĂ©e conformĂ©ment aux spĂ©cifications du langage de requĂȘte GraphQL. Une fois qu'une telle opĂ©ration GraphQL arrive dans l'application de base de donnĂ©es Ă partir de l'application cliente, elle peut ĂȘtre interprĂ©tĂ©e en comparaison avec l'ensemble du schĂ©ma GraphQL situĂ© sur le backend et rĂ©solue pour l'application cliente Ă l'aide des donnĂ©es disponibles. GraphQL fonctionne aussi bien avec n'importe quelle couche rĂ©seau (qui est souvent organisĂ©e via HTTP), qu'avec n'importe quel format de charge utile (souvent JSON). Il est Ă©galement totalement «non concerné» par l'architecture de l'application (qui dans la plupart des cas se compose de la partie client et de l'interface de base de donnĂ©es). C'est juste un langage de requĂȘte.
Comme vous pouvez le voir, la requĂȘte s'applique dĂ©jĂ Ă de nombreuses ressources (auteur, article), appelĂ©es champs dans GraphQL, et uniquement Ă un ensemble spĂ©cifique de champs imbriquĂ©s pour ces champs (nom, urlSlug pour l'article), bien que d'autres donnĂ©es puissent ĂȘtre fournies dans le schĂ©ma de donnĂ©es GraphQL lui-mĂȘme Informations (par exemple, pour un article - une description, la date de sortie). Alors que dans une architecture REST, nous aurions besoin d'au moins deux requĂȘtes en cascade pour rĂ©cupĂ©rer l'auteur et les articles de cet auteur, GraphQL rĂ©sout ce problĂšme en une seule requĂȘte. En outre, la requĂȘte sĂ©lectionne uniquement les champs nĂ©cessaires et non l'entitĂ© entiĂšre.
C'est l'essence de GraphQL. Dans le cas oĂč l'application serveur fournit le schĂ©ma GraphQL dans lequel elle dĂ©finit toutes les donnĂ©es disponibles avec sa hiĂ©rarchie et ses types, l'application cliente ne demande que les donnĂ©es dont elle a besoin.
Avantages GraphQLVoici les principaux avantages de l'utilisation de GraphQL dans une application.
Ăchantillonnage dĂ©claratif des donnĂ©esComme vous pouvez le voir, GraphQL utilise l'Ă©chantillonnage dĂ©claratif des donnĂ©es dans ses requĂȘtes. Le client sĂ©lectionne les donnĂ©es, ses entitĂ©s et tous les champs entre lesquels il existe diffĂ©rentes relations, et pour tout cela une seule demande est appliquĂ©e. Le client dĂ©cide quels champs sont nĂ©cessaires pour cette interface utilisateur. Souvent, vous pouvez presque parler d'Ă©chantillonnage de donnĂ©es orientĂ© interface utilisateur. Par exemple, c'est ainsi qu'Airbnb utilise GraphQL. Un moteur de recherche Airbnb fournit souvent des rĂ©sultats pour les maisons, les impressions et d'autres catĂ©gories spĂ©cifiques Ă un sujet donnĂ©. Pour extraire toutes les donnĂ©es en une seule fois, une requĂȘte GraphQL est exĂ©cutĂ©e, ne rĂ©cupĂ©rant que les informations qui sont dĂ©finitivement nĂ©cessaires dans une interface utilisateur particuliĂšre. Au final, la rĂ©partition des responsabilitĂ©s est parfaitement organisĂ©e dans GraphQL: le client connaĂźt les exigences en matiĂšre de donnĂ©es, le serveur connaĂźt la structure des donnĂ©es et comment rĂ©soudre les donnĂ©es Ă partir d'une source existante (que ce soit une base de donnĂ©es, un microservice, une API tierce).
Pas de rééchantillonnage lorsque vous travaillez avec GraphQLLorsque vous travaillez avec GraphQL, il n'y a pas de resĂ©lection. Alors qu'un client mobile est susceptible de frapper une nouvelle rĂ©cupĂ©ration en utilisant la mĂȘme API qu'un client Web avec une API REST. Et lorsque vous travaillez avec GraphQL, le client mobile et le client Web peuvent choisir diffĂ©rents groupes de champs pour eux-mĂȘmes, en utilisant la mĂȘme API GraphQL. Par consĂ©quent, le client mobile peut sĂ©lectionner moins d'informations, car des informations inutiles peuvent ne pas ĂȘtre nĂ©cessaires sur le petit Ă©cran (contrairement au grand Ă©cran Ă partir duquel la version Web de l'application est visualisĂ©e). GraphQL minimise la quantitĂ© de donnĂ©es transmises sur le rĂ©seau, en les sĂ©lectionnant de maniĂšre sĂ©lective et en Ă©tant guidĂ© dans ce cas principalement par les besoins de l'application cliente.
GraphQL pour React, Angular, Node, etc.GraphQL est une solution prometteuse non seulement pour les dĂ©veloppeurs React. Que ce soit Facebook qui l'emporte sur GraphQL, et cĂŽtĂ© client, Facebook utilise React, en fait, ce langage n'est liĂ© Ă aucune solution pour le frontend ou le backend. L'implĂ©mentation de rĂ©fĂ©rence de GraphQL est Ă©crite en JavaScript, afin que GraphQL puisse ĂȘtre combinĂ© avec Angular, Vue, Express, Hapi, Koa et d'autres bibliothĂšques JavaScript dans les parties client et serveur. De plus, cela ne s'applique pas seulement Ă l'Ă©cosystĂšme JavaScript. GraphQL imite REST sous un aspect, grĂące auquel il est devenu populaire: l'interface GraphQL est indĂ©pendante du langage de programmation (langage de requĂȘte) utilisĂ© pour communiquer deux objets (par exemple, client et serveur). Par consĂ©quent, sa spĂ©cification peut ĂȘtre reproduite dans n'importe quel langage de programmation.
Qui utilise GraphQL?Facebook utilise GraphQL depuis 2012, avant que ce langage ne devienne open source. Facebook est le moteur qui est responsable du dĂ©veloppement de la spĂ©cification GraphQL et de son implĂ©mentation de rĂ©fĂ©rence en JavaScript. Donc, en travaillant avec GraphQL, vous ĂȘtes dĂ©jĂ sur les Ă©paules de gĂ©ants. Cependant, d'autres sociĂ©tĂ©s bien connues utilisent ce langage dans leurs applications. Ils investissent dans l'Ă©cosystĂšme GraphQL, car les applications modernes ont grand besoin d'un tel langage. Ainsi, vous serez soutenu non seulement par Facebook, mais aussi par les entreprises suivantes:
Lorsque Facebook a dĂ©veloppĂ© GraphQL et l'a rendu public, d'autres sociĂ©tĂ©s d'applications mobiles ont Ă©galement rencontrĂ© des problĂšmes similaires. C'est ainsi que Netflix a créé le projet Falcor, qui peut ĂȘtre considĂ©rĂ© comme une alternative Ă GraphQL. Ce qui confirme une fois de plus que pour les applications modernes, vous avez besoin exactement de solutions telles que GraphQL et Falcor.
La seule source de vĂ©ritĂ©Dans les applications GraphQL, la vĂ©ritĂ© ultime existe: c'est le schĂ©ma GraphQL. C'est elle - la source centrale, qui dĂ©crit toutes les donnĂ©es disponibles. Alors que le schĂ©ma GraphQL est gĂ©nĂ©ralement dĂ©fini cĂŽtĂ© serveur, les clients peuvent lire (interroger) et Ă©crire (modifier) ââdes donnĂ©es basĂ©es sur ce schĂ©ma. Ainsi, l'application serveur, essentiellement, fournit les informations exhaustives disponibles sur le serveur, et le cĂŽtĂ© client ne demande que ce qui est requis pour formuler des requĂȘtes dans GraphQL, ou modifie de petits fragments d'informations en utilisant les modifications dans GraphQL.
GraphQL suit les tendances actuellesGraphQL suit les tendances actuelles du développement d'applications. Vous ne pouvez avoir qu'une seule application sur le backend, mais il arrive souvent que de nombreux clients différents utilisent ce backend (client web, appareil mobile, montres intelligentes ...) et tous dépendent des données stockées dans l'application backend. Par conséquent, GraphQL peut aider non seulement à se faire des amis des «deux mondes», mais également à satisfaire les exigences de chaque client (liées, par exemple, à l'utilisation du réseau, aux relations de données imbriquées, en sélectionnant uniquement les données requises) sans avoir à créer une API dédiée pour chaque type de client.
D'un autre cÎté, sur le serveur, nous ne pouvons pas attendre une seule interface interne, mais un groupe de microservices, chacun fournissant ses propres fonctionnalités spécifiques. C'est dans un tel cas que le schéma GraphQL est idéalement adapté, dont la structure est telle que dans un tel schéma GraphQL il est possible d'agréger toutes sortes de fonctionnalités.
Comment le schéma GraphQL se raccordeGrùce à la couture, vous pouvez assembler un schéma parmi de nombreux autres. Quand puis-je me retrouver dans cette situation? Disons que votre backend est implémenté à l'aide d'une architecture de microservice. Chaque microservice traite la logique métier et les données liées à un domaine spécifique. Par conséquent, chaque microservice peut définir son propre schéma GraphQL. AprÚs cela, vous devrez les coudre ensemble pour assembler l'un de tous les schémas auxquels l'application client accédera. Au final, chaque microservice peut avoir son propre terminal GraphQL, et une passerelle API GraphQL consolidera tous les schémas en un seul global pour le fournir aux applications clientes.
Introspection GraphQLGraphQL Introspection est la possibilitĂ© d'extraire un schĂ©ma GraphQL avec l'API GraphQL. Ătant donnĂ© que le schĂ©ma contient toutes les informations sur toutes les donnĂ©es disponibles via l'API GraphQL, il peut ĂȘtre utilisĂ© avec grand succĂšs pour la gĂ©nĂ©ration automatique de la documentation de l'API. Cependant, la question ne se limite pas Ă documenter l'API; l'introspection peut Ă©galement ĂȘtre utilisĂ©e pour simuler un schĂ©ma GraphQL sur une application cliente (Ă des fins de test) ou pour rĂ©cupĂ©rer des schĂ©mas Ă partir de plusieurs microservices, puis les assembler.
GraphQL fortement typĂ©GraphQL est un langage de requĂȘte hautement typĂ© Ă©crit dans le langage de dĂ©finition de schĂ©ma expressif (SDL) pour GraphQL. Ce langage prĂ©sente les mĂȘmes avantages que tout langage de programmation fortement typĂ©. Il est moins sujet aux erreurs, peut ĂȘtre validĂ© au moment de la compilation et peut ĂȘtre comptĂ© pour l'intĂ©gration avec les fonctionnalitĂ©s IDE / Ă©diteur prises en charge telles que la saisie semi-automatique et la prise en charge des entrĂ©es.
Versionnement de GraphQLGraphQL ne dispose pas de ces versions d'API auxquelles nous sommes habituĂ©s dans REST. Dans REST, il est normal de proposer plusieurs versions de la mĂȘme API (par exemple api.domain.com/v1/, api.domain.com/v2/), car les ressources ou leur structure peuvent changer au fil du temps. Dans GraphQL, vous pouvez traduire des API en non-recommandĂ©es au niveau du champ. Par consĂ©quent, le client reçoit un avertissement lorsqu'il accĂšde Ă un champ non recommandĂ©. AprĂšs un certain temps, le champ non recommandĂ© peut ĂȘtre exclu du schĂ©ma, alors plus aucun client ne l'utilisera. Ainsi, l'API GraphQL peut ĂȘtre dĂ©veloppĂ©e sans avoir besoin de versionner.
ĂcosystĂšme GraphQL en croissanceL'Ă©cosystĂšme GraphQL se dĂ©veloppe. Il ne s'agit pas seulement d'intĂ©grations avec des Ă©diteurs et des IDE liĂ©s Ă la nature fortement typĂ©e de GraphQL; pour GraphQL en tant que tel, il existe de nouvelles applications Ă part entiĂšre. Par exemple, vous pouvez rappeler Postman, qui Ă©tait utilisĂ© lorsque vous travailliez avec l'API REST, et maintenant dans le mĂȘme but, mais avec l'API GraphQL, GraphiQL ou GraphQL Playground est utilisĂ©. Il existe Ă©galement diverses bibliothĂšques pour vous, par exemple, Gatsby.js, un gĂ©nĂ©rateur de site Web statique pour React qui utilise GraphQL. Par exemple, Gatsby.js vous permet d'Ă©crire un moteur de blog qui remplit votre blog de contenu lors de la crĂ©ation via l'API GraphQL. Par consĂ©quent, vous aurez Ă©galement des CMS sans partie client (par exemple GraphCMS) fournissant du contenu (pour un blog) via GraphQL. API Cependant, non seulement les composants technologiques se dĂ©veloppent dans ce domaine. Comme les champignons poussent aprĂšs la pluie, les confĂ©rences, mitaps et communautĂ©s consacrĂ©es Ă GraphQL sont Ă©galement faciles Ă trouver sur les newsletters et podcasts.
Si je passe Ă GraphQL - est-ce que je fais tapis?En ajoutant GraphQL Ă la pile technologique existante, nous n'allons bien sĂ»r pas Ă tapis. Migration d'une application back-end monolithique vers une architecture de microservices, le plus important est de substituer l'API GraphQL aux nouveaux microservices. En effet, c'est prĂ©cisĂ©ment en prĂ©sence de nombreux microservices que vous et votre Ă©quipe pouvez implĂ©menter en toute sĂ©curitĂ© la passerelle GraphQL, assembler des schĂ©mas et les consolider en un schĂ©ma global. Mais la passerelle API peut ĂȘtre utilisĂ©e non seulement avec des microservices, mais Ă©galement avec une application REST monolithique. C'est ainsi que vous pouvez combiner toutes vos API sur une seule passerelle et migrer pas Ă pas vers GraphQL.
Inconvénients de GraphQLEnsuite, nous discutons de certains des inconvénients associés à l'utilisation de GraphQL.
ComplexitĂ© des requĂȘtes GraphQLParfois, GraphQL n'est pas utilisĂ© correctement, j'essaie de le remplacer par une base de donnĂ©es cĂŽtĂ© serveur. Non, ça ne marchera pas. GraphQL n'est qu'un langage de requĂȘte. Lorsque du cĂŽtĂ© serveur, la demande doit ĂȘtre rĂ©solue avec des donnĂ©es, il existe gĂ©nĂ©ralement une implĂ©mentation indĂ©pendante de GraphQL qui donne accĂšs Ă la base de donnĂ©es. GraphQL est indiffĂ©rent dans ce cas. De plus, GraphQL n'Ă©limine aucun goulot d'Ă©tranglement des performances lorsque vous devez traiter un grand nombre de champs (auteurs, articles, commentaires) dans une seule requĂȘte. Quelle que soit l'architecture dans laquelle la demande a Ă©tĂ© effectuĂ©e - RESTful ou GraphQL, vous devez toujours extraire divers champs de la source.
Ainsi, nous aurons un problĂšme si le client envoie immĂ©diatement un ensemble de demandes Ă l'ensemble des champs imbriquĂ©s. Souvent, les dĂ©veloppeurs cĂŽtĂ© client ne savent pas combien de requĂȘtes de base de donnĂ©es diffĂ©rentes doivent ĂȘtre traitĂ©es dans l'application serveur si des appels de donnĂ©es en masse commencent. C'est dans de tels cas qu'un mĂ©canisme est nĂ©cessaire (par exemple, la profondeur de requĂȘte maximale, peser la complexitĂ© des requĂȘtes, Ă©viter la rĂ©cursivitĂ©, les requĂȘtes constantes) pour empĂȘcher le flux de requĂȘtes trop coĂ»teuses du client.
Limite de vitesse dans GraphQLUn autre problĂšme est la limitation de vitesse. Alors que dans REST, il est relativement simple de dire «pas plus de requĂȘtes sont autorisĂ©es par jour», il est difficile de formuler une telle instruction pour des opĂ©rations GraphQL individuelles, car il y a non seulement des opĂ©rations «coĂ»teuses» et «non coĂ»teuses», mais aussi de nombreuses graduations intermĂ©diaires. C'est dans de tels cas que les entreprises
fournissant des API GraphQL publiques proposent leurs propres calculs de limite de vitesse , souvent rĂ©duits aux valeurs maximales susmentionnĂ©es de profondeur de requĂȘte et de pondĂ©ration de la complexitĂ© des requĂȘtes.
Mise en cache GraphQLLorsque vous travaillez avec GraphQL, l'implĂ©mentation d'un cache simplifiĂ© est beaucoup plus compliquĂ©e que dans REST. Lorsque nous travaillons avec REST, nous accĂ©dons aux ressources par URL et, par consĂ©quent, pouvons organiser la mise en cache au niveau des ressources, car l'URL de ressource peut servir d'identifiant. Dans GraphQL, c'est compliquĂ© car toutes les requĂȘtes peuvent ĂȘtre diffĂ©rentes, mĂȘme si tout le monde opĂšre sur le mĂȘme objet. Dans une demande, vous pouvez demander le nom de l'auteur, et dans la suivante - non seulement le nom de l'auteur, mais aussi son adresse e-mail. C'est dans de tels cas que vous aurez besoin d'un cache plus en filigrane au niveau du champ, et ce n'est pas si simple Ă mettre en Ćuvre. Cependant, la plupart des bibliothĂšques construites sur GraphQL offrent de tels mĂ©canismes de mise en cache dĂšs la sortie de la boĂźte.
Pourquoi pas REPOS?GraphQL â REST, . REST â GraphQL, REST?
REST URL , . «», id, , id. GraphQL , . , , , GraphQL , .
, REST. Airbnb. , . REST-, REST- . , , GraphQL API, GraphQL, (, ), (., ).
, GraphQL ; , , , . GraphQL â Facebook , -.
, , REST â . , GraphQL. , GraphQL, - .