Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[翻译]构建带 Subscriptions 的 graphql golang 后端

[翻译]构建带 Subscriptions 的 graphql golang 后端

作者头像
Fred Liang
发布于 2018-08-02 02:06:12
发布于 2018-08-02 02:06:12
2.8K10
代码可运行
举报
文章被收录于专栏:Fred LiangFred Liang
运行总次数:0
代码可运行

GraphQL提供了一种灵活而有效的方式来查询服务器中的数据。 它正在成为设计后端的流行技术,通常会替换或封装一些不灵活的REST API,并让客户负责决定他们需要的数据。 现在有许多用于编写JavaScript的GraphQL客户端和服务器的库和框架,其中最着名的是Apollo和Graphcool 。 Apollo团队还开发了针对WebSockets的GraphQL协议,该协议主要用于Apollo Client和Graphcool中的Subscriptions。

1.介绍graphqlws

今天,我们开放了一个新的Go库来填补这个空白: graphqlw。 它有一个简单的目的:

  1. 实现GraphQL在WebSocket(由所有流行的GraphQL客户端使用),所以不必考虑与net/http无缝集成
  2. 与net/http无缝集成
  3. 提供访问已建立订阅的简单方法,执行身份验证并向相应的客户端发送更新。 你可以在https://github.com/functionalfoundry/graphqlws上的GitHub上找到它。

第1步 - 基本设置

使用graphqlws在WebSocket端点上设置GraphQL很简单。 创建一个GraphQL模式,创建一个订阅管理器,为WebSocket上的通信创建一个HTTP处理程序,然后使用net/http服务处理程序。 或者,您可以定义一个函数来对用户进行身份验证(在建立新连接时,Apollo客户端会将初始WebSocket消息与可选的authToken一起发送;该函数允许将令牌字符串解析为用户)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
	"net/http"

	"github.com/functionalfoundry/graphqlws"
	"github.com/graphql-go/graphql"
)

func main() {
	// Create a GraphQL schema with a subscription object
	schema, err := graphql.NewSchema(graphql.SchemaConfig{
		Subscription: graphql.NewObject(...),
	})
	
	// Create a subscription manager
	subscriptionManager := graphqlws.NewSubscriptionManager(&schema)

	// Create a WebSocket/HTTP handler
	graphqlwsHandler := graphqlws.NewHandler(graphqlws.HandlerConfig{
		// Wire up the GraphqL WebSocket handler with the subscription manager
		SubscriptionManager: subscriptionManager,

		// Optional: Add a hook to resolve auth tokens into users that are
		// then stored on the GraphQL WS connections
		Authenticate: func(authToken string) (interface{}, error) {
			// This is just a dumb example
			return "Joe", nil
		},
	})

	// The handler integrates seamlessly with existing HTTP servers
	http.Handle("/subscriptions", graphqlwsHandler)
	http.ListenAndServe(":8080", nil)
}

第2步 - 使用 Subscriptions

Graphqlws库本身仅仅实现了基于WebSocket协议的GraphQL。 它没有实现任何开箱即用的订阅。 一个典型的服务器实现将监听数据库的变化,并通过识别哪些订阅需要更新,重新执行这些订阅的查询并将结果发送给相应的订阅客户端来对这些更改做出反应。

以下代码示例显示了订阅管理器在任何时候如何检索订阅。 他们按照他们的关系分组。 每个连接都有唯一的ID,可选地,还有前面描述的Authenticate函数返回的用户。

每个订阅都存储订阅查询( QueryVariablesOperationName )以及可用于识别订阅的数据类型(例如FieldsDocument )的其他信息。

使用QueryVariablesOperationName可以在需要时重新执行订阅查询。 然后可以通过SendData方法将结果发送到订阅客户端,如下面的代码示例所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// This assumes you have access to the above subscription manager
subscription := subscriptionManager.Subscriptions()

