項目實戰--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.pswp.cn/diannao/44269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44269.shtml
英文地址,請注明出處:http://en.pswp.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 數據庫是目前世界…