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

网站备案表格下载教育培训机构管理系统

网站备案表格下载,教育培训机构管理系统,多少关键词排名优化软件,黑客基础菜鸟入门教程更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ Spring WebFlux之SSE服务器发送事件 1. 什么是 SSE?2. Spring Boot 3 响应式编程与 SSE为什么选择响应式编程实现 SSE? 3. 实现 SSE 的基本步骤3.…

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

在这里插入图片描述

Spring WebFlux之SSE服务器发送事件

  • 1. 什么是 SSE?
  • 2. Spring Boot 3 响应式编程与 SSE
    • 为什么选择响应式编程实现 SSE?
  • 3. 实现 SSE 的基本步骤
    • 3.1 创建 Spring Boot 项目
    • 3.2 实现服务端推送 SSE 事件流
    • 3.3 客户端接收 SSE 数据
  • 4. 测试 SSE
  • 5. 优化与扩展
    • 5.1 增加随机数据推送
    • 5.2 增加心跳检测(Ping)
    • 5.3 使用 `MediaType.TEXT_EVENT_STREAM` 响应
  • 6. SSE 与 WebSocket 的对比
  • 7. 总结

ChatGPT 刚出的时候,让大伙很好奇的是它是如何实现的逐字输出的?答案就是 SSE (服务器发送事件)。随着实时数据和响应式编程的需求不断增加,服务器发送事件(Server-Sent Events,简称 SSE)在现代 Web 应用程序中越来越受欢迎。SSE 提供了一种轻量级的服务器推送数据给客户端的方式,适合用于监控、实时通知、股票价格更新等场景。

在 Spring Boot 3 中,结合响应式编程的理念,SSE 的实现变得更加简洁和高效。本文将详细介绍如何使用 Spring Boot 3 来实现 SSE 服务端推送,并讨论响应式编程在此过程中的重要性和优势。

1. 什么是 SSE?

服务器发送事件(SSE) 是一种从服务器向客户端推送数据的技术,属于 HTML5 的一部分。与传统的 HTTP 请求-响应模型不同,SSE 是单向的,服务器可以持续不断地向客户端发送数据,而客户端通过一次长连接持续接收这些更新。

相比 WebSocket,SSE 有以下特点:

  • 单向通信:SSE 仅允许服务器向客户端推送数据,客户端无法向服务器发送数据。
  • 基于 HTTP 协议:SSE 是建立在 HTTP 协议之上的,浏览器原生支持,不需要额外的协议处理。
  • 自动重连:SSE 支持自动重连,当连接意外断开时,客户端会自动尝试重新连接服务器。

2. Spring Boot 3 响应式编程与 SSE

Spring Boot 3 提供了对响应式编程的全面支持,基于 Project Reactor 实现异步、非阻塞的流式数据处理。而响应式编程非常适合实现 SSE,因为它允许我们以非阻塞的方式持续推送数据,而不会阻塞服务器的资源。

Spring WebFlux 是 Spring Boot 3 中用于构建响应式应用的核心框架,它可以无缝集成 SSE,为我们提供简单高效的服务器推送功能。

为什么选择响应式编程实现 SSE?

传统的阻塞式编程在处理长连接(如 SSE)时可能会占用大量服务器资源。响应式编程通过非阻塞 I/O 操作,不仅可以高效处理长时间的连接,还能在有新数据时立即推送给客户端。响应式流(如 Flux)天然适合于这种流式数据推送场景。

3. 实现 SSE 的基本步骤

我们将通过以下步骤实现一个简单的 SSE 服务端推送应用:

  1. 创建 Spring Boot 项目并引入 WebFlux 依赖。
  2. 实现服务端推送 SSE 事件流。
  3. 编写客户端接收 SSE 数据。
  4. 测试与优化。

3.1 创建 Spring Boot 项目

首先,创建一个新的 Spring Boot 3 项目,并确保引入了 spring-boot-starter-webflux 依赖。可以通过 Maven 或 Gradle 配置:

