当前位置: 首页 > news >正文

项目实战--Spring Boot + GraphQL实现实时数据推送

背景

用户体验不断提升而3对实时数据的需求日益增长,传统的数据获取方式无法满足实时数据的即时性和个性化需求。
GraphQL作为新兴的API查询语言,提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架,利用GraphQL实现实时数据推送,满足对实时数据的需求。

一、GraphQL简介

GraphQL是一种用于API的查询语言,核心思想是让客户端能够根据自身需求精确地获取所需的数据,而不是像传统的RESTful API那样只能获取整个资源对象。GraphQL的特点包括:

(1)灵活性:客户端可以精确指定所需的数据字段,而不是被限制于服务器端提供的固定数据结构。
(2)效率:减少了不必要的数据传输和处理,提高了数据获取效率。
(3)类型系统:GraphQL具有严格的类型系统,能够在编译阶段检测出潜在的错误,提高了开发效率。
二、实现

在Spring Boot中集成GraphQL可以通过GraphQL Java库来实现。在pom.xml文件中添加GraphQL Java库的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-graphql</artifactId><version>2.7.9</version>
</dependency>

YAML配置:

spring:graphql:graphiql:enabled: truewebsocket:path: /graphqlschema:printer:enabled: truelocations: classpath:schema   #test.graphql文件位置file-extensions: .graphql

test.graphql文件:

#测试接口
#第一个graphql文件的type Mutation前不需要添加extend
type Mutation {#新增测试saveTest(testDto: TestDto):Boolean
}#第一个graphql文件的type Query前不需要添加extend
type Query {#获取列表测试getTestList(name: String!):[TestVo]
}#请求参数
input TestDto{"""ID"""id: Int!"""名称"""name: String!"""标题"""title: String"""备注"""remarks: String
}#返回参数
type TestVo{"""ID"""id: Int"""名称"""name: String"""标题"""title: String"""备注"""remarks: String
}

测试TestController接口:

/*** 测试TestController*/
@Slf4j
@RestController
public class TestController {/*** 新增测试* @return true:成功; false:失败*/@MutationMappingpublic Mono<Boolean> saveTest(@Argument Test test) {log.info("新增测试,请求参数:{}", JSON.toJSONString(test));return Mono.just(true);}/*** 获取列表测试* @param name* @return*/@QueryMappingpublic Mono<List<Test>> getTestList(@Argument String name) {log.info("获取列表测试,请求参数:{}", name);List<Test> tests = new ArrayList<>();Test test1 = new Test();test1.setId(1);test1.setName("测试1");test1.setTitle("标题1");test1.setRemarks("备注1");tests.add(test1);Test test2 = new Test();test2.setId(2);test2.setName("测试2");test2.setTitle("标题2");test2.setRemarks("备注2");tests.add(test2);return Mono.just(tests);}
}

结果:
在这里插入图片描述

第二种集成方式:
在pom.xml文件中添加GraphQL Java库的依赖:

<dependency><groupId>com.graphql-java-kickstart</groupId><artifactId>graphql-spring-boot-starter</artifactId><version>11.1.0</version>
</dependency>

然后定义GraphQL Schema,包括类型定义和查询操作。假设有一个简单的数据模型Message:

public class Message {private String id;private String content;// Getters and setters
}

接下来定义GraphQL查询操作和Resolver。假设要实现一个查询,用于获取所有消息列表:

@Component
public class GraphQLQueryResolver implements GraphQLQueryResolver {private List<Message> messages = new ArrayList<>();public List<Message> getMessages() {return messages;}
}

然后需要配置GraphQL Endpoint,使客户端可发送GraphQL请求。在application.properties文件中添加以下配置:

graphql.servlet.mapping=/graphql

最后启动Spring Boot应用,GraphQL Endpoint将会监听客户端的请求并返回相应的数据。

对于实时数据推送,可以使用GraphQL的订阅(Subscription)功能。假设实现一个订阅,用于实时推送新消息。首先,定义一个订阅类型和对应的Resolver:

@Component
public class GraphQLSubscriptionResolver implements GraphQLSubscriptionResolver {public Publisher<Message> newMessage() {//返回发出新消息的发布者return newPublisher -> {//可以在这里实现发出新消息的逻辑//简化为每秒发出一条新消息ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);executorService.scheduleAtFixedRate(() -> {Message message = // 生成新消息的逻辑newPublisher.onNext(message);}, 0, 1, TimeUnit.SECONDS);};}
}

然后,更新GraphQL Schema,添加订阅类型:

@GraphQLSchema
public class MyGraphQLSchema {@Beanpublic GraphQLSchema schema(GraphQLQueryResolver queryResolver,GraphQLSubscriptionResolver subscriptionResolver) {return SchemaParser.newParser().file("graphql/schema.graphqls") // 您的 GraphQL 架构文件.resolvers(queryResolver, subscriptionResolver).build().makeExecutableSchema();}
}

在GraphQL Schema文件中,定义新的订阅类型:

type Subscription {newMessage: Message!
}

现在,客户端可以通过订阅newMessage来实时接收新的消息。当有新消息时,服务器端将会自动推送给客户端。

三、使用场景

(1)实时监控系统:在监控系统中,可以利用GraphQL实时获取服务器、应用程序等的状态信息,并实时推送给用户。
(2)社交网络应用:在社交网络应用中,可以利用GraphQL实时获取用户的动态、消息等信息,并实时推送给关注的用户。
(3)在线游戏应用:在在线游戏应用中,可以利用GraphQL实时获取游戏状态、玩家位置等信息,并实时推送给玩家。
(4)股票交易系统:在股票交易系统中,可以利用GraphQL实时获取股票价格、交易量等信息,并实时推送给交易员。

相关文章:

项目实战--Spring Boot + GraphQL实现实时数据推送

背景 用户体验不断提升而3对实时数据的需求日益增长&#xff0c;传统的数据获取方式无法满足实时数据的即时性和个性化需求。 GraphQL作为新兴的API查询语言&#xff0c;提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架&#xff0c;利用GraphQL实现实时数据推…...

ASPICE是汽车软件开发中的质量保证流程

复杂的汽车系统对软件的质量和可靠性提出了极高的要求。为了确保汽车软件的高质量和可靠性&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff0c;汽车软件过程改进和能力确定&#xff09;流程应运而生。本文将对ASPICE流程进行详细介绍。 一、ASPICE概述 ASPICE是汽车行…...

Linux调试器-gdb使用以及Linux项目自动化构建工具-make/Makefile

目录 1.gdb背景2.开始使用gdb3.make/makefile 背景4.实例代码5.依赖关系6.依赖方法7.原理8.项目清理 1.gdb背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生…...

Html5前端基本知识整理与回顾下篇

今天我们继续结合发布的Html5基础知识点文档进行复习&#xff0c;希望对大家有所帮助。 目录 列表 无需列表 有序列表 自定义列表 样例 表格 基本属性 ​编辑 相关属性 Border Width Height ​编辑 表格标题 ​编辑 表格单元头 合并单元格 垂直单元格合并 水…...

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…...

什么样的开放式耳机好用?,五大超强卷王单品推荐!

对于热衷尝试不同耳机类型的小伙伴们而言&#xff0c;经过对佩戴舒适度、音质清晰度及电池续航能力的全面考量&#xff0c;开放式蓝牙耳机因其卓越的平衡性脱颖而出&#xff0c;成为多数人的心头好。其轻巧设计不仅保证了长时间佩戴的舒适感&#xff0c;还兼顾了音质与续航的双…...

java使用poi-tl模版引擎导出word之饼状图生成及循环批量生成饼状图

文章目录 一、单个饼状图生成1.word模版制作2.编写接口完整代码3.导出结果 二、批量生成饼图1.word模版制作2.编写接口完整代码3.导出结果 一、单个饼状图生成 1.word模版制作 在word中创建一个饼状图&#xff0c;点击图表&#xff0c;点击“文本选项”&#xff0c;在可选文字…...

指定版本ceph-common安装

如&#xff0c;安装15.2.13的ceph-common PACKAGE_NAMEceph-common CEPH_VERSION15.2.13 wget -q -O- https://download.ceph.com/keys/release.asc | sudo apt-key add - echo deb http://download.ceph.com/debian-${CEPH_VERSION}/ $(lsb_release -sc) main | sudo tee …...

C++语言特性——关键字(static、volatile、extern、const、mutable、inline)

注意&#xff1a; 本内容为摘抄网上的学习资料&#xff0c;作为个人笔记使用&#xff0c;如有侵权, 立刻删除。 C语言特性 1.关键字 &#xff08;1&#xff09;static static全局变量和普通全局变量 面试高频指数&#xff1a;★★★☆☆ 相同点&#xff1a; 存储方式&…...

在Ubuntu 16.04上安装和配置VNC的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 ###介绍 VNC&#xff0c;即“Virtual Network Computing”&#xff0c;是一种连接系统&#xff0c;允许您使用键盘和鼠标与远程服务器上…...

@RequestBody注解的使用及源码解析

前言 RequestBody 注解是我们进行JavaEE开发&#xff0c;最常见的几个注解之一&#xff0c;这篇博文我们以案例和源码相结合&#xff0c;帮助大家更好的了解 RequestBody 注解 使用案例 1.自定义实体类 Data NoArgsConstructor AllArgsConstructor public class User {priv…...

linux 服务器数据备份 和 mysql 数据迁移

查看域名ip 查看程序所处文件位置 list open files 1、 lsof -i :port 查看端口获取进程 pid 2、lsof -i pid 1、scp 下载服务器文件到本地 security copy protocol 2、导出服务器 mysql 数据库&#xff08;表&#xff09;到本地 mysqldump是MySQL自带的一个实用程序&…...

安防视频监控/云存储/视频汇聚EasyCVR平台播放设备录像不稳定,是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供7*24小时实时高清视频监控、云端录像、云存储、录像检索与回看、智能告警…...

S32V234平台开发(一)快速使用

快速使用 准备供电复位选择串口通信启动选择显示登陆系统 准备供电 s32v234可以使用两种电源供电 一种是左边电源端子&#xff0c;一种是右边电源适配器(12V 3A) 注意:不要同时使用两种电源同时供电 复位选择 Pressing POR RESET pulls active low EXT_POR signal on S32V2…...

C# 如何防止反编译?C#程序加密混淆保护方法大全

在C#开发中&#xff0c;由于.NET程序集&#xff08;assemblies&#xff09;是基于中间语言&#xff08;Intermediate Language, IL&#xff09;编译的&#xff0c;这些程序集可以被反编译回接近原始源代码的形式。为了保护代码不被轻易反编译&#xff0c;开发者可以采取以下几种…...

企业数字化转型中的低代码开发平台应用:释放创新潜能

随着信息技术的飞速发展&#xff0c;企业数字化转型已成为行业趋势。在这场转型浪潮中&#xff0c;低代码开发平台以其独特的优势&#xff0c;成为众多企业实现快速迭代、高效创新的得力助手。本文将深入探讨低代码开发平台在企业数字化转型中的应用&#xff0c;以及如何帮助企…...

因为目录问题开通的另外一个网站的美化过程

起 其实也不完全是目录&#xff0c;是查找问题过程中看到别人的界面好好看&#xff0c;而且确实那个目录很吸引我…… 然后我在csdn看了半天&#xff0c;看到一个有目录的我赶紧换上&#xff0c;结果并不能显示。而且把原来黑色模式的给搞没有了——它居然要vip了……所以………...

RedHat运维-Ansible自动化运维基础24-寻找问题常用模块

1. ansible.builtin.uri模块的作用是____________________________&#xff1b; 2. ansible.builtin.uri模块的作用是____________________________&#xff1b; 3. ansible.builtin.uri模块的作用是____________________________&#xff1b; 4. 试着用ansible.builtin.uri模块…...

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽&#xff0c;并尽快将未使用的带宽返回到可用带宽池。 在这里&#xff0c;我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps&#xff0c;这分别对应高速、全速、低速…...

哪有什么「历史的垃圾时间」,有的只是你对自己的不诚实

时间不会服从任何人的管理&#xff0c;它只会自顾自地流逝。— 李笑来《把时间当作朋友》 hi&#xff0c;欢迎来到我的杂货铺。 最近有个概念火了&#xff0c;叫做「历史的垃圾时间」。 看了下相关的文章&#xff0c;大概是在宣扬奥地利派经济学家米赛斯关于历史的一段论述&a…...

DeepSeek-OCR 技术解析:基于视觉压缩的端到端文档理解新范式

1. DeepSeek-OCR&#xff1a;重新定义文档理解的下一代技术 第一次接触DeepSeek-OCR时&#xff0c;我正被一个复杂的多栏报纸数字化项目困扰。传统OCR工具在处理这种复杂版面时&#xff0c;要么丢失栏目分隔信息&#xff0c;要么混淆文字顺序。直到尝试了DeepSeek-OCR的Gundam动…...

KEITHLEY 6221+2182A组合在霍尔测量中的5个实战技巧(避坑指南)

KEITHLEY 62212182A组合在霍尔测量中的5个实战技巧&#xff08;避坑指南&#xff09; 霍尔测量作为材料科学研究中的关键手段&#xff0c;对仪器精度和操作细节的要求近乎苛刻。KEITHLEY 6221电流源与2182A纳伏表的组合&#xff0c;凭借其出色的低噪声性能和微电流处理能力&…...

批量视频加图片水印工具使用指南

软件简介批量视频加图片水印工具是一款桌面端视频水印批量添加工具&#xff0c;支持单张/多张水印、九宫格固定位置、四种随机位置模式、大小和透明度调节、时间间隔水印等功能。核心功能功能说明单张水印所有视频使用同一张水印图片多张随机水印从水印文件夹中随机选择水印图片…...

SmolVLA部署案例:树莓派5+USB GPU加速器运行SmolVLA轻量版可行性探索

SmolVLA部署案例&#xff1a;树莓派5USB GPU加速器运行SmolVLA轻量版可行性探索 1. 引言 你有没有想过&#xff0c;让一个巴掌大的树莓派也能跑起来一个能“看懂”世界、听懂指令、并控制机器人动作的AI模型&#xff1f;这听起来像是科幻电影里的场景&#xff0c;但今天我们要…...

Qwen3-ASR-0.6B在新闻行业的应用:采访录音快速转写

Qwen3-ASR-0.6B在新闻行业的应用&#xff1a;采访录音快速转写 1. 引言 新闻记者每天都要面对大量的采访录音&#xff0c;传统的手工转写方式耗时耗力。一段30分钟的采访录音&#xff0c;熟练的转录员可能需要2-3小时才能完成转写&#xff0c;而且还要面对口音、专业术语、背…...

3分钟上手!Balena Etcher:安全烧录系统镜像的终极解决方案

3分钟上手&#xff01;Balena Etcher&#xff1a;安全烧录系统镜像的终极解决方案 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾因烧录系统镜像而丢失…...

drprov.dll文件丢失找不到 免费下载修复方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…...

你还在用StreamingResponse硬扛LLM流式?FastAPI 2.0全新AsyncIteratorResponse实践已落地金融级AI客服(限前500名获取迁移checklist)

第一章&#xff1a;FastAPI 2.0异步流式响应的核心演进与金融级落地价值FastAPI 2.0 将 StreamingResponse 的底层调度机制从 ASGI 的同步迭代器封装&#xff0c;全面升级为原生协程驱动的异步生成器&#xff08;async def ... yield&#xff09;&#xff0c;彻底消除事件循环阻…...

ADC0808搭配51单片机测电压:从芯片手册解读到量程切换逻辑的代码实现

ADC0808与51单片机电压测量系统&#xff1a;从芯片手册到智能量程切换的工程实践 在嵌入式系统开发中&#xff0c;精确的电压测量是许多应用的基础功能。ADC0808作为经典的8位模数转换器&#xff0c;与51单片机的组合曾是工业控制和仪器仪表领域的黄金搭档。本文将带您深入探索…...

告别SSH断连焦虑:用Tmux会话持久化拯救你的远程工作

远程开发者的救星&#xff1a;Tmux实战指南与高阶会话管理技巧 凌晨三点&#xff0c;服务器上的关键编译任务刚执行到一半&#xff0c;突然网络抖动导致SSH连接中断——这种令人抓狂的场景&#xff0c;每一位远程开发者都深有体会。传统终端会话的脆弱性让我们不得不反复重做工…...