扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长

发现1000+提升效率与开发的AI工具和实用程序https://tools.cmdragon.cn/

使用FastAPI实现GraphQL多数据源联邦

1. GraphQL联邦架构核心原理

联邦架构(Federation)通过服务注册机制实现多源数据整合,其核心组件包括:

graph TD
Gateway[网关服务] -->|注册| ServiceA[用户服务]
Gateway -->|注册| ServiceB[商品服务]
Gateway -->|注册| ServiceC[订单服务]
Client[客户端] -->|统一查询| Gateway
Gateway -->|查询分解| ServiceA
Gateway -->|查询分解| ServiceB
Gateway -->|结果合并| Client

关键特性:

  • 服务自治:各子服务维护独立Schema
  • 类型扩展:通过@key指令实现跨服务实体关联
  • 查询优化:网关自动处理跨服务查询

2. FastAPI集成联邦架构实现

2.1 环境准备

pip install fastapi==0.68.0
pip install strawberry-graphql==0.151.0
pip install uvicorn==0.15.0

2.2 用户服务实现

import strawberry
from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter @strawberry.type
class User:
id: int
name: str @strawberry.type
class Query:
@strawberry.field
def user(self, id: int) -> User:
return User(id=id, name=f"User{id}") schema = strawberry.federation.Schema(
query=Query,
enable_federation_2=True
) app = FastAPI()
app.add_route("/graphql", GraphQLRouter(schema))

2.3 商品服务实现

@strawberry.type
class Product:
id: int
owner: User = strawberry.federation.field(external=True) @classmethod
def resolve_reference(cls, id: int):
return Product(id=id, owner=User(id=1)) @strawberry.type
class Query:
@strawberry.field
def product(self, id: int) -> Product:
return Product.resolve_reference(id) schema = strawberry.federation.Schema(
query=Query,
enable_federation_2=True,
extend=[User]
)

3. 网关服务配置

from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter
from strawberry.schema.config import FederationConfig config = FederationConfig(
service_list=[
{"name": "user", "url": "http://user-service/graphql"},
{"name": "product", "url": "http://product-service/graphql"}
]
) schema = federated_schema(config=config)
app = FastAPI()
app.add_route("/graphql", GraphQLRouter(schema))

4. 性能优化策略

  1. 查询缓存:对重复查询使用LRU缓存
  2. 批量加载:实现DataLoader模式
  3. 复杂度限制:
schema = strawberry.federation.Schema(
query=Query,
validation_rules=[
query_depth_validator(max_depth=10),
query_complexity_validator(max_complexity=500)
]
)

课后Quiz

问题1:联邦架构如何处理跨服务类型扩展?

答案:通过@key指令建立实体标识,使用resolve_reference方法实现跨服务数据关联。例如用户服务定义@key(fields: "id"),商品服务通过owner字段关联用户ID。

问题2:如何优化N+1查询问题?

解决方案:在resolve方法中使用DataLoader批量加载数据,将多个独立查询合并为批量查询,减少数据库访问次数。

常见报错处理

错误1:Schema合并冲突

Error: Cannot extend type "User" because it is not defined

解决方法:

  1. 检查所有服务是否正确定义@key指令
  2. 确认网关服务正确加载所有子服务schema

错误2:查询超时

TimeoutError: Query execution exceeded 5000ms

优化步骤:

  1. 分析查询复杂度使用query_complexity_validator
  2. 添加查询深度限制query_depth_validator
  3. 对复杂查询实施分页处理

错误3:类型验证失败

ValidationError: Field "product" argument "id" of type "Int!" is required

处理流程:

  1. 检查客户端查询参数是否完整
  2. 验证GraphQL Schema类型定义
  3. 使用strawberry.Private字段处理内部类型转换

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长,阅读完整的文章:如何在FastAPI中玩转GraphQL联邦架构,让数据源手拉手跳探戈?

往期文章归档:

免费好用的热门在线工具