for _, conn := range subscriptions {
	// Things you have access to here:
	conn.ID()   // The connection ID
	conn.User() // The user returned from the subscription manager's Authenticate
	
	for _, subscription := range subscriptions[conn] {
		// Things you have access to here:
		subscription.ID            // The subscription ID (unique per conn)
		subscription.OperationName // The name of the subcription
		subscription.Query         // The subscription query/queries string
		subscription.Variables     // The subscription variables
		subscription.Document      // The GraphQL AST for the subscription
		subscription.Fields        // The names of top-level queries
		subscription.Connection    // The GraphQL WS connection

		// Prepare an execution context for running the query
		ctx := context.Context()

		// Re-execute the subscription query
		params := graphql.Params{
			Schema:         schema, // The GraphQL schema
			RequestString:  subscription.Query,
			VariableValues: subscription.Variables,
			OperationName:  subscription.OperationName,
			Context:        ctx,
		}
		result := graphql.Do(params)

		// Send query results back to the subscriber at any point
		data := graphqlws.DataMessagePayload{
			// Data can be anything (interface{})
			Data:   result.Data, 
			// Errors is optional ([]error)
			Errors: graphqlws.ErrorsFromGraphQLErrors(result.Errors),
		}
		subscription.SendData(&data)
	}
}

第3步 - 与graphql-go / handler结合使用

结合使用WebSocket端点上的GraphQL和普通的GraphQL HTTP端点,就像其他任何net/http处理程序一样工作。 您只需创建两个处理程序并通过不同的路线提供服务。 以下代码示例演示了这一点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
	"net/http"
	
	"github.com/functionalfoundry/graphqlws"
	"github.com/graphql-go/graphql"
	"github.com/graphql-go/handler"
)

func main() {
	// Create a GraphQL schema with a subscription object
	schema, err := graphql.NewSchema(graphql.SchemaConfig{
		Subscription: graphql.NewObject(...),
	})
	
	// Create a GraphQL over WebSocket handler
	subscriptionManager := graphqlws.NewSubscriptionManager(&schema)
	graphqlwsHandler := graphqlws.NewHandler(graphqlws.HandlerConfig{
		SubscriptionManager: subscriptionManager,
	})
	
	// Create a GraphQL over HTTP handler
	graphqlHandler := handler.New(&handler.Config{
		Schema: &schema,
		Pretty: true,
		GraphiQL: true,
	})
	
	// Serve both handlers on different endpoints
	http.Handle("/", graphqlHandler)
	http.Handle("/subscriptions", graphqlwsHandler)
	http.ListenAndServe(":8080", nil)
}

概要

如果你已经做到了这一点,你可能有兴趣使用Go作为你自己的GraphQL服务器。 借助graphqlws,现在可以轻松实现服务器端GraphQL订阅。 来吧,你可以尝试一下! 我们希望你喜欢它。


GitHub上提交 bug 或 issue 。

