联邦架构
了解不同类型的 GraphQL 模式
联合的超级图使用多种“类型”的 GraphQL 模式:
- 子图模式。每个 子图都有一个独特的模式,表示它可以解析的 supergraph 中的哪些类型和 字段。
- 这些是您团队唯一需要手动定义的模式。
- 超级图模式。这个模式结合了您所有 subgraph 模式中的所有类型和 字段,以及一些联邦特定的信息,这告诉您的 路由器 哪些子图可以解析哪些字段。
- 该模式是执行以下操作的结果组合 对您的子图模式集合。
- API 模式。这个模式和 超级图模式 相似,但它省略了被认为是“机制”的联邦特定类型、字段 和 指令,这些不是您公共 API 的部分。
- 这是一个您的 router 向客户端公开的模式,客户端不需要了解 图 的内部实现细节。
让我们看看一个例子!
子图模式
以下是一个电子商务公司超级图中的三个子图的示例模式。每个子图都作为独立的GraphQL API实现:
用户
type Query {me: User}type User @key(fields: "id") {id: ID!username: String! @shareable}# (Subgraph schemas include# this to opt in to# Federation 2 features.)extend schema@link(url: "https://specs.apollo.dev/federation/v2.3",import: ["@key", "@shareable"])
产品
type Query {topProducts(first: Int = 5): [Product]}type Product @key(fields: "upc") {upc: String!name: String!price: Int}extend schema@link(url: "https://specs.apollo.dev/federation/v2.3",import: ["@key", "@shareable"])
评论
type Review {body: Stringauthor: User @provides(fields: "username")product: Product}type User @key(fields: "id") {id: ID!username: String! @externalreviews: [Review]}type Product @key(fields: "upc") {upc: String!reviews: [Review]}# (This subgraph uses additional# federated directives)extend schema@link(url: "https://specs.apollo.dev/federation/v2.3",import: ["@key", "@shareable", "@provides", "@external"])
如这些模式所示,多个子图可以为单个类型贡献独特的字段。例如,产品子图和评论子图都为Product
类型
超级图模式
超级图模式是模式组合的输出。它具有以下用途:
- 它为你的路由器提供每个子图的名称和端点URL。
- 它包含了你所有子图中定义的所有类型和字段。
- 它告诉你的路由器哪些子图可以解析哪些GraphQL字段。
以下是与上述子图模式组合的超级图模式:
如您所见,超级图模式包含了大量的联邦特定添加!这些添加仅供路由器使用,您永远不需要手动添加它们。
API模式
路由器使用其超级图模式生成一个API模式,将其作为您的实际GraphQL API公开。此模式清晰且逻辑地表示了您的子图模式的组合:
type Product {name: String!price: Intreviews: [Review]upc: String!}type Query {me: UsertopProducts(first: Int = 5): [Product]}type Review {author: Userbody: Stringproduct: Product}type User {id: ID!reviews: [Review]username: String!}
与超级图模式不同,此模式隐藏了您的GraphQL API由多个不同的GraphQL API组成的实际情况。