#graphql #graphql-server #async #future

async-graphql

使用Rust编写的GraphQL服务器库

362个稳定版本

7.0.7 2024年7月14日
7.0.5 2024年5月9日
7.0.3 2024年3月16日
6.0.11 2023年11月19日
0.10.8 2020年3月10日

#20 in 网络编程

Download history 87761/week @ 2024-05-04 103545/week @ 2024-05-11 107546/week @ 2024-05-18 104951/week @ 2024-05-25 119386/week @ 2024-06-01 121636/week @ 2024-06-08 104304/week @ 2024-06-15 105033/week @ 2024-06-22 104565/week @ 2024-06-29 113972/week @ 2024-07-06 115479/week @ 2024-07-13 116505/week @ 2024-07-20 115312/week @ 2024-07-27 108726/week @ 2024-08-03 136180/week @ 2024-08-10 130257/week @ 2024-08-17

513,113 每月下载量
168 个包中使用了(直接使用132个)

MIT/Apache

1.5MB
32K SLoC

async-graphql

一个完全符合规范的高性能GraphQL服务器库

书籍中文文档文档GitHub仓库Cargo包


ci status code coverage Unsafe Rust forbidden Crates.io version docs.rs docs downloads PRs Welcome

此包使用 #![forbid(unsafe_code)] 确保所有内容都使用100%安全的Rust实现。

静态模式

use std::error::Error;

use async_graphql::{http::GraphiQLSource, EmptyMutation, EmptySubscription, Object, Schema};
use async_graphql_poem::*;
use poem::{listener::TcpListener, web::Html, *};

struct Query;

#[Object]
impl Query {
    async fn howdy(&self) -> &'static str {
        "partner"
    }
}

#[handler]
async fn graphiql() -> impl IntoResponse {
    Html(GraphiQLSource::build().finish())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // create the schema
    let schema = Schema::build(Query, EmptyMutation, EmptySubscription).finish();

    // start the http server
    let app = Route::new().at("/", get(graphiql).post(GraphQL::new(schema)));
    println!("GraphiQL: https://127.0.0.1:8000");
    Server::new(TcpListener::bind("0.0.0.0:8000"))
        .run(app)
        .await?;
    Ok(())
}

动态模式

需要启用 dynamic-schema 功能。

use std::error::Error;

use async_graphql::{dynamic::*, http::GraphiQLSource};
use async_graphql_poem::*;
use poem::{listener::TcpListener, web::Html, *};

#[handler]
async fn graphiql() -> impl IntoResponse {
    Html(GraphiQLSource::build().finish())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let query = Object::new("Query").field(Field::new(
        "howdy",
        TypeRef::named_nn(TypeRef::STRING),
        |_| FieldFuture::new(async { "partner" }),
    ));

    // create the schema
    let schema = Schema::build(query, None, None).register(query).finish()?;

    // start the http server
    let app = Route::new().at("/", get(graphiql).post(GraphQL::new(schema)));
    println!("GraphiQL: https://127.0.0.1:8000");
    Server::new(TcpListener::bind("0.0.0.0:8000"))
        .run(app)
        .await?;
    Ok(())
}

功能

  • 支持静态和动态模式
  • 完全支持async/await
  • 类型安全
  • Rustfmt友好(过程宏)
  • 自定义标量
  • 最小开销
  • 易于集成(《poem》、《axum》、《actix-web》、《tide》、《warp》、《rocket》等)
  • 上传文件(多部分请求)
  • 订阅(WebSocket传输)
  • 自定义扩展
  • 错误扩展
  • 限制查询复杂度/深度
  • 批量查询
  • Apollo持久化查询
  • Apollo跟踪扩展
  • Apollo Federation(v2)

注意:最低支持的Rust版本:1.75.0或更高版本

示例

所有示例都在 子仓库 中,位于examples目录。

git submodule update # update the examples repo
cd examples && cargo run --bin [name]

有关更多信息,请参阅 子仓库 的README.md。

集成

集成是将 async-graphql 与您的Web服务器连接起来的粘合剂,这里提供了这些集成,或者您可以构建自己的集成!

crate 特性

本crate提供了以下特性。大多数特性默认未启用,除GraphiQL(graphiql)和GraphQL Playground(playground)集成外。

特性 启用
apollo_tracing 启用Apollo tracing 扩展
apollo_persisted_queries 启用Apollo 持久化查询扩展
bson 集成bson crate
bigdecimal 集成bigdecimal crate
cbor 支持serde_cbor
chrono 集成chrono crate
chrono-tz 集成chrono-tz crate
dataloader 支持DataLoader
decimal 集成rust_decimal crate
dynamic-schema 支持动态模式
fast_chemail 集成fast_chemail crate
graphiql 启用GraphiQL IDE集成
hashbrown 集成hashbrown crate
log 启用Logger 扩展
opentelemetry 启用OpenTelemetry 扩展
playground 启用GraphQL playground IDE集成
rawvalue 支持从serde_json的原始值
secrecy 集成secrecy crate
smol_str 集成smol_str crate
string_number 启用StringNumber
time 集成time crate
tracing 启用Tracing 扩展
tempfile 将上传的内容保存到临时文件。
tokio-sync 集成tokio::sync::RwLocktokio::sync::Mutex
unblock 支持异步读取 Upload
uuid uuid集成。
url url集成。

可观测性

在生产环境中监控你的graphql服务器所使用的工具之一是Apollo Studio。Apollo Studio是一个云平台,帮助你构建、监控、验证和确保你组织的数据图。添加扩展库async_graphql_apollo_studio_extension以使其可用。

谁在生产环境中使用async-graphql

社区展示

博客文章

参考文献

许可

许可如下

依赖项

~12–28MB
~493K SLoC