WebFlux简介
WebFlux 是一种基于反应式编程模型的框架,用于构建响应式应用程序。它的主要目标是处理高并发、高吞吐量、低延迟的应用程序,特别适用于需要处理大量并发连接的场景,比如实时聊天、数据流处理、IoT(物联网)应用、高并发的 Web 服务等。本文将利用它响应式编程这一特性,处理实时数据。
项目地址
https://gitee.com/wenkutech/webflux-demo.git
1, 新建Spring Boot项目,并添加Webflux依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
完整pom.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wenkutech</groupId>
<artifactId>webflux-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- webflux 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- webflux对应的openapi依赖,不需要swagger可以删除 -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2,编写Webflux接口(Controller)
创建Controller,并添加以下两个接口。getAnswer()为普通接口,getStreamAnswer()则为流接口。
流接口将每隔100毫秒返回一次,一共执行50次。@Tag和@Operation为openapi的标签,如果不需要可以直接删除。关于openapi的配置请直接查看项目[com.wenkutech.demo.base.config.OpenAPIConfig]
package com.wenkutech.demo.app.chat.controller;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.time.Duration;
@RestController
@RequestMapping("/api")
@Tag(name = "对话接口")
public class IChatController {
@Operation(
summary = "获取完整回答",
description = "回答信息将一次性全部返回",
responses = {
@ApiResponse(responseCode = "200", description = "Get answer")
})
@GetMapping("/chat")
public ResponseEntity<String> getAnswer() {
return ResponseEntity.ok("answer");
}
@Operation(
summary = "流式获取回答",
description = "以流的形式返回",
responses = {
@ApiResponse(responseCode = "200", description = "Get Stream Chat")
})
@GetMapping(value = "/stream/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> getStreamAnswer() {
// 创建一个包含流数据的Flux
return Flux.interval(Duration.ofMillis(100))
.map(sequence -> "Data " + sequence)
// 执行50次
.take(50)
.log();
}
}
3,测试
可以在本地使用postman调用该接口
4,工具
编码过程中如果遇到任何问题,可以使用以下多模型大语言工具,其中包含自研模型和gpt(3.5+)工具。每月免费20次访问,开通会员后可无限制询问。有需要的可私信,如无回复请加V(glizhewen)
https://chat.wenkutech.com