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

news2024/9/29 17:29:48
背景

用户体验不断提升而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: true
    websocket:
      path: /graphql
    schema:
      printer:
        enabled: true
      locations: 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:失败
     */
    @MutationMapping
    public Mono<Boolean> saveTest(@Argument Test test) {
        log.info("新增测试,请求参数:{}", JSON.toJSONString(test));
        return Mono.just(true);
    }
 
    /**
     * 获取列表测试
     * @param name
     * @return
     */
    @QueryMapping
    public 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 {
    @Bean
    public 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.coloradmin.cn/o/1913677.html

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

相关文章

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…

叉车防撞系统:揭秘其多样化工作模式

叉车&#xff0c;作为物流仓储领域的重要工具&#xff0c;其安全性一直备受关注。随着科技的进步&#xff0c;叉车防撞系统应运而生&#xff0c;成为了叉车驾驶员的得力助手。那么&#xff0c;叉车防撞系统究竟是如何实现其安全防护的呢&#xff1f;让我们一同揭开&#xff0c;…

必看 | 最简单获取IP地址专用SSL证书的申请方法

申请IP地址专用的SSL证书并不像传统SSL证书那样普及&#xff0c;不是所有服务商都提供IP地址的SSL证书&#xff0c;因此需要仔细选择合适的服务商和流程进行操作申请&#xff0c;以此来实现IP地址访问的https。以下是最简单的IP地址专用SSL证书申请方法&#xff1a; 一、准备 …

YOLOv10改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv10最新改进&#xff0c;为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数&#xff0c;形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本损失函数&#xff0c;同时还结合了Focus和…

nprogress进度条插件

打开一个页面时&#xff0c;往往会伴随一些请求&#xff0c;并且会在页面上方出现进度条。它的原理时&#xff0c;在我们发起请求的时候开启进度条&#xff0c;在请求成功后关闭进度条&#xff0c;所以只需要在request.js中进行配置。 如下图所示&#xff0c;我们页面加载时发起…

一套完善的孕产妇保健信息化管理平台源码:管理了孕妇从怀孕开始到生产结束42天以内的一系列医院保健服务信息

数字化产科管理平台源码&#xff0c;智慧产科系统源码&#xff0c;采用java语言开发&#xff0c;前端框架为Vue&#xff0c;ElementUIMySQL数据库&#xff0c;前后端分离架构的数字化产科管理系统源码&#xff0c;自主版权&#xff0c;多个大型综合医院、妇幼保健院应用案例&am…

小米恢复联系人,跟着这2个步骤,让你的社交重回巅峰

当你突然发现小米手机里的联系人列表变得空空如也&#xff0c;是不是感觉就像失去了与外界沟通的“秘密武器”&#xff1f;别担心&#xff0c;这并不意味着你真的失去了他们。他们可能只是藏在了手机里的某个神秘角落&#xff0c;等待着你的召唤。接下来&#xff0c;小编将会介…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程&#xff0c;当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

基于STM32的智能加湿器

1.简介 基于STM32的加湿器发展前景非常乐观&#xff0c;这主要得益于其在技术、市场需求、应用场景以及政策支持等多方面的优势。STM32微控制器具备强大的处理能力和丰富的外设接口&#xff0c;能够实现精确的湿度监测和智能化控制。基于STM32的加湿器可以根据环境湿度自动调节…

如何在 Windows 10 上恢复未保存的 Word 文档

您是否整晚都在处理一个重要的 word 文件&#xff0c;但忘记保存它了&#xff1f;本文适合您。在这里&#xff0c;我们将解释如何恢复未保存的 word 文档。除此之外&#xff0c;您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生&#xff0c;每个人都了解丢失重要 W…

亚信安全新一代终端安全TrustOne2024年重磅升级

以极简新主义为核心&#xff0c;亚信安全新一代终端安全TrustOne自2023年发布以来&#xff0c;带动了数字化终端安全的革新。60%&#xff0c;安装部署及管理效率的提升&#xff1b;50%&#xff0c;安全管理资源的节省&#xff1b;100%&#xff0c;信创非信创场景的全覆盖。Trus…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

Nifi内置处理器Processor的开发

Nifi-Processor自定义开发的流程 之前说过&#xff0c;大部分的数据处理&#xff0c;我们可以基于ExcuseGroovyScript处理器&#xff0c;编写Groovy脚本去完成&#xff08;或者Jpython&#xff0c;Js脚本等对应的组件&#xff09;&#xff0c;只能说这是基于Nifi平台的使用层面…

Mxnet转Onnx 踩坑记录

0. 前言 使用将MXNET模型转换为ONNX的过程中有很多算子不兼容&#xff0c;在此对那些不兼容的算子替换。在此之前需要安装mxnet分支v1.x版本作为mx2onnx的工具&#xff0c;git地址如下&#xff1a; mxnet/python/mxnet/onnx at v1.x apache/mxnet GitHub 同时还参考了如下…

李良济“小儿推拿妈妈班”圆满结课,以中医智慧守护儿童健康成长!

孩子生场病&#xff0c;妈妈半条命&#xff01;作为妈妈最害怕的就是孩子生病&#xff0c;自己又无能为力&#xff01; 为了帮助妈妈们&#xff0c;正确应对孩子健康问题&#xff0c;日常生活中科学帮助孩子提升体质少生病&#xff01; 参加此次课程的&#xff0c;不仅有妈妈&a…

8.7结构体const使用场景

代码 #include <iostream> using namespace std; #include <string>//const使用场景//定义学生结构体 struct student {string name;int age;int score; };//将函数中的形参改为指针&#xff0c;可以减少内存空间&#xff0c;而且不会复制出新的副本 void printSt…

Spring Cloud LoadBalancer 入门与实战

一、什么是 LoadBalancer? LoadBalancer(负载均衡器) 是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载&#xff08;请求&#xff09;到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和新能。 1.1 负载均衡分类 负载均衡…

微信小程序中wx.navigateBack()页面栈返回上一页时执行上一页的方法或修改上一页的data属性值

let pages getCurrentPages();let prevPage pages[pages.length - 2]; // 获取上一个页面实例对象console.log(prevPage) //打印信息// 在 wx.navigateBack 的 success 回调中执行需要的方法wx.navigateBack({delta: 1, // 返回上一页success: function() {//修改上一页的属性…

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

1、Oracle的查询语法结构 Oracle 的单表查询的语法结构&#xff1a; SELECT 1 FROM 2 WHERE 3 GROUP BY 4 HAVING 5 ORDER BY 6 其每个关键词的功能与MySQL中的功能已知&#xff0c;不过分页查询的关键词 limit 并不在Oracle的语法结构中。伪列&#xff1a; 在 Oracle 的表的使…

三品PLM管理系统软件:制造企业工程变更管理的革新者

在当今快速变化的市场环境中&#xff0c;制造企业面临着前所未有的挑战。客户需求的不断变化、供应链的波动、设计过程中的不确定性以及产品生命周期的缩短&#xff0c;都要求企业能够迅速响应并适应这些变化。工程变更管理作为企业响应市场变化、提升产品竞争力的关键环节&…