Spring WebFlux 是一个异步非阻塞式的 Web 框架,它能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。
WebFlux 内部使用的是响应式编程(Reactive Programming),以 Reactor 库为基础, 基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。
Spring ReactorSpring Reactor 是一个反应式库,用于根据反应式流规范在 JVM 上构建非阻塞应用。它是完全非阻塞的,支持反应流背压,并在 Netty,Undertow 和 Servlet 3.1+容器等服务器上运行。
Reactor 项目提供两种类型的发布者:
Flux
是产生 0 到 N 个值的发布者,返回多个元素的 *** 作使用此类型。Mono
是产生 0 到 1 值的发布者,它用于返回单个元素的 *** 作。
1.引入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webfluxartifactId>
dependency>
2.启动项目
容器已经从默认的 Tomcat 缓存了 webflux 默认的 Netty
2022-04-21 15:15:55.791 INFO 38672 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 8080
2022-04-21 15:15:55.798 INFO 38672 --- [ main] .m.w.MingYueSpringbootWebfluxApplication : Started MingYueSpringbootWebfluxApplication in 2.47 seconds (JVM running for 3.95)
3.编写接口
-
Model
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** @author Strive */ @Data @ToString @Builder @NoArgsConstructor @AllArgsConstructor public class MingYueUser { private Long userId; private String username; }
-
Service
import cn.hutool.core.map.MapUtil; import com.csp.mingyue.webflux.model.MingYueUser; import java.util.Map; import org.springframework.stereotype.Service; /** @author Strive */ @Service public class MingYueUserService { /** 模拟用户存储 */ private static final Map<Long, MingYueUser> USER_MAP = MapUtil.newHashMap(); static { USER_MAP.put(1L, MingYueUser.builder().userId(1L).username("mingyue").build()); } /** * 根据用户ID查询用户信息 * * @param userId 用户ID * @return 用户信息 */ public MingYueUser queryUserById(Long userId) { return USER_MAP.get(userId); } }
-
Controller
import com.csp.mingyue.webflux.model.MingYueUser; import com.csp.mingyue.webflux.service.MingYueUserService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; /** @author Strive */ @RestController @RequiredArgsConstructor @RequestMapping("/user") public class MingYueUserController { private final MingYueUserService mingYueUserService; @GetMapping("/{userId}") public Mono<MingYueUser> queryUserById(@PathVariable Long userId) { return Mono.just(mingYueUserService.queryUserById(userId)); } }
访问:http://127.0.0.1:8080/user/1
{
"userId": 1,
"username": "mingyue"
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)