项目实战--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实时获取股票价格、交易量等信息,并实时推送给交易员。

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

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

相关文章

Java笔试|面试 —— 对多态性的理解

谈谈对多态性的理解&#xff1a; 一个事物的多种形态&#xff08;编译和运行时状态不一致性&#xff09; 实现机制&#xff1a;通过继承、重写和向上转型&#xff08;Object obj new 子类()&#xff09;来实现。 1.广义上的理解 子类对象的多态性&#xff0c;方法的重写&am…

visual studio 2022 在使用open3d出现的问题及解决方式

当出现以下问题&#xff1a; 使用open3d::utility::LogInfo系列出现LNK2001问题&#xff0c;如下所示&#xff1a;LNK2001 无法解析的外部符号 “char __cdecl fmt::v6::internal::decimal_point_impl(class fmt::v6::internal::locale_ref)” LNK2001 无法解析的外部符号 “p…

【C/C++】SDKDDKVer.h和WinSDKVer.h详解及二者区别

一.SDKDDKVer.h介绍 SDKDDKVer.h 是一个在 Windows 软件开发中常见的头文件&#xff0c;它用于定义软件开发工具包&#xff08;SDK&#xff09;和驱动开发工具包&#xff08;DDK&#xff09;的版本信息。这个文件通常位于 Visual Studio 安装目录下的 Include 子目录中。 …

GD32MCU如何实现掉电数据保存?

大家在GD32 MCU应用时&#xff0c;是否会碰到以下应用需求&#xff1a;希望在MCU掉电时保存一定的数据或标志&#xff0c;用以记录一些关键的数据。 以GD32E103为例&#xff0c;数据的存储介质可以选择内部Flash或者备份数据寄存器。 如下图所示&#xff0c;片内Flash具有10年…

学习数据库的增删改查

一、创建数据库和表 在进行增删改查操作之前&#xff0c;我们需要创建一个数据库和表。 1. 创建数据库 使用 CREATE DATABASE 语句创建数据库&#xff1a; CREATE DATABASE test_db;2. 选择数据库 使用 USE 语句选择数据库&#xff1a; USE test_db;3. 创建表 使用 CREA…

详解C语言结构体

文章目录 1.结构体的声明1.1 结构体的基础知识1.2 结构的声明1.3 结构成员的类型 1.4结构体变量的定义和初始化2.结构体成员的访问3.结构体传参 1.结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 …

【密码学】分组密码概述

一、分组密码的定义 分组密码和流密码都是对称密码体制。 流密码&#xff1a;是将明文视为连续的比特流&#xff0c;对每个比特或字节进行实时加密&#xff0c;而不将其分割成固定的块。流密码适用于加密实时数据流&#xff0c;如网络通信。分组密码&#xff1a;是将明文数据…

【React】Ant Design -- Table分页功能实现

实现步骤 为Table组件指定pagination属性来展示分页效果在分页切换事件中获取到筛选表单中选中的数据使用当前页数据修改params参数依赖引起接口重新调用获取最新数据 const pageChange (page) > {// 拿到当前页参数 修改params 引起接口更新setParams({...params,page})…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业&#xff0c;作为国内无机陶瓷膜元件及成套设备领域的佼佼者&#xff0c;以其庞大的生产规模、丰富的产品系列及卓越的研发实力&#xff0c;屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

【VUE进阶】安装使用Element Plus组件

Element Plus组件 安装引入组件使用Layout 布局button按钮行内表单菜单 安装 包管理安装 # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus浏览器直接引入 例如 <head><!-- I…

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测

Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测 目录 Transformer-LSTM预测 | Matlab实现Transformer-LSTM时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现Transformer-LSTM时间序列预测&#xff0c;Transformer-LSTM&#xf…

浅谈“不要卷模型,要卷应用”

目录 1.概述 2.AI技术应用场景探索 3.避免超级应用陷阱的策略 3.1.追求DAU的弊端 3.2.平衡用户活跃度与应用实用性的策略 4.个性化智能体开发 4.1. 用户需求分析与数据收集 4.2. 技术选择与开发 4.3. 个性化算法设计 4.4. 安全性与隐私保护 4.5. 多渠道集成与响应机…

用vite创建Vue3项目的步骤和文件解释

创建项目的原则是不能出现中文和特殊字符&#xff0c;最好为小写字母&#xff0c;数字&#xff0c;下划线组成 之后在visual studio code 中打开创建的这个项目 src是源代码文件 vite和webpack是有去别的&#xff0c;对于这个vite创建的工程来说index.js是入口文件 在终端里面输…

数字探秘:用神经网络解密MNIST数据集中的数字!

用神经网络解密MNIST数据集中的数字&#xff01; 一. 介绍1.1 MNIST数据集简介1.2 MLP&#xff08;多层感知器&#xff09;模型介绍1.3 目标&#xff1a;使用MLP模型对MNIST数据集中的0-9数字进行分类 二.数据预处理2.1 数据集的获取与加载2.2 数据集的探索性分析&#xff08;E…

骗子用出国月薪3万骗了1000多万上千名求职者被骗

日前,江苏省南通市崇川区人民法院开庭审理了一起涉及诈骗的案件,该案件 审理后引发全国求职者的关注以及热议。根据了解得知,这起案件的主犯是利用出 国劳务的虚假高薪职位位诱饵,最终有上千名求职者被骗上当了。文章来源于&#xff1a;股城网www.gucheng.com 根据法院审…

微信文件太大传不了?学会这些,微信秒变大文件传输神器

在数字化时代&#xff0c;微信已成为我们日常沟通的重要桥梁。然而&#xff0c;当需要在微信上传输大文件时&#xff0c;文件大小的限制往往让人束手无策。 今天&#xff0c;我们将分享一些实用的技巧&#xff0c;帮助你在微信上轻松传输大文件&#xff0c;无论是工作文档还是…

HTTP 概况

Web的应用层协议是超文本传输协议(HyperTextTransferProtocol&#xff0c;HTTP)&#xff0c;它是 Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中&#xff0c;通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及…

彩虹小插画:成都亚恒丰创教育科技有限公司

彩虹小插画&#xff1a;色彩斑斓的梦幻世界 在繁忙的生活节奏中&#xff0c;总有一抹温柔的色彩能悄然触动心弦&#xff0c;那就是彩虹小插画带来的梦幻与宁静。彩虹&#xff0c;这一自然界的奇迹&#xff0c;被艺术家们巧妙地融入小巧精致的插画之中&#xff0c;不仅捕捉了瞬…

事务未释放问题排查

事务未释放问题现象&#xff1a;一般会导致大量锁表现象。 排查&#xff1a;查看所有锁表报错的日志是否都是同一个线程号上的&#xff0c;找到最开始的报错并进行分析。

Oracle基础以及一些‘方言’(一)

1、什么是Oracle ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据库是目前世界…