如果您正在寻找下一个项目的React或GraphQL开发方面的帮助,我们很乐意在Functional Foundry处听到您的消息。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
elastic和graphQL可以混用吗
elastic和graphQL可以混用吗
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
GraphQL:现代API设计的革新
GraphQL是由Facebook在2012年开发并于2015年开源的一种查询语言,用于构建API。与传统的REST API相比,GraphQL提供了一种更高效、更灵活的数据查询方式。本文将从GraphQL的基本概念、核心特性、实际使用以及优缺点等方面进行详细介绍。
IT蜗壳-Tango
2024/06/23
2630
使用 GraphQL 进行 API 设计:从入门到实战
作为一名开发者,我一直对 API 设计充满兴趣。最初,我主要使用 RESTful API,但随着前端需求的日益复杂,REST 的一些局限性逐渐显现,比如数据过载(获取的字段太多)和数据不足(一次请求拿不到所需的数据)。后来,我接触了 GraphQL,它的灵活性和高效性让我眼前一亮。
Echo_Wish
2025/02/28
3620
使用 GraphQL 进行 API 设计:从入门到实战
前端开发使用GraphQL——VUE3使用GraphQL
新项目采用了vue3开发,而目前vue对应的QraphQL模块vue-apollo对使用typescript开发的vue3框架支持不是很好(目前正在开发的Vue Apollo 4 将支持 Vue 3),没法利用typescript来检查GraphQL接口拉回来的数据,这里记录一下处理这些问题的方式。
骑猪耍太极
2021/06/24
4.3K0
前端开发使用GraphQL——VUE3使用GraphQL
graphql攻击思路
可以直接看数据包,更能直观的了解graphql,比如hackerone就是用的graphql
tea9
2023/11/22
3640
实践微服务,第14部分:GraphQL
在实践微服务系列博客的这一篇中,我们将看看如何使用GraphQL将Account对象提供给我们的客户端。
杜逸先
2018/06/27
2.7K0
实践微服务,第14部分:GraphQL
GraphQL 实战篇之前端Vue+后端Nest
前面我们介绍了GraphQL的概念和基础知识,这篇文章记录下使用Nestjs+GraphQL搭建Node服务。
winty
2021/05/18
1.3K0
GraphQL 实战篇之前端Vue+后端Nest
C# 一分钟浅谈:GraphQL 中的订阅与发布
随着 Web 技术的发展,GraphQL 已经成为一种流行的 API 查询语言,它允许客户端精确地请求所需的数据,从而提高数据加载效率。除了查询和变更操作外,GraphQL 还支持订阅功能,使得客户端能够实时接收服务器端的数据更新。本文将从 C# 的角度出发,浅谈 GraphQL 中的订阅与发布机制,包括常见问题、易错点及如何避免,并通过代码案例进行详细解释。
Jimaks
2024/11/29
2420
【愚公系列】2023年07月 .NET CORE工具案例-GraphQL.Server(使用MVC控制器进行配置)
GraphQL是一种用于API的查询语言和运行时环境。它是由Facebook于2012年开始内部使用,2015年对外宣布开源。GraphQL旨在解决RESTful API的一些限制,如需要多次请求才能获取完整数据、难以扩展、无法精确控制数据返回等。
愚公搬代码
2025/05/28
560
【愚公系列】2023年07月 .NET CORE工具案例-GraphQL.Server(使用MVC控制器进行配置)
《GraphQL 名词 101:解析 GraphQL 的查询语法》【译】
GraphQL 日渐成为数据查询的主流标准之一。每天都会产生许多围绕这项技术发展的精彩讨论和新工具。GraphQL最棒的特性就是提供了一个丰富语言集来描述获取数据的API。但是用户该如何描述这种查询语言,以及GraphQL这项核心技术本身呢?let's talk!
腾讯IVWEB团队
2020/06/29
3.2K0
GraphQL 从入门到实践
本文首先介绍了 GraphQL,再通过 MongoDB + graphql + graph-pack 的组合实战应用 GraphQL,详细阐述如何使用 GraphQL 来进行增删改查和数据订阅推送,并附有使用示例,边用边学印象深刻~
前端下午茶
2019/06/27
2.7K0
GraphQL 从入门到实践
.NET与GraphQL的碰撞:新一代的数据交互与演示
GraphQL是一种为API设计的查询语言,与REST相比,它提供了更高效、强大和灵活的方法来与数据交互。GraphQL由Facebook于2012年开发,并于2015年开源。其主要的优势在于能够允许客户端精确地指定他们需要的数据,从而避免了过度获取或数据不足的问题。
Wesky
2024/10/21
1590
.NET与GraphQL的碰撞:新一代的数据交互与演示
GraphQL到底怎么使?看看智联前端团队技术沉淀
此文是作者考虑 GraphQL 在 Node.js 架构中的落地方案后所得。从最初考虑可以(以内置中间件)加入基础服务并提供完整的构建、发布、监控支持,到最终选择不改动基础服务以提供独立包适配,不限制实现技术选型,交由业务团队自由选择的轻量方式落地。中间经历了解除误解,对收益疑惑,对最初定位疑惑,最终完成利弊权衡的过程。
coder_koala
2020/07/01
2.5K0
GraphQL 实践与服务搭建
大概率你听说过 GraphQL,知道它是一种与 Rest API 架构属于 API 接口的查询语言。但大概率你也与我一样没有尝试过 GraphQL。
愧怍
2022/12/27
5.6K0
GraphQL 实践与服务搭建
原 以太坊-rpc原理及实现
以太坊-rpc原理及实现 JSON-RPC是区块链外部调用的标配了。以太坊同样也实现了这个功能。底层支持四种协议:InProc,IPC,HTTP,WEBSOCKED。上层除了常规的方法调用之外还实现了Pub/Sub功能。本文主要分析以太坊是如何支持这些个功能的。 api发布 api接口分布在各个模块,主要分为两种 1:直接code再Node中的几个service(admin,web3j,debug etc) 2: 实现了Service接口的服务结构,已经注册的服务会调用APIs()方法获得其中的api。 /
魂祭心
2018/05/17
1.3K0
GraphQL测试实践
我们很熟悉以REST实现的API,可以用任何能够发出http 请求的库或者工具来测试REST API。去年随着GraphQL在全球风靡,它也出现在了最近两期的ThoughtWorks技术雷达中,当我们面对新的GraphQL APi时,QA应如何应对? 知彼知己,方能百战百胜,下面让我们首先来看看什么是GraphQL,它和传统的REST API又有什么不同?
ThoughtWorks
2019/11/14
2.2K0
GraphQL:如何构建灵活的数据 API,让前后端握手言和?
在 Web 开发世界里,前后端“吵架”似乎是常态。后端开发者希望返回结构清晰的数据,而前端开发者希望只拿自己需要的字段,不要多、不用少。REST API 虽然经典,但数据结构固定,往往造成前端拿到了一大堆自己不需要的数据,或者缺少一些关键信息,不得不再请求一次,白白增加了网络开销。
Echo_Wish
2025/05/08
1720
GraphQL:如何构建灵活的数据 API,让前后端握手言和?
GraphQL实践10——Netflix Dgs Graphql异步订阅
由于异步通知无法用浏览器自带的控制台测试,只能通过GraphQL客户端订阅后接收异步通知,此处参考官方最佳实践,使用单元测试模拟
F嘉阳
2022/11/02
6510
Golang中用到的的Websocket库
在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开发者社区已经从 HTTP 长轮询和 AJAX 走了很长一段路,终于找到了构建真正实时应用程序的解决方案。该解决方案以 WebSockets 的形式出现,它可以在用户的浏览器和服务器之间打开交互式会话。WebSockets 允许浏览器向服务器发送消息并接收事件驱动的响应,而无需轮询服务器以获取回复。目前,WebSockets 是构建实时应用程序的首选解决方案:在线游戏、即时通讯工具、跟踪应用程序等。本指南解释了 WebSockets 的运行方式,并展示了我们如何使用 Go 编程语言构建 WebSocket 应用程序。
没有故事的陈师傅
2021/09/09
2.1K0
使用Go语言创建WebSocket服务
今天介绍如何用Go语言创建WebSocket服务,文章的前两部分简要介绍了WebSocket协议以及用Go标准库如何创建WebSocket服务。第三部分实践环节我们使用了gorilla/websocket库帮助我们快速构建WebSocket服务,它帮封装了使用Go标准库实现WebSocket服务相关的基础逻辑,让我们能从繁琐的底层代码中解脱出来,根据业务需求快速构建WebSocket服务。
KevinYan
2020/03/26
6.7K0
Spring认证_什么是Spring GraphQL?
什么是Spring GraphQL前沿学习部分:https://cloud.tencent.com/developer/article/1857280
IT胶囊
2021/08/09
1.9K0
相关推荐
GraphQL:现代API设计的革新
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档