知海

Go:samsarahq/thunder(支持实时查询与批处理)

graphql-github-io-zh-Hans生态项目与库

Go:samsarahq/thunder(支持实时查询与批处理)

项目简介

samsarahq/thunder 是一个基于 Go 语言实现的 GraphQL 服务端库,旨在提供一套简洁高效的开发体验。它内置了 schema 自动构建、实时查询(Live Queries)以及查询批处理(Batching)等核心能力,适用于需要构建高性能、具备实时数据推送能力的 GraphQL API 场景。

核心特性

  • 易用的 Schema 构建:通过 Go 结构体与方法定义即可快速生成 GraphQL Schema,无需手写冗长的 SDL。
  • 实时查询(Live Queries):内置对实时数据更新的支持,客户端可以订阅查询结果的变化,并自动接收增量更新。
  • 批处理(Batching):自动将同一数据加载器(Loader)在单次请求内的多次数据获取合并为一次底层调用,减少数据库或外部 API 的压力,显著提升查询性能。
  • 面向 Go 生态优化:充分利用 Go 的并发模型与类型系统,与现有 Go 服务无缝集成。

快速开始

以下示例展示如何使用 thunder 构建一个简单的 GraphQL 服务:

go 复制代码
package main

import (
    "context"
    "fmt"
    "net/http"

    "github.com/samsarahq/thunder/graphql"
    "github.com/samsarahq/thunder/graphql/introspection"
    "github.com/samsarahq/thunder/graphql/schemabuilder"
    "github.com/samsarahq/thunder/graphql/serve"
)

type User struct {
    ID   int64
    Name string
}

// 定义 Schema
func buildSchema() *graphql.Schema {
    builder := schemabuilder.NewSchema()

    // 定义对象类型
    builder.Object("User", User{}, func(obj *schemabuilder.Object) {
        obj.Field("id", func(u *User) int64 { return u.ID })
        obj.Field("name", func(u *User) string { return u.Name })
    })

    // 定义查询根节点
    query := builder.Query()
    query.Field("user", func(ctx context.Context, args struct{ ID int64 }) (*User, error) {
        // 模拟数据查询
        return &User{ID: args.ID, Name: fmt.Sprintf("User %d", args.ID)}, nil
    })

    schema := builder.MustBuild()
    introspection.AddIntrospectionToSchema(schema) // 可选:启用 introspection
    return schema
}

func main() {
    schema := buildSchema()

    http.Handle("/graphql", serve.Handler(schema))
    http.Handle("/graphql/query", serve.Handler(schema))

    fmt.Println("GraphQL server listening on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

使用场景

  • 需要实时更新数据(如通知、动态信息流)的 Web 或移动端应用。
  • 面对 N+1 查询问题,希望简化数据加载逻辑并提升 API 吞吐量的服务端项目。
  • 偏好通过 Go 代码维护 GraphQL Schema,并希望获得类型安全的开发体验的团队。

项目资源

帮助我们改进文档

发现翻译问题或内容错误?请告诉我们。