Apollo Router
This content is not available in your language yet.
Apollo Router est un routeur de graphe configurable et haute performance écrit en Rust, conçu spécifiquement pour exécuter un supergraph fédéré utilisant Apollo Federation (versions 1 ou 2). En tant que runtime de la plateforme GraphOS, Apollo Router sert de point d’entrée unique aux API GraphQL fédérées. Il est aussi possible de l’auto héberger sur notre serveur.
Sa fonction principale est d’exécuter les opérations client en planifiant et exécutant des requêtes aux sous-graphes, puis en fusionnant les résultats en réponses cohérentes. En introduction je vous parlez du package @apollo/gateway, voici les différences entre ce package et le router :
Caractéristique | Apollo Router | Apollo Gateway |
---|---|---|
Langage de programmation | Rust | JavaScript/Node.js |
Distribution | Binaire autonome | Package npm |
Configuration | YAML déclaratif | JavaScript |
Execution | Multi-thread | Mono-thread |
Le router peut être utilisé en mode développement mais je vous conseillerais plutôt la Rover CLI. Rover est une CLI qui accompagne le router qui va vous permettre plusieurs manipulations et interactions avec les endpoints graphql.
Installation de Rover
Macos/Linux :
curl -sSL https://rover.apollo.dev/nix/latest | sh
Utilisation de Rover
Pour utiliser Rover il faut d’abord créer un fichier de configuration pour le router.
federation_version: =2.7.0subgraphs: # products: # routing_url: http://localhost:4000 # schema: # subgraph_url: ./products.graphql # Schema provided via file products: schema: subgraph_url: http://localhost:4001 users: schema: subgraph_url: http://localhost:4002
Dans notre cas nous avons deux sous-graphes, un pour les utilisateurs et un pour les produits. Comme vous le voyez nous définissons l’url des sous-graphes directement mais nous pourrions aussi fournir le fichier .graphql directement.
Attention, la version de federation doit être la même pour tous les sous-graphes et votre router.
Ensuite, nous allons créer le fichier router.yaml qui va définir le comportement du router.
supergraph: listen: 0.0.0.0:4000 introspection: trueheaders: all: request: - propagate: matching: .*include_subgraph_errors: all: true
cors: allow_any_origin: true
Nous avons défini ici le port 4000 pour le router et nous avons activé l’introspection qui permet de récupérer les informations du supergraph. Par défaut, aucun header n’est propagé, ici nous avons activé le transfert de tous les headers.
Enfin, nous avons activé le CORS qui permet de faire des requêtes cross-domain.
Voici le projet demo avec les configurations du router et deux sous-graphes.
git clone https://github.com/Civilisation-IT/demo-graphqlcd apollo-router-demodocker compose up -d
Maintenant nous pouvons lancer le router :
rover dev --supergraph-config ./router-apollo/subgraph.yaml --router-config ./router-apollo/router.yaml
Il faut accepter la licence d’utilisation, ensuite les plugins subgraph et router seront téléchager, enfin, notre router sera disponible à l’adresse http://localhost:4000.
Super rapide non ? en plus il y a des fonctionnalités assez sympathiques comme l’auto actualisation du schema lorsque l’un des sous-graphe est modifié ou encore la telemetrie. D’autres fonctionnalités comme les rhai scripts peuvent être utile si vous voulez aller plus loin.
Jusqu’a maintenant c’est bien beau, performant et rapide mais il y a des limitations.
Je vais vous partager l’une de mes déceptionns, l’intégration WebSockets. Il est possible de le faire avec Apollo router, regarder je vous montre la configuration, c’est super sexy :
subscription: enabled: true mode: passthrough: all: # The router uses these subscription settings UNLESS overridden per-subgraph path: /subscriptions # The absolute URL path to use for subgraph subscription endpoints (Default: /ws) subgraphs: # Overrides subscription settings for individual subgraphs reviews: # Overrides settings for the 'reviews' subgraph path: /ws # Absolute path that overrides the preceding '/subscriptions' path for 'all' protocol: graphql_ws # The WebSocket-based subprotocol to use for subscription communication (Default: graphql_ws) heartbeat_interval: 10s # Optional and 'disable' by default, also supports 'enable' (set 5s interval) and custom values for intervals, e.g. '100ms', '10s', '1m'.
Super simple, mais il faut payer GraphOS Entreprise… (d’après les posts Reddit ça coûte un bras)
Nous sommes la face un produit Open Source mais qui nous enferme dans leurs solutions sans nous donner la possibilité de faire un module ou autre solutions alternative pour gérer ce cas. Je suis conscient que les développeurs et entreprises doivent faire leurs gras, mais je trouve ça dommage d’exclure de la version open source des fonctionnalités plutôt ‘banales’ comme l’intégration de WebSockets.