【WEB篇】Spring Boot 整合 Webflux

【WEB篇】Spring Boot 整合 Webflux,第1张

WebFlux

Spring WebFlux 是一个异步非阻塞式的 Web 框架,它能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。

WebFlux 内部使用的是响应式编程(Reactive Programming),以 Reactor 库为基础, 基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。

Spring Reactor

Spring Reactor 是一个反应式库,用于根据反应式流规范在 JVM 上构建非阻塞应用。它是完全非阻塞的,支持反应流背压,并在 Netty,Undertow 和 Servlet 3.1+容器等服务器上运行。

Reactor 项目提供两种类型的发布者:

  • Flux 是产生 0 到 N 个值的发布者,返回多个元素的 *** 作使用此类型。
  • Mono 是产生 0 到 1 值的发布者,它用于返回单个元素的 *** 作。
Spring Boot 整合 Webflux

Demo 地址:mingyue-springboot-webflux

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));
      }
    }
    
4.测试接口

访问:http://127.0.0.1:8080/user/1

{
    "userId": 1,
    "username": "mingyue"
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存