Je lis sur la fédération apollo et comment migrer à partir de l'assemblage de schémas et une question m'est venue quand j'ai lu:
La stratégie de base pour la migration d'une passerelle d'assemblage vers Apollo Federation est de commencer par rendre les services sous-jacents compatibles avec la fédération
En gros, la passerelle de fédération ne peut pas accepter un autre service non compatible avec la fédération? il n'y a donc aucun moyen d'utiliser la fédération avec un autre serveur graphql (tel que https://github.com/nuwave/lighthouse a>) ou devrais-je mal comprendre cette ligne?
3 Réponses :
Oui, tout service GraphQL intégré à la passerelle de fédération doit implémenter Apollo spécification de la fédération .
La fédération repose sur le schéma de service contenant plusieurs types, directives et extensions de type spécifiques:
scalar _Any scalar _FieldSet union _Entity type _Service { sdl: String } extend type Query { _entities(representations: [_Any!]!): [_Entity]! _service: _Service! } directive @external on FIELD_DEFINITION directive @requires(fields: _FieldSet!) on FIELD_DEFINITION directive @provides(fields: _FieldSet!) on FIELD_DEFINITION directive @key(fields: _FieldSet!) on OBJECT directive @extends on OBJECT
Le service n'a pas besoin d'être une implémentation GraphQL.js, mais il le fait besoin d'implémenter les ajouts ci-dessus au schéma comme indiqué dans la spécification.
donc si j'ajoute ces types à un serveur php graphql devrait-il fonctionner avec la passerelle de fédération sans aucune utilisation du package de fédération apollo, non?
Il ne suffit pas d'ajouter simplement ces entités, vous devrez également implémenter la logique appropriée pour résoudre les champs sur les types ajoutés, et pour gérer les directives ajoutées et pour sérialiser et désérialiser les scalaires ajoutés. À quoi ressemble cette logique est décrite dans la spécification et peut également être éclairée en examinant le code source de @ apollo / federation
. À condition que vous le fassiez, alors, oui, le service devrait être compatible avec la fédération.
Alors, où est-ce documenté? On dirait que si la plate-forme n'implémente pas la Fédération, vous êtes foutu. Heureux que nous ayons encore des coutures disponibles.
@Marc Ici : "Pour faire partie d'un graphe fédéré, un microservice implémente la spécification Apollo Federation qui expose ses capacités aux outils et à la passerelle. " La fédération est encore un concept assez nouveau dans GraphQL. Espérons que si cela se fait, d'autres implémentations majeures de GraphQL suivront la suite afin qu'il puisse être utilisé quelle que soit votre pile.
Une fois que vous avez le serveur, vous devez également créer la passerelle, si vous utilisez docker-compose, vous pouvez utiliser une image docker réutilisable comme suit:
version: '3' services: a: build: ./a # one service implementing federation b: build: ./b gateway: image: xmorse/apollo-federation-gateway ports: - 8000:80 environment: CACHE_MAX_AGE: '5' # default cache ENGINE_API_KEY: '...' # to connect to the apollo engine POLL_INTERVAL: 30 # to update services changes URL_0: "http://a" URL_1: "http://b"
Consultez le github repo pour un exemple fonctionnel.
Comme @ daniel-Rearden l'a dit , il doit implémenter des ajouts à la spécification. Consultez graphql-transform-federation pour vous aider à ajouter les informations requises. Consultez également cet article de blog