Objevte sílu federace GraphQL pomocí Schema Stitching. Naučte se, jak vytvořit jednotné GraphQL API z více služeb a zlepšit tak škálovatelnost a udržovatelnost.
Federace GraphQL: Schema Stitching - Komplexní průvodce
V neustále se vyvíjejícím světě moderního vývoje aplikací se stala potřeba škálovatelných a udržitelných architektur prvořadou. Mikroslužby se svou inherentní modularitou a nezávislou nasaditelností se ukázaly jako populární řešení. Správa mnoha mikroslužeb však může přinést komplikace, zejména pokud jde o vystavení jednotného API klientským aplikacím. A právě zde přichází na řadu federace GraphQL, konkrétně Schema Stitching.
Co je federace GraphQL?
Federace GraphQL je výkonná architektura, která vám umožňuje vytvořit jedno, jednotné GraphQL API z více podkladových GraphQL služeb (často reprezentujících mikroslužby). Umožňuje vývojářům dotazovat se na data napříč různými službami, jako by se jednalo o jediný graf, což zjednodušuje klientskou zkušenost a snižuje potřebu složité orchestrační logiky na straně klienta.
Existují dva hlavní přístupy k federaci GraphQL:
- Schema Stitching: Jedná se o kombinování více schémat GraphQL do jednoho, jednotného schématu na úrovni brány (gateway). Je to starší přístup a spoléhá na knihovny pro správu kombinace schémat a delegování dotazů.
- Apollo Federation: Toto je novější a robustnější přístup, který používá deklarativní jazyk schématu a specializovaný plánovač dotazů pro správu federace. Nabízí pokročilé funkce, jako jsou rozšíření typů, direktivy klíčů a distribuované trasování.
Tento článek se zaměřuje na Schema Stitching, zkoumá jeho koncepty, výhody, omezení a praktickou implementaci.
Porozumění Schema Stitching
Schema Stitching je proces sloučení více schémat GraphQL do jednoho, koherentního schématu. Toto jednotné schéma funguje jako fasáda, která před klientem skrývá složitost podkladových služeb. Když klient odešle požadavek na spojené schéma, brána inteligentně směruje požadavek na příslušnou podkladovou službu (nebo služby), získá data a zkombinuje výsledky před jejich vrácením klientovi.
Představte si to takto: Máte několik restaurací (služeb), z nichž každá se specializuje na jinou kuchyni. Schema Stitching je jako univerzální menu, které kombinuje všechna jídla z každé restaurace. Když si zákazník (klient) objedná z univerzálního menu, objednávka je inteligentně směrována do příslušných kuchyní restaurací, jídlo je připraveno a poté spojeno do jedné dodávky pro zákazníka.
Klíčové koncepty v Schema Stitching
- Vzdálená schémata (Remote Schemas): Jsou to jednotlivá schémata GraphQL každé podkladové služby. Každá služba vystavuje své vlastní schéma, které definuje data a operace, které poskytuje.
- Brána (Gateway): Brána je centrální komponenta zodpovědná za spojení vzdálených schémat a vystavení jednotného schématu klientovi. Přijímá klientské požadavky, směruje je na příslušné služby a kombinuje výsledky.
- Sloučení schémat (Schema Merging): Jde o proces kombinování vzdálených schémat do jednoho schématu. To často zahrnuje přejmenování typů a polí, aby se předešlo konfliktům, a definování vztahů mezi typy napříč různými schématy.
- Delegování dotazů (Query Delegation): Když klient odešle požadavek na spojené schéma, brána musí delegovat požadavek na příslušnou podkladovou službu (nebo služby), aby získala data. To zahrnuje překlad dotazu klienta na dotaz, kterému rozumí vzdálená služba.
- Agregace výsledků (Result Aggregation): Poté, co brána získá data z podkladových služeb, musí výsledky zkombinovat do jedné odpovědi, která může být vrácena klientovi. To často zahrnuje transformaci dat, aby odpovídala struktuře spojeného schématu.
Výhody Schema Stitching
Schema Stitching nabízí několik přesvědčivých výhod pro organizace, které přijímají architekturu mikroslužeb:
- Jednotné API: Poskytuje jediné, konzistentní API pro klienty, zjednodušuje přístup k datům a snižuje potřebu klientů komunikovat s více službami přímo. To vede k čistší a intuitivnější vývojářské zkušenosti.
- Snížená složitost klienta: Klienti potřebují interagovat pouze s jednotným schématem, což je chrání před složitostí podkladové architektury mikroslužeb. Tím se zjednodušuje vývoj na straně klienta a snižuje se množství kódu požadovaného na klientovi.
- Zvýšená škálovatelnost: Umožňuje škálovat jednotlivé služby nezávisle na základě jejich specifických potřeb. Tím se zlepšuje celková škálovatelnost a odolnost systému. Například služba pro uživatele, která zažívá vysoké zatížení, může být škálována bez ovlivnění ostatních služeb, jako je katalog produktů.
- Zlepšená udržovatelnost: Podporuje modularitu a oddělení zodpovědností, což usnadňuje údržbu a vývoj jednotlivých služeb. Změny v jedné službě méně pravděpodobně ovlivní ostatní služby.
- Postupná adopce: Lze implementovat postupně, což vám umožní postupně migrovat z monolitické architektury na architekturu mikroslužeb. Můžete začít spojením stávajících API a poté postupně rozkládat monolit na menší služby.
Omezení Schema Stitching
Ačkoliv Schema Stitching nabízí četné výhody, je důležité si být vědom jeho omezení:
- Složitost: Implementace a správa Schema Stitching může být složitá, zejména ve velkých a komplexních systémech. Pečlivé plánování a návrh jsou nezbytné.
- Výkonnostní režie: Brána přináší určitou výkonnostní režii kvůli další vrstvě nepřímého přístupu a potřebě delegovat dotazy a agregovat výsledky. Pečlivá optimalizace je klíčová pro minimalizaci této režie.
- Konflikty schémat: Při slučování schémat z různých služeb mohou nastat konflikty, zejména pokud používají stejné názvy typů nebo polí. To vyžaduje pečlivý návrh schématu a potenciální přejmenování typů a polí.
- Omezené pokročilé funkce: Ve srovnání s Apollo Federation, Schema Stitching postrádá některé pokročilé funkce, jako jsou rozšíření typů a direktivy klíčů, což může ztížit správu vztahů mezi typy napříč různými schématy.
- Zralost nástrojů: Nástroje a ekosystém kolem Schema Stitching nejsou tak zralé jako ty kolem Apollo Federation. To může ztížit ladění a řešení problémů.
Praktická implementace Schema Stitching
Projděme si zjednodušený příklad, jak implementovat Schema Stitching pomocí Node.js a knihovny graphql-tools
(oblíbená volba pro schema stitching). Tento příklad zahrnuje dvě mikroslužby: Službu pro uživatele a Službu pro produkty.
1. Definujte vzdálená schémata
Nejprve definujte schémata GraphQL pro každou ze vzdálených služeb.
Služba pro uživatele (user-service.js
):
const { buildSchema } = require('graphql');
const userSchema = buildSchema(`
type User {
id: ID!
name: String
email: String
}
type Query {
user(id: ID!): User
}
`);
const users = [
{ id: '1', name: 'Alice Smith', email: 'alice@example.com' },
{ id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];
const userRoot = {
user: (args) => users.find(user => user.id === args.id),
};
module.exports = {
schema: userSchema,
rootValue: userRoot,
};
Služba pro produkty (product-service.js
):
const { buildSchema } = require('graphql');
const productSchema = buildSchema(`
type Product {
id: ID!
name: String
price: Float
userId: ID! # Cizí klíč ke službě User Service
}
type Query {
product(id: ID!): Product
}
`);
const products = [
{ id: '101', name: 'Laptop', price: 1200, userId: '1' },
{ id: '102', name: 'Smartphone', price: 800, userId: '2' },
];
const productRoot = {
product: (args) => products.find(product => product.id === args.id),
};
module.exports = {
schema: productSchema,
rootValue: productRoot,
};
2. Vytvořte službu brány (Gateway)
Nyní vytvořte službu brány, která spojí obě schémata dohromady.
Služba brány (gateway.js
):
const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');
async function createRemoteSchema(uri) {
const fetcher = async (params) => {
const response = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(params),
});
return response.json();
};
const schema = await introspectSchema(fetcher);
return makeRemoteExecutableSchema({
schema,
fetcher,
});
}
async function main() {
const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
const productSchema = await createRemoteSchema('http://localhost:4002/graphql');
const stitchedSchema = stitchSchemas({
subschemas: [
{ schema: userSchema },
{ schema: productSchema },
],
typeDefs: `
extend type Product {
user: User
}
`,
resolvers: {
Product: {
user: {
selectionSet: `{ userId }`,
resolve(product, args, context, info) {
return info.mergeInfo.delegateToSchema({
schema: userSchema,
operation: 'query',
fieldName: 'user',
args: {
id: product.userId,
},
context,
info,
});
},
},
},
},
});
const app = express();
app.use('/graphql', graphqlHTTP({
schema: stitchedSchema,
graphiql: true,
}));
app.listen(4000, () => console.log('Gateway server running on http://localhost:4000/graphql'));
}
main().catch(console.error);
3. Spusťte služby
Budete muset spustit službu User Service a Product Service na různých portech. Například:
Služba pro uživatele (port 4001):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4001, () => console.log('User service running on http://localhost:4001/graphql'));
Služba pro produkty (port 4002):
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: rootValue,
graphiql: true,
}));
app.listen(4002, () => console.log('Product service running on http://localhost:4002/graphql'));
4. Dotaz na spojené schéma
Nyní se můžete dotazovat na spojené schéma prostřednictvím brány (běžící na portu 4000). Můžete spustit dotaz jako tento:
query {
product(id: "101") {
id
name
price
user {
id
name
email
}
}
}
Tento dotaz načte produkt s ID "101" a také načte přidruženého uživatele ze služby User Service, což ukazuje, jak Schema Stitching umožňuje dotazovat se na data napříč více službami v jediném požadavku.
Pokročilé techniky Schema Stitching
Kromě základního příkladu zde jsou některé pokročilé techniky, které lze použít k vylepšení vaší implementace Schema Stitching:
- Delegování schématu (Schema Delegation): To vám umožňuje delegovat části dotazu na různé služby na základě požadovaných dat. Například můžete delegovat rozlišení typu `User` na službu User Service a rozlišení typu `Product` na službu Product Service.
- Transformace schématu (Schema Transformation): Jde o úpravu schématu vzdálené služby předtím, než je spojeno do jednotného schématu. To může být užitečné pro přejmenování typů a polí, přidání nových polí nebo odstranění existujících polí.
- Vlastní resolvery (Custom Resolvers): Můžete definovat vlastní resolvery v bráně pro zpracování složitých transformací dat nebo pro načítání dat z více služeb a jejich kombinaci do jednoho výsledku.
- Sdílení kontextu (Context Sharing): Často je nutné sdílet kontextové informace mezi bránou a vzdálenými službami, jako jsou autentizační tokeny nebo ID uživatelů. Toho lze dosáhnout předáním kontextových informací jako součásti procesu delegování dotazu.
- Zpracování chyb (Error Handling): Implementujte robustní zpracování chyb pro elegantní řešení chyb, které se vyskytnou ve vzdálených službách. To může zahrnovat logování chyb, vracení uživatelsky přívětivých chybových zpráv nebo opakování neúspěšných požadavků.
Volba mezi Schema Stitching a Apollo Federation
Ačkoliv je Schema Stitching životaschopnou možností pro federaci GraphQL, Apollo Federation se stala populárnější volbou díky svým pokročilým funkcím a vylepšené vývojářské zkušenosti. Zde je srovnání obou přístupů:
Funkce | Schema Stitching | Apollo Federation |
---|---|---|
Definice schématu | Používá existující jazyk schématu GraphQL | Používá deklarativní jazyk schématu s direktivami |
Plánování dotazů | Vyžaduje ruční delegování dotazů | Automatické plánování dotazů bránou Apollo Gateway |
Rozšíření typů | Omezená podpora | Vestavěná podpora pro rozšíření typů |
Klíčové direktivy | Není podporováno | Používá direktivu @key k identifikaci entit |
Distribuované trasování | Vyžaduje ruční implementaci | Vestavěná podpora pro distribuované trasování |
Nástroje a ekosystém | Méně zralé nástroje | Zralejší nástroje a velká komunita |
Složitost | Může být složité spravovat ve velkých systémech | Navrženo pro velké a komplexní systémy |
Kdy zvolit Schema Stitching:
- Máte existující služby GraphQL a chcete je rychle zkombinovat.
- Potřebujete jednoduché řešení federace a nevyžadujete pokročilé funkce.
- Máte omezené zdroje a chcete se vyhnout režii spojené s nastavením Apollo Federation.
Kdy zvolit Apollo Federation:
- Stavíte velký a komplexní systém s více týmy a službami.
- Potřebujete pokročilé funkce jako rozšíření typů, klíčové direktivy a distribuované trasování.
- Chcete robustnější a škálovatelnější řešení federace.
- Preferujete deklarativnější a automatizovanější přístup k federaci.
Příklady z praxe a případy použití
Zde jsou některé příklady z reálného světa, jak lze využít federaci GraphQL, včetně Schema Stitching:
- E-commerce platforma: E-commerce platforma může použít federaci GraphQL ke kombinaci dat z více služeb, jako je služba katalogu produktů, služba uživatelů, služba objednávek a platební služba. To klientům umožňuje snadno získat všechny informace, které potřebují k zobrazení detailů produktu, uživatelských profilů, historie objednávek a platebních informací.
- Platforma sociálních médií: Platforma sociálních médií by mohla použít federaci GraphQL ke kombinaci dat ze služeb, které spravují uživatelské profily, příspěvky, komentáře a "lajky". To umožňuje klientům efektivně načítat všechny informace potřebné k zobrazení profilu uživatele, jeho příspěvků a komentářů a "lajků" spojených s těmito příspěvky.
- Aplikace pro finanční služby: Aplikace pro finanční služby může použít federaci GraphQL ke kombinaci dat ze služeb, které spravují účty, transakce a investice. To klientům umožňuje snadno získat všechny informace, které potřebují k zobrazení zůstatků na účtech, historie transakcí a investičních portfolií.
- Systém pro správu obsahu (CMS): CMS může využít federaci GraphQL k integraci dat z různých zdrojů, jako jsou články, obrázky, videa a obsah generovaný uživateli. To umožňuje jednotné API pro načítání veškerého obsahu souvisejícího s konkrétním tématem nebo autorem.
- Zdravotnická aplikace: Integrace pacientských dat z různých systémů, jako jsou elektronické zdravotní záznamy (EHR), laboratorní výsledky a plánování schůzek. To nabízí lékařům jediný bod přístupu ke komplexním informacím o pacientech.
Osvědčené postupy pro Schema Stitching
Chcete-li zajistit úspěšnou implementaci Schema Stitching, dodržujte tyto osvědčené postupy:
- Pečlivě plánujte své schéma: Než začnete spojovat schémata, pečlivě naplánujte strukturu jednotného schématu. To zahrnuje definování vztahů mezi typy napříč různými schématy, přejmenování typů a polí, aby se předešlo konfliktům, a zvážení celkových vzorců přístupu k datům.
- Používejte konzistentní konvence pojmenování: Přijměte konzistentní konvence pojmenování pro typy, pole a operace napříč všemi službami. To pomůže předejít konfliktům a usnadní pochopení jednotného schématu.
- Dokumentujte své schéma: Důkladně dokumentujte jednotné schéma, včetně popisů typů, polí a operací. To usnadní vývojářům pochopení a používání schématu.
- Monitorujte výkon: Monitorujte výkon brány a vzdálených služeb, abyste identifikovali a řešili jakékoli výkonnostní problémy. Používejte nástroje jako distribuované trasování ke sledování požadavků napříč více službami.
- Implementujte zabezpečení: Implementujte vhodná bezpečnostní opatření k ochraně brány a vzdálených služeb před neoprávněným přístupem. To může zahrnovat použití mechanismů autentizace a autorizace, stejně jako validaci vstupů a kódování výstupů.
- Verzujte své schéma: Jak vyvíjíte svá schémata, verzujte je vhodně, abyste zajistili, že klienti mohou nadále používat starší verze schématu bez narušení funkčnosti. To pomůže předejít změnám, které by mohly něco rozbít, a zajistit zpětnou kompatibilitu.
- Automatizujte nasazení: Automatizujte nasazení brány a vzdálených služeb, abyste zajistili, že změny mohou být nasazeny rychle a spolehlivě. To pomůže snížit riziko chyb a zlepšit celkovou agilitu systému.
Závěr
Federace GraphQL se Schema Stitching nabízí výkonný přístup k budování jednotných API z více služeb v architektuře mikroslužeb. Porozuměním jejím klíčovým konceptům, výhodám, omezením a implementačním technikám můžete využít Schema Stitching ke zjednodušení přístupu k datům, zlepšení škálovatelnosti a zvýšení udržovatelnosti. Ačkoli se Apollo Federation ukázala jako pokročilejší řešení, Schema Stitching zůstává životaschopnou volbou pro jednodušší scénáře nebo při integraci stávajících služeb GraphQL. Pečlivě zvažte své specifické potřeby a požadavky, abyste si vybrali nejlepší přístup pro vaši organizaci.