1
votes

Passerelle Apollo Federation et une autre implémentation de serveur

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

https://www.apollographql.com/docs/apollo-server/federation/migrating-from-stitching/#adding-federation-support-to-services

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) ou devrais-je mal comprendre cette ligne?


0 commentaires

3 Réponses :


5
votes

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.


4 commentaires

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.



0
votes

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.


0 commentaires

0
votes

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


0 commentaires