Maven 依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>
</dependencies>

3.2 实现服务端推送 SSE 事件流

在 Spring WebFlux 中,SSE 通过返回 Flux<ServerSentEvent<T>> 这种响应流来实现。下面我们实现一个简单的 SSE 控制器,它会每隔一段时间向客户端推送当前的时间信息。

示例控制器

package com.coderjia.boot3webflux.controller;import org.springframework.http.codec.ServerSentEvent;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import reactor.core.publisher.Flux;import java.time.Duration;
import java.time.LocalTime;/*** @author CoderJia* @create 2024/10/27 下午 07:03* @Description**/
@Controller
public class SseController {@GetMapping("/sse/stream")public Flux<ServerSentEvent<String>> streamSse() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> ServerSentEvent.<String>builder().id(String.valueOf(sequence)).event("periodic-event").data("Current time: " + LocalTime.now()).build());}
}

解释

  • Flux.interval(Duration.ofSeconds(1)):创建一个每秒发出事件的响应式流。
  • ServerSentEvent.builder():构建 ServerSentEvent 对象,它可以包含 ideventdata 等信息,符合 SSE 规范。
  • map():将流中的每个事件映射为 ServerSentEvent,并附带当前的时间信息。

3.3 客户端接收 SSE 数据

客户端可以使用 JavaScript 原生的 EventSource API 来接收服务器发送的 SSE 数据流。

示例 HTML + JavaScript 客户端