如何在FastAPI中玩转GraphQL联邦架构,让数据源手拉手跳探戈?的更多相关文章

  1. 如何在 Kubernetes 集群中玩转 Fluid + JuiceFS

    作者简介: 吕冬冬,云知声超算平台架构师, 负责大规模分布式机器学习平台架构设计与功能研发,负责深度学习算法应用的优化与 AI 模型加速.研究领域包括高性能计算.分布式文件存储.分布式缓存等. 朱唯唯 ...

  2. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  3. 【转】我是如何在SQLServer中处理每天四亿三千万记录的

    原文转自:http://blog.jobbole.com/80395/ 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文 ...

  4. 如何在SQLServer中处理每天四亿三千万记录

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  5. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  6. 如何在Unity中分别实现Flat Shading(平面着色)、Gouraud Shading(高洛德着色)、Phong Shading(冯氏着色)

    写在前面: 先说一下为什么决定写这篇文章,我也是这两年开始学习3D物体的光照还有着色方式的,对这个特别感兴趣,在Wiki还有NVIDIA官网看了相关资料后,基本掌握了渲染物体时的渲染管道(The re ...

  7. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  8. 我是如何在SQLServer中处理每天四亿三千万记录的(转)

    出处:http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html 首先声明,我只是个程序员,不是专业的DBA,以下这篇文章 ...

  9. 如何在SQLServer中处理每天四亿三千万记录的(数据库大数据处理)

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  10. 如何在SQLServer中处理每天四亿三千万记录的

    项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了.具体这个项目的情况,我有空 ...

随机推荐

  1. Web前端入门第 48 问:纯 CSS 使用 column 属性实现瀑布流布局

    什么是瀑布流? 看一张图,以下图片来源于花瓣网截图: 如上图所示,瀑布流就是让内容按列显示,自动填充空白. 使用 column 实现瀑布流 源码: <div class="masonr ...

  2. Seata源码—4.全局事务拦截与开启事务处理

    大纲 1.Seata Server的启动入口的源码 2.Seata Server的网络服务器启动的源码 3.全局事务拦截器的核心变量 4.全局事务拦截器的初始化源码 5.全局事务拦截器的AOP切面拦截 ...

  3. 智能点餐助手平台:CodeBuddy模型驱动的技术革新

    我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 引言 在当代互联网技术高速发展 ...

  4. AI到底给我们带来什么?

    AI 如火如荼,尤其是最近半年,发展的速度超出想象.DeepSeek的出现,对于整个世界AI 界带来深渊影响. AI是当前"技术找技术"的极致产物, 它大幅提升了流程效率,但没有带 ...

  5. WPF应用启动时,检测触摸失效的几种方式

    在开发OPS项目,发现插拔式的OPS在切换系统.开关机.重启,会时不时出现部分WPF开机自启的 应用触摸失效的问题.而且出现问题的应用都是全屏窗口应用.用snoop 附加上去,没有Touch 和Sty ...

  6. System.currentTimeMillis()与时区无关

    摘要:System.currentTimeMillis()获取的时间戳与时区无关. 综述   System.currentTimeMillis()经常被用来获取当前时间戳,单位是毫秒,可以用来计算当前 ...

  7. 「Log」做题记录 2023.8.28-2023.9.24

    \(2023.8.28-2023.9.3\) \(\color{blueviolet}{P3704}\) 莫反. \(\color{limegreen}{P8773}\) ST 表. \(\color ...

  8. ArkUI-X与Android桥接通信之方法回调

    平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递.ArkUI侧调用平台的方法.平台调用ArkUI侧的方法.本文主要介绍Android平台 ...

  9. 高性价比国内外VPS/云服务器推荐【附优惠码】 2025/6/12更新

    本文不定期更新,敬请收藏.(本次更新时间:2025年6月13日00时16分) 前言 做开发的,做运维的,搞NAS的,喜欢研究点东西的,总得有一台自用的云服务器. 然,我观大厂总是套路满满,遂开始研究稳 ...

  10. 一个基于 .NET 开源、模块化 AI 图像生成 Web 用户界面

    前言 今天大姚给大家分享一个基于 .NET 开源.模块化 AI 图像生成 Web 用户界面:SwarmUI. 项目介绍 SwarmUI (原 StableSwarmUI)是一个基于 .NET 开源(M ...