【WEB篇】Spring Boot 整合 Webflux

导读:本篇文章讲解 【WEB篇】Spring Boot 整合 Webflux,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</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"
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78334.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!