Federation kombiniert die GraphQL-APIs von mehreren (Microservice-)Teams zu einer einzigen API. Mit graphql-transform-federation können Sie Föderation zu (verwalteten) GraphQL-Diensten, generierten GraphQL-Schemas oder anderen GraphQL-APIs hinzufügen. Bisher bestand die einzige Möglichkeit, Federation hinzuzufügen, darin, Ihr GraphQL-Schema zu ändern. Wenn Sie keine Kontrolle über das Schema hatten, gab es keine Möglichkeit, Federation zu verwenden.
Architektur für graphql-transform-federation unter Verwendung eines entfernten SchemasDie Anwendung[/caption]der Transformation auf ein lokales Schema ist sinnvoll, wenn Sie keine ausreichende Kontrolle über das Schema haben. Dies kann der Fall sein, wenn das Schema automatisch generiert wird, wie bei swagger-to-graphql, oder wenn Ihr Schema-Builder noch nicht über Federation verfügt, wie z.B. nexus.
Wenn Sie mit apollo-server arbeiten (der graphql-tools verwendet), brauchen Sie die Transformation nicht zu verwenden, da Federated standardmäßig unterstützt wird. Lesen Sie in der Dokumentation nach, wie Sie ein föderiertes Schema mit apollo-server implementieren können.
Wann brauchen Sie Föderation?
Wenn Sie mehrere Teams haben, die Backend-Dienste erstellen, möchten Sie, dass jedes Team für sein eigenes GraphQL-Schema verantwortlich ist. Ein einziges Team, das für jeden Dienst eine GraphQL-API erstellt, ist nicht skalierbar. Da sich jedes Team mit dem zentralisierten GraphQL-Team abstimmen muss, wäre der Kommunikationsaufwand zu groß. Um Ihren Entwicklungsaufwand zu skalieren, möchten Sie also, dass jedes Team für seine eigene GraphQL-API verantwortlich ist. Auf diese Weise können Sie jedoch nicht mehr eine einzige GraphQL-API abfragen. Da die Hauptidee von GraphQL darin besteht, einen einzigen API-Endpunkt zu haben, möchten Sie die GraphQL-Schemata Ihrer verschiedenen Teams kombinieren. Früher gab es einen Ansatz namens Schema Stitching. Dies erforderte jedoch, dass alle Stitching-Vorgänge im zentralen GraphQL-Gateway implementiert werden mussten. Hier kommt die GraphQL-Föderation ins Spiel. Sie ermöglicht es Backend-Teams, zu definieren, wie die verschiedenen GraphQL-APIs als Metadaten in ihrem eigenen GraphQL-Schema zusammengefügt werden. Das GraphQL-Gateway muss jetzt nur noch wissen, wie die verschiedenen APIs erreicht werden können, und ist in der Lage, eine einzige GraphQL-API zu erstellen.Was macht graphql-transform-federation?
Die Apollo-Federation erfordert das Hinzufügen einiger Direktiven und Resolver zu Ihrem Schema. Graphql-transform-federation fügt diese zu Ihrem Schema hinzu. Sie können das in derselben NodeJS-Anwendung definierte Schema transformieren, aber es kann auch ein entferntes Schema sein. Bei der Verwendung eines entfernten Schemas spielt es keine Rolle, welche Technologie für die Implementierung des Backend-Dienstes verwendet wird. Sie werden graphql-transform-federation in einem Middleware-Dienst ausführen. Damit ist es sogar möglich, verwalteten GraphQL-Lösungen, die noch keine Unterstützung haben, Federation-Unterstützung hinzuzufügen. Beispiele hierfür sind: Hasura, AWS Appsync, Prisma, OneGraph, DatoCMS, GraphCMS, Contentful, usw. [caption id="" align="aligncenter" width="740"]
Architektur für graphql-transform-federation unter Verwendung eines entfernten SchemasDie Anwendung[/caption]der Transformation auf ein lokales Schema ist sinnvoll, wenn Sie keine ausreichende Kontrolle über das Schema haben. Dies kann der Fall sein, wenn das Schema automatisch generiert wird, wie bei swagger-to-graphql, oder wenn Ihr Schema-Builder noch nicht über Federation verfügt, wie z.B. nexus.
Wenn Sie mit apollo-server arbeiten (der graphql-tools verwendet), brauchen Sie die Transformation nicht zu verwenden, da Federated standardmäßig unterstützt wird. Lesen Sie in der Dokumentation nach, wie Sie ein föderiertes Schema mit apollo-server implementieren können.
Wie sieht ein Beispiel aus?
Der Code unten zeigt ein GraphQL-Schema und wie es nach der Transformation aussieht. Darunter sehen Sie den Code, wie Sie die Transformation durchführen. Ein vollständiges Arbeitsbeispiel ist auf GitHub verfügbar. Es zeigt, wie ein mit swagger-to-graphql generiertes Schema durch einen anderen GraphQL-Dienst erweitert wird. Das Gateway kombiniert beide Schemas zu einem einzigen Graphen.// Ursprüngliches Schema
Typ Haustier {
id: String
Kommentare: [Kommentar!]!
}
// Transformiertes Schema
extend type Pet @key(fields = "id"){
id: String @extern
Kommentare: [Kommentar!]!
}
// Code zur Durchführung der Transformation
const federatedSchema = transformSchemaFederation(originalSchema, {
Haustier: {
erweitern: wahr,
keyFields: ['id'],
Felder: {
id: {
extern: wahr,
},
},
},
});
Abschließende Gedanken
GraphQL setzt sich immer mehr durch. Es macht es möglich, einen einzigen Datengraphen als API für alle Dienste in Ihrem Unternehmen zu erstellen, der von jedem Client genutzt werden kann. Mit der Föderation können Sie sicher sein, dass sie für große Entwicklungsorganisationen skalierbar ist. Mit graphql-transform-federation können Sie die Föderation in jeder Situation zum Laufen bringen. Sehen Sie sich die Demo an und lassen Sie mich wissen, was Sie davon halten.Verfasst von
Ruben Oostinga
Unsere Ideen
Weitere Blogs
Contact
Let’s discuss how we can support your journey.



