Spring Boot集成webflux快速入门Demo

1.webflux介绍

Spring WebFlux是一个异步非阻塞式的WEB框架,它能够充分利用多核CPU的硬件资源去处理大量的并发请求,而Spring MVC是构建于Servlet API之上,使用的是同步阻塞式I/O模型,即每一个请求对应一个线程去处理。

2.WebFlux 与 Spring MVC 区别

WebFlux:

  • 异步非阻塞: WebFlux 基于反应式编程模型,支持非阻塞 I/O,能够充分利用多核 CPU 资源,并且在高并发场景下具有更好的性能表现,因为 它不会为每个请求分配独立的线程,从而避免了线程上下文切换带来的开销。

  • 响应式编程: WebFlux 使用 Project Reactor(或者 RxJava 作为备选)提供的 Mono 和 Flux 类型来表示可能零个、一个或多个事件的异步序列,使得开发者可以编写异步数据处理逻辑。

  • 无需 Servlet API: 尽管可以在 Servlet 容器上运行,但它不直接依赖 Servlet API,能在非阻塞服务器(如 Netty、Undertow 等)上运行。

  • 函数式编程风格: 除了提供类似于 Spring MVC 的注解式编程模型外,WebFlux 还支持函数式编程模型,允许通过 RouterFunction 等方式进行更灵活的路由配置。

Spring MVC:

  • 同步阻塞: Spring MVC 基于传统的 Servlet API,每个 HTTP 请求通常都会绑定到一个单独的线程直到请求处理完成并发送响应为止。

  • 线程模型: 在默认情况下,Spring MVC 应用中,每个请求会创建或从线程池获取一个线程,处理完成后释放回线程池。这种模式在请求处理复杂度较高或线程池大小受限时,可能会影响系统的并发能力。

  • 依赖 Servlet 容器: Spring MVC 必须部署在支持 Servlet API 的容器中运行(如:Tomcat、Jetty、Undertow、Weblogic等)。

  • API 和编程模型: Spring MVC 主要采用注解驱动的方式组织控制器和处理请求响应,例如通过 @Controller、@RequestMapping 等注解。

性能

响应式和非阻塞并不是总能让应用跑的更快,况且将代码构建为非阻塞的执行方式本身还会带来少量的成本。但是在类似于WEB应用这样的高并发、少计算且I/O密集的应用中,响应式和非阻塞往往能够发挥出价值。 对比SpringMVC使用的Servlet模型,增加Servlet容器处理请求的线程数量可以缓解这一问题,但是增加线程是有成本的,JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以更多的线程意味着需要更多的内存;更多的线程会带来更多的线程上下文切换成本。

3.代码工程

实验目的:使用webflux方式编写程序

添加依赖

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

编写controller

第一种 springmvc注解方式

package com.et.webflux;
import lombok.extern.slf4j.Slf4j;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 reactor.core.publisher.Mono;
import javax.annotation.Resource;

@Slf4j@RestController@RequestMapping("/demo")public class DemoController {
@Resource private DemoService demoService;

@GetMapping("/monoTest") public Mono<Object> monoTest() { // method one// String data = getOneResult("monoTest()");// return Mono.just(data);
// method two return Mono.create(cityMonoSink -> { String data = demoService.getOneResult("monoTest()"); cityMonoSink.success(data); }); }

@GetMapping("/fluxTest") public Flux<Object> fluxTest() { // method one// List<String> list = getMultiResult("fluxTest()");// return Flux.fromIterable(list);
// method two return Flux.fromIterable(demoService.getMultiResult("fluxTest()")); }
}

第二种 Java 8 Lambda函数式编程。

@Bean public RouterFunction<ServerResponse> routes() { // 下面的操作相当于 @RequestMapping return RouterFunctions.route(POST("/addUser"), handler::addUser) .andRoute(GET("/userList"), handler::userList) .andRoute(GET("/findUserById/{id}"), handler::findUserById); }


service实现

package com.et.webflux;
import java.util.List;
public interface DemoService {

String getOneResult(String methodName);

List<String> getMultiResult(String methodName);
User addUser(User user);
List<User> findAllUser();
User findUserById(Long id);
}
package com.et.webflux;

import org.springframework.stereotype.Service;
import java.util.ArrayList;import java.util.List;

@Servicepublic class DemoServiceImpl implements DemoService {
@Override public String getOneResult(String methodName) {
return String.format("%s invoker success", methodName); }
@Override public List<String> getMultiResult(String methodName) { List<String> list = new ArrayList<>(3); for (int i = 0; i < 3; i++) { list.add(String.format("%s invoker success, %d ", methodName, i + 1)); } return list; }
@Override public User addUser(User user) { user.setId(1L); return user; }
@Override public List<User> findAllUser() {
List<User> list = new ArrayList<>(); for (int i = 0; i < 3; i++) { int no = i + 1; list.add(new User((long) no, "USER_" + no, "PWD_" + no, 18 + no)); } return list; }
@Override public User findUserById(Long id) {
return new User(id, "USER_" + id, "PWD_" + id, 18); }}

以上只是一些关键代码,所有代码请参见下面代码仓库


代码仓库

  • https://github.com/Harries/springboot-demo

4.测试

  • 启动springboot工程

  • 访问地址http://localhost:8088/demo/fluxTest

  • 访问http://localhost:8088/demo/monoTest

5.引用

  • http://www.liuhaihua.cn/archives/710420.html

  • https://howtodoinjava.com/spring-webflux/spring-webflux-tutorial/

  • https://blog.csdn.net/qq_33204709/article/details/136908838


相关推荐

  • 美国空军如何在 45 天内在 F-16 战机上部署 Kubernetes 和 Istio
  • 甲骨文宠儿力压GPT-4斩获竞技场首胜,不绑定厂商,不做聊天机器人,Transformer最年轻作者带飞大模型创业新星
  • 中小银行数据治理做不好,是问责机制和考评绩效体系的“锅”?
  • 如何将技术债务纳入路线图
  • ArchSummit 深圳|来自百度、Uber、eBay、货拉拉、小质科技的 Data 4 AI 探索和实践案例
  • OpenAI投资的自动驾驶软件公司倒闭了:烧光15亿元交不出一款产品,CEO:成本太高,活不下去了
  • 走进 AI 高薪族:小而美团队成主流,博士生招聘需求飙升 430%!
  • 懂车帝数据指标体系建设和应用实践
  • Kyligence 发布企业级 AI 解决方案,Data + AI 落地迈向新阶段
  • SpringBoot 3.2发布之后,真学不动了!
  • 抖音提前批二面:为啥不推荐使用外键?
  • 今日arXiv最热大模型论文:清华大学发布,结合稳定扩散模型与ControlNet的AI辅助建筑设计方法
  • 一款超强悍、免费文档识别AI工具,开启内测!论文/PPT/书籍/财报等各种文档都能识别解析
  • AI芯片竞争白热化!Meta官宣最新AI推理芯片!性能提升300%,支撑Llama高负载计算
  • 玄学大模型、Google Infini-Transformer新版大模型架构:有趣的大模型进展早报及短视频生成简单项目
  • 来,吃个回旋瓜。。。
  • Nature发布2024年值得关注的七项技术
  • 重磅:2024年QS世界大学学科排名出炉!
  • 面试官常问的那些webpack插件-超详细总结
  • 字节跳动 23 人移送公安机关,开除 136 人!