springwebFlux 版本对应关系

springwebFlux是 spring5 、springboot2.4 、springcloud2020

  • webFlux 采用响应式编程 使用Rsocket 协议 代替 HTTP
  • 使用场景主要在springcloud gateway、日志 ,监控检测等等

springwebFlux 和springmvc 的相同点

  • 其实是一个升级版 架构基本一致
  • sprimgmvc ServletRequest-》= FilterChain-》DispatcherServlet-》HandlerMapping-》HandlerAdapter-》Handler
  • springwebFlux ServletRequest-》= WebFilterChain-》DispatcherServlet-》HandlerMapping-》HandlerAdapter-》Handler
  • 都可以使用@Request-Mapping注解的控制器方法上

springwebFlux 和 springmvc 的相同点

  • sprimgmvc 是同步阻塞请求响应类型 拉模型
  • springwebFlux 属于异步飞阻塞的消息驱动模型
  • springwebFlux可以通过响应式Web API创建 handler

// 响应式注解 返回值Mono
@RestController
@RequestMapping(value="users")
public class UserController {
  @GetMapping(value = "/{id}")
  public Mono<User> getUserById(@PathVariable Long id) {
    User user = new User();
    ...
    return Mono.just(user);
  }
}
//  响应式API
// ServerRequest、ServerResponse、HandlerFunction和RouterFunction

// HandlerFunction
@Configuration
public class UserHandler {
  @Autowired
  private UserService userService;
  public Mono<ServerResponse> getUserById(ServerRequest request) {
    Long userId = request.pathVariable("userId");
    return
    ServerResponse.ok().body(this.orderService.getUserById(userId),User.class);
  }
}
// RouterFunction
RouterFunction<ServerResponse> userRoute = route(GET("/users/{id}").and(accept(APPLICATION_JSON)),userHandler::getUserById);

响应式客户端

  • Rest-Template的主要问题在于不支持响应式流规范,也就无法提供非阻塞式的流式操作
  • Spring WebFlux中提供了一个执行响应式远程访问的WebClient工具类 ,可以认为它就是RestTemplate的响应式升级版本
  • WebClient也提供了一组来访问远程响应式Web服务,日常开发过程中比较常用的包括retrieve()方法和exchange()方法
// retrieve 获取响应主体并对其进行解码
WebClient webClient = WebClient.create("http://localhost:8080");
Mono<User> user = webClient.get()
  .uri("/users/{id}", id)
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .bodyToMono(User.class);

// exchange  响应结果是一个ClientResponse对象,包含了响应的状态码、Cookie等信息
Mono<User> result = webClient.get()
  .uri("/users/{id}", id)
  .accept(MediaType.APPLICATION_JSON)
  .exchange()
  .flatMap(response -> response.bodyToMono(User.class));
posted @ 2024-04-22 10:58  vx_guanchaoguo0  阅读(91)  评论(0编辑  收藏  举报