GraphQL strawberry的使用回顾和体会

news2024/12/26 15:20:39

GraphQL vs RESTful

简单来说GraphQL 比起 RESTful 集成额外一些功能

  1. 出入参校验、序列化 (简化后端编程)
  2. 自由可选的返回数据字段 (简化一些多余接口开发和沟通联调成本)

这些都是优点了。

开发效率在项目初期是很重要的,需要快速原型化。
但是后期稳定后,性能也很重要。

对比

RESTful + Pydantic

from sanic import Sanic, text
from pydantic import BaseModel
from typing import List

app = Sanic("simple")


class Simple(BaseModel):
    name: str
    age: int
    hobbies: List[str]


@app.post("/rest")
async def rest_test(request):
    Simple.model_validate(request.json)
    return text("ok")

k6测试代码

import { check } from 'k6';
import http from 'k6/http';

export default function () {

    let data = { "name": "Stephen Ling", "age": 28, "hobbies": ["coding", "coffee"] }

    const res = http.post('http://localhost:9090/rest', JSON.stringify(data), {
        headers: { 'Content-Type': 'application/json' },
    });
    check(res, {
        'is status 200': (r) => r.status === 200,
    });
}

在这里插入图片描述

GraphQL(strawberry)

k6测试代码

import { check } from 'k6';
import http from 'k6/http';

export default function () {

    let data = {
        "query": "mutation {\n  resolveGraphql(name: \"Stephen Ling\", age: 28, hobbies: [\"coding\", \"coffee\"])\n}"
    }

    const res = http.post('http://localhost:9090/graphql', JSON.stringify(data), {
        headers: { 'Content-Type': 'application/json' },
    });
    check(res, {
        'is status 200': (r) => r.status === 200,
    });
}

默认情况

import strawberry
from strawberry.sanic.views import GraphQLView
from sanic import Sanic, text

from pydantic import BaseModel
from typing import List

app = Sanic("simple")


@strawberry.type
class Mutation:
    @strawberry.mutation
    async def resolve_graphql(self, name: str, age: int, hobbies: List[str]) -> str:
        return "ok"


@strawberry.type
class Query:
    @strawberry.field
    async def nothing(self) -> None:
        ...


app.add_route(
    GraphQLView.as_view(
        schema=strawberry.Schema(
            query=Query,
            mutation=Mutation,
        ),
    ),
    "/graphql",
)

在这里插入图片描述

加上缓存

...
from strawberry.extensions import ParserCache, ValidationCache

...
app.add_route(
    GraphQLView.as_view(
        schema=strawberry.Schema(
            query=Query,
            mutation=Mutation,
            extensions=[ParserCache(), ValidationCache()],
        ),
    ),
    "/graphql",
)

在这里插入图片描述

体会

  1. graphql 适合减轻前后端联调的沟通成本。谁错谁对一目了然。
  2. 选择实现库之前,衡量一下性能代价是否能接受。
  3. 实现库之间尽可能横向对比一下。
  4. 在可以忍受的性能差距下,我会选择开发效率,毕竟每个代码的生命周期是有限的,没有必要死磕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode | 开发神器vscode必会快捷键

目录 一、全局二、注释三、折叠四、光标相关五、选择六、行操作七、格式化八、放大/缩小九、代码缩进十、调整字符大小写十一、窗口和侧边栏十二、快速跳转(文件、行、符号)十三、其他配置项设置十四、自定义快捷键十五、快捷键大全图 Visual Studio Cod…

Kotlin 基础教程二

constructor 构造器一般情况下可以简化为主构造器 即: class A constructor(参数) : 父类 (参数) 也可以在构造器上直接声明属性constructor ( var name) 这样可以全局访问 init { } 将和成员变量一起初始化 data class 可以简化一些bean类 比如get / set ,自动生成copy 函数…

设计模式之门面模式(Facade)的C++实现

1、门面模式提出 在组件的开发过程中,某些接口之间的依赖是比较紧密的,如果某个接口发生变化,其他的接口也会跟着发生变化,这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口&…

novnc 和 vnc server 如何实现通信?原理?

参考:https://www.codenong.com/js0f3b351a156c/

Vue-7.命令创建Vue项目

使用预设默认配置创建Vue项目 创建一个简单的 Vue 项目需要使用 Vue CLI(命令行界面)。Vue CLI 是一个用于快速构建 Vue.js 项目的工具,它可以帮助你设置项目的基本结构、配置以及开发环境。 以下是创建一个简单的 Vue 项目的步骤&#xff…

三极管和场效应管-易错点

NPN三极管是电流控制器件。共发射极电路中: 放大区: IceIb x β,Vbe正偏,Vbc反偏, 电势:Vc>Vb>Ve 饱和区: Ice<Ib x β,两个都正偏, 电势&#x…