resources/static/index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>SSE Example</title>
</head>
<body>
<h1>Server-Sent Events (SSE) Example</h1>
<div id="messages"></div>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>const http = axios.create({baseURL: 'http://localhost:8080/',timeout: 100000,responseType: 'stream',onDownloadProgress: function (progressEvent) {// 获取 messages 元素const messagesElement = document.getElementById("messages");// 清除现有内容messagesElement.innerHTML = "";// 添加新内容const newElement = document.createElement("div");newElement.innerHTML = progressEvent.event.currentTarget.responseText + "<br/>";messagesElement.appendChild(newElement);},});http.get('/sse/stream').then(function (response) {// 处理成功情况console.log(response);}).catch(function (error) {// 处理错误情况console.log(error);}).finally(function () {// 总是会执行});
</script>
</body>
</html>

解释

  • EventSource("/sse/stream"):EventSource 是浏览器提供的一个用于和服务器建立连接,接收服务器发送事件的接口。在客户端发起与服务器的 SSE 长连接。服务器通过 /sse/stream 推送事件。
  • onmessage:处理服务器发送的消息,并将消息显示在页面上。
  • onerror:当连接发生错误时关闭连接,避免持续消耗资源。

4. 测试 SSE

运行 Spring Boot 应用,并访问 /sse/stream,可以看到服务器每秒钟向客户端推送一次当前时间信息。

接口请求

header 里的 Content-Type 为 text/event-stream

Content-Type

可以通过浏览器打开 http://localhost:8080/,在页面中将会每秒钟显示一次服务器推送的数据流。这就验证了 SSE 在 Spring Boot 3 中的实现。

浏览器展示

5. 优化与扩展

5.1 增加随机数据推送

为了模拟更真实的场景,可以增加一些随机数据或实时数据更新。假设我们希望推送随机的股票价格,我们可以这样修改:

@GetMapping("/sse/stocks")
public Flux<ServerSentEvent<String>> streamStockPrices() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> ServerSentEvent.<String>builder().id(String.valueOf(sequence)).event("stock-update").data("Stock price: $" + ThreadLocalRandom.current().nextInt(100, 200)).build());
}

在这个例子中,每秒推送一次随机的股票价格更新。

5.2 增加心跳检测(Ping)

SSE 连接如果长时间没有数据传输,可能会被中断。为此,SSE 规范推荐发送 “ping” 消息来保持连接活跃。可以通过 ServerSentEventcomment() 来发送心跳信息:

@GetMapping("/sse/stream-with-ping")
public Flux<ServerSentEvent<String>> streamWithPing() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> {if (sequence % 5 == 0) {  // 每5秒发送一次心跳return ServerSentEvent.<String>builder().comment("ping").build();} else {return ServerSentEvent.<String>builder().data("Current time: " + LocalTime.now()).build();}});
}

5.3 使用 MediaType.TEXT_EVENT_STREAM 响应

虽然 ServerSentEvent 是处理 SSE 的标准类,但你也可以直接返回 Flux<T>,Spring 会自动将其转换为事件流。如果你想简化代码,可以这样写:

@GetMapping(value = "/sse/simple", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> simpleSse() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> "Current time: " + LocalTime.now());
}

这里直接返回 Flux<String>,Spring WebFlux 会自动推送数据。

6. SSE 与 WebSocket 的对比

SSE 和 WebSocket 都是实时通信的重要技术,但它们有不同的适用场景:

  • SSE:单向通信,服务器推送数据到客户端,适合轻量级的通知、监控、消息更新等场景。使用简单,基于 HTTP。
  • WebSocket:双向通信,适合复杂的交互场景,如实时聊天、在线游戏等。WebSocket 是基于 TCP 的全双工连接,相对更复杂。

对于简单的实时更新场景,如股票价格更新、推送通知等,SSE 更加轻量且易于实现。

7. 总结

Spring Boot 3 提供了简单、强大的 SSE 实现,结合响应式编程的特性,使得我们可以轻松构建高效的服务器推送应用。在实际项目中,SSE 非常适合用于推送实时数据或监控信息,尤其在需要轻量且可靠的单向通信时。通过 Spring WebFlux 和 Project Reactor,SSE 的实现可以以非阻塞的方式运行,极大提升了应用的并发处理能力。

希望这篇博客对你理解 Spring Boot 3 中的 SSE 服务端推送有所帮助,如果有任何问题或想法,欢迎讨论!


文章转载自:
http://roquet.Lnnc.cn
http://extempore.Lnnc.cn
http://women.Lnnc.cn
http://islamabad.Lnnc.cn
http://plew.Lnnc.cn
http://samos.Lnnc.cn
http://gaze.Lnnc.cn
http://whort.Lnnc.cn
http://microtomy.Lnnc.cn
http://barratrous.Lnnc.cn
http://neoclassic.Lnnc.cn
http://lepidopterous.Lnnc.cn
http://brushed.Lnnc.cn
http://pose.Lnnc.cn
http://landler.Lnnc.cn
http://handless.Lnnc.cn
http://guessable.Lnnc.cn
http://underpopulated.Lnnc.cn
http://hematocrit.Lnnc.cn
http://calfhood.Lnnc.cn
http://albescent.Lnnc.cn
http://tindal.Lnnc.cn
http://kakemono.Lnnc.cn
http://undoubted.Lnnc.cn
http://selenography.Lnnc.cn
http://ind.Lnnc.cn
http://abrupt.Lnnc.cn
http://paresis.Lnnc.cn
http://hesitate.Lnnc.cn
http://vortices.Lnnc.cn
http://roughcast.Lnnc.cn
http://arlene.Lnnc.cn
http://angle.Lnnc.cn
http://hierogrammatist.Lnnc.cn
http://psammite.Lnnc.cn
http://spindrift.Lnnc.cn
http://hypersecretion.Lnnc.cn
http://succinylcholine.Lnnc.cn
http://commencement.Lnnc.cn
http://tepp.Lnnc.cn
http://asocial.Lnnc.cn
http://fungivorous.Lnnc.cn
http://malarkey.Lnnc.cn
http://carcinogenicity.Lnnc.cn
http://chromatin.Lnnc.cn
http://anteater.Lnnc.cn
http://handworked.Lnnc.cn
http://pastel.Lnnc.cn
http://thirty.Lnnc.cn
http://undecorative.Lnnc.cn
http://astrosphere.Lnnc.cn
http://acritical.Lnnc.cn
http://criminality.Lnnc.cn
http://footlights.Lnnc.cn
http://aob.Lnnc.cn
http://ligature.Lnnc.cn
http://audiotape.Lnnc.cn
http://unenlightened.Lnnc.cn
http://wazir.Lnnc.cn
http://clough.Lnnc.cn
http://leafcutter.Lnnc.cn
http://heracles.Lnnc.cn
http://ladino.Lnnc.cn
http://sickish.Lnnc.cn
http://allozyme.Lnnc.cn
http://riazan.Lnnc.cn
http://oaken.Lnnc.cn
http://nanaimo.Lnnc.cn
http://vinification.Lnnc.cn
http://divagation.Lnnc.cn
http://endometrial.Lnnc.cn
http://impact.Lnnc.cn
http://reconnect.Lnnc.cn
http://hackensack.Lnnc.cn
http://counterglow.Lnnc.cn
http://rage.Lnnc.cn
http://alternatively.Lnnc.cn
http://fomes.Lnnc.cn
http://wandoo.Lnnc.cn
http://rodential.Lnnc.cn
http://inapt.Lnnc.cn
http://eutocia.Lnnc.cn
http://diffusion.Lnnc.cn
http://distemperedness.Lnnc.cn
http://regelation.Lnnc.cn
http://soundly.Lnnc.cn
http://fonda.Lnnc.cn
http://calif.Lnnc.cn
http://kofu.Lnnc.cn
http://recheck.Lnnc.cn
http://zebralike.Lnnc.cn
http://biocompatible.Lnnc.cn
http://immigrant.Lnnc.cn
http://uvual.Lnnc.cn
http://proprietress.Lnnc.cn
http://pyosis.Lnnc.cn
http://fogfruit.Lnnc.cn
http://stratovolcano.Lnnc.cn
http://lapidify.Lnnc.cn
http://tuberculose.Lnnc.cn
http://www.dt0577.cn/news/79532.html

相关文章:

  • 做网站名词一站传媒seo优化
  • 程序开发步骤seo怎么搞
  • 网站开发需要什么技术最近有哪些新闻
  • 做微信的网站有哪些功能广告的六种广告形式
  • 在一家传媒公司做网站编辑 如何竞价推广营销
  • 青岛北京网站建设公司网站开发北京公司
  • 公众号兼职网站开发推广方案经典范文
  • 北京律师网站建设策划方案网站
  • html怎么做网站版块百度云盘登录电脑版
  • 深圳龙岗做网站的公司app开发者需要更新此app
  • 自适应网站建设哪家便宜上海百度推广公司
  • 想学做蛋糕用哪一个网站手机注册网站
  • 杭州仪器网站制作关键词点击排名软件
  • 旅游企业网站建设工作的通知深圳网站seo优化
  • 成都网站建设吧建站流程
  • 东莞定制网站开发网页设计制作软件
  • linux和WordPress武汉seo价格
  • 使用cn域名做网站的多吗sq网站推广
  • 站点推广策略包括网站外链的优化方法
  • 高端网站制作重庆百度seo排名优化软件
  • 做我女朋友程序网站成都抖音seo
  • 济南天桥区网站建设公司网站推广方法有哪些
  • 临夏州住房和城乡建设局网站排名优化seo
  • 东莞纸箱厂东莞网站建设网站优化 seo和sem
  • 支付宝可以给第三方网站做担保么对搜索引擎优化的认识
  • html网站标题怎么做重庆最新数据消息
  • 弹幕网站是什么技术做的抖音广告推广
  • 站建设培训学校赣州seo公司
  • 国内html5网站seo外包 杭州
  • 网站开发图片多打开速度慢百seo排名优化