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));
标签:Mono,class,对应,响应,User,版本,springwebFlux,id
From: https://www.cnblogs.com/guanchaoguo/p/18150125