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

背景

用户体验不断提升而3对实时数据的需求日益增长,传统的数据获取方式无法满足实时数据的即时性和个性化需求。

GraphQL作为新兴的API查询语言,提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架,利用GraphQL实现实时数据推送,满足对实时数据的需求。

一、GraphQL简介

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

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

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

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-graphql</artifactId>
    <version>2.7.9</version>
</dependency>

YAML配置:

yaml 复制代码
spring:
  graphql:
    graphiql:
      enabled: true
    websocket:
      path: /graphql
    schema:
      printer:
        enabled: true
      locations: classpath:schema   #test.graphql文件位置
      file-extensions: .graphql

test.graphql文件:

sql 复制代码
#测试接口
#第一个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接口:

java 复制代码
/**
 * 测试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库的依赖:

xml 复制代码
<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>11.1.0</version>
</dependency>

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

java 复制代码
public class Message {
    private String id;
    private String content;
    // Getters and setters
}

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

java 复制代码
@Component
public class GraphQLQueryResolver implements GraphQLQueryResolver {
    private List<Message> messages = new ArrayList<>();

    public List<Message> getMessages() {
        return messages;
    }
}

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

yaml 复制代码
graphql.servlet.mapping=/graphql

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

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

java 复制代码
@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,添加订阅类型:

java 复制代码
@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文件中,定义新的订阅类型:

java 复制代码
type Subscription {
    newMessage: Message!
}

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

三、使用场景

(1)实时监控系统 :在监控系统中,可以利用GraphQL实时获取服务器、应用程序等的状态信息,并实时推送给用户。

(2)社交网络应用 :在社交网络应用中,可以利用GraphQL实时获取用户的动态、消息等信息,并实时推送给关注的用户。

(3)在线游戏应用 :在在线游戏应用中,可以利用GraphQL实时获取游戏状态、玩家位置等信息,并实时推送给玩家。

(4)股票交易系统:在股票交易系统中,可以利用GraphQL实时获取股票价格、交易量等信息,并实时推送给交易员。

相关推荐
海绵宝宝转agent43 分钟前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭1 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT1 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071572 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境3 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路3 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师3 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师3 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
谢亮_vipxieliang3 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
Zootopia6263 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信