【 Cocos Creator 项目实战】益智游戏《2048》(附带完整源码工程)

本文乃Siliphen原创,转载请注明出处 目录 游戏介绍 概述 游戏整体流程 游戏框架设计 主要流程控制类 本文项目的代码组织结构 构建游戏世界 数字方块 地图 触摸手势识别 防触摸抖动 判断用户输入的方向 地图 任意大小的地图 初始化地图大小 地图绘制…

Oracle执行计划

Oracle执行计划 1. 什么是执行计划Oracle explain使用3. Explain执行顺序 1. 什么是执行计划 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 执行计划描述了SQL引擎为执行SQL语句进行的操作;分析SQL语句相关的性能问题或仅仅质疑查询优化器的决定…

multiple definition of......first defined here

一、背景 环境: 银河麒麟–ARM–GCC7.4.0 写了一个动态库,依赖opencv和freeImage等第三方库,用cmake进行编译。原本在centos6-x86-gcc7.5.0上面进行编译非常的顺利,但是拿到麒麟arm上面编译就提示了这个错误:这个报错…

Matlab工具NIFTI包的基本功能函数

Matlab工具NIFTI包的基本功能函数 Nifti 格式最初是为神经影像学发明的。神经影像信息学技术计划(NIFTI)将 NIfTI 格式预设为 ANALYZE7.5 格式的替代品。它最初的应用领域是神经影像,但是也被用在其他领域。这种格式的主要特点就是它包含两个…

LVS负载均衡DR模式

在LVS(Linux Virtual Server)负载均衡中的DR(Direct Routing)模式下,数据包的流向如下: 客户端发送请求到负载均衡器(LVS)的虚拟IP(VIP)。负载均衡器&#x…

String内存结构的分配位置

在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量池的概念。常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调额,String类型的常量池比较…

Hive底层数据存储格式

前言 在大数据领域,Hive是一种常用的数据仓库工具,用于管理和处理大规模数据集。Hive底层支持多种数据存储格式,这些格式对于数据存储、查询性能和压缩效率等方面有不同的优缺点。本文将介绍Hive底层的三种主要数据存储格式:文本文件格式、Parquet格式和ORC格式。 一、三…

2023.8.8巨人网络数据开发工程师面试复盘

1 概述 问题一览 总体感觉良好,通过面试官的介绍可知这个岗位偏向离线数仓。 1.自我介绍 2.询问了其中一段实习经历 3.讲下你说用过的Linux命令 4.讲下HIVE的内部表和外部表有什么不同 *5.讲下你使用过的Hive函数(好好在复习下多准备几个吧&#xff09…

魔棒:手机智能无人直播软件多少钱?

无人直播因为直播门槛低,不需要真人出镜,不需要请主播,加上可以24小时直播卖券,效果出奇的好,一时很受广大商家的欢迎,那么,这种ai智能无人直播软件究竟多少钱呢? 当然&#xff0c…

nginx反向代理后实现nginx和apache两种web服务器能够记录客户端的真实IP地址

一.构建环境 二.配置反向代理 1.基于源码安装的nginx环境下修改nginx.conf(设备1) 2.通过windows powershell进行修改hosts文件并测试 3.设备2和设备3上查看日志,可以看到访问来源都是代理服务器(2.190)而不是真实…

渗透测试-SQL注入原理

文章目录 sql注入原理sql注入基本流程判断是否存在注入,是否会将用户输入拼接到sql语句,并当做代码执行判断字段数判断显错位判断库名判断表名判断列名判断具体数据 sql注入原理 sql注入基本流程 判断是否存在注入,是否会将用户输入拼接到sql…

leetcode 322. 零钱兑换

本题属于完全背包问题,但要求最少的硬币个数。于是设定dp数组的含义dp[i]:总金额为i时,能凑成i的最少硬币个数。 需要注意初始化dp数组时,除0以外的其他地方需要初始化为INT_MAX以保证在递推过程中能被正确的覆盖。 代码如下: …

shell的两种属性: 交互(interactive)与登录(login)

1. 背景 在看shell变量的时候引起了兴趣: 局部变量,全局变量,环境变量,shell的配置文件,参考博客: http://c.biancheng.net/view/773.html 2. 交互式与非交互式 参考博客: shell的两个属性:是否交互式(interactive), 是否登录…

Android---- 一个完整的小项目(消防app)

前言: 针对不同群体的需求,想着应该拓展写方向。医疗app很受大家喜欢,就打算顺手写个消防app,里面基础框架还是挺简洁 规整的。登陆注册和本地数据库写的便于大家理解。是广大学子的毕设首选啊! 此app主要为了传递 消防…