webflux:

反应式编程reactor的产物,采用发布订阅模式,引入netty的nio,比较适合IO密集型应用。

因普遍应用使用的DB链接是IO阻塞型,因此在一般应用中无法体现它的优势。redis和mongoDB支持reactor。

前言: Flux && Mono

Flux: 可返回1到n个结果,

Mono: 仅返回0到1个结果

MAVEN 依赖:

            <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>

注意: spring-boot-starter-webflux 和 spring-boot-starter-webmvc 会冲突,因此如果有webmvc请排除掉。

启动引入

@SpringBootApplication
@EnableWebFlux
public class TestWebfluxApp {
SpringApplication.run(TestWebfluxApp.class, args);
}

controller方式使用

@Slf4j
@RequestMapping("/webflux")
@RestController
public class TestWebFluxController { /**
* Mono
* @param user
* @return
*/
@RequestMapping("/user/new")
public Mono<String> user(@RequestBody User user){
System.out.println("user:" +user);
WebClient webClient = WebClient.create("http://127.0.0.1:8089");
Mono<ClientResponse> exchange = webClient.get().uri("/algo/yumc/get?test=junitTest1234&sk={0}", "123456").exchange();
System.out.println("user2: ---------------------");
Mono<String> mono = Mono.just("1234567");
return exchange.block(Duration.ofSeconds(1)).bodyToMono(String.class);
} /**
* Flux
* @return
*/
@RequestMapping("/user/list")
public Flux<String> user(){
WebClient webClient = WebClient.create("http://127.0.0.1:8089");
Mono<ClientResponse> exchange = webClient.get().uri("/algo/yumc/get?test=junitTest1234&sk={0}", "123456").exchange();
System.out.println("user2: ---------------------");
Flux<String> stringFlux = Flux.just("1234","5678");
return exchange.block(Duration.ofSeconds(1)).bodyToFlux(String.class);
}

endpoint方式使用

@Configuration
public class WebfluxConfiguration { @Autowired
private UserHandler userHandler; @Bean
@Qualifier("userRouter")
public RouterFunction<ServerResponse> userRouter(){
return RouterFunctions.nest(RequestPredicates.path("/flux/user"),
RouterFunctions.route(RequestPredicates.GET("/info"), UserHandler::getUserInfo)
.andRoute(RequestPredicates.GET("/list"), UserHandler::getUserList));
} @Component
public class UserHandler { /**
* request
* @param serverRequest
* @return
*/
public static Mono<ServerResponse> getUserInfo(ServerRequest serverRequest) {
User user = new User();
user.setId(12345);
user.setName("张三");
return ServerResponse.ok()
.contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject(user));
}

常见异常:

  • org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'text/xml;charset=UTF-8' not supported for bodyType

    原因:MediaType.TEXT_PLAIN 转变为 MediaType.APPLICATION_JSON 即可

最新文章

  1. es6新特性:
  2. 使用VIM + Ctags
  3. 模板的Traits
  4. - Shell - sort处理大文件(页 1) - ChinaUnix.net
  5. Best Grass
  6. linux下c语言的多线程编程
  7. Tencent研发工程师笔试知识点
  8. Alpha冲刺第一天
  9. webstorm破解安装版本
  10. js获取input上传文件名和后缀
  11. Linux运维工程师应具备哪些技能?
  12. linux学习笔记-时间配置综述
  13. jQuery键盘敲击事件,换键的话换键码就可以
  14. 【转】STM32 独立看门狗简介
  15. Linux下搭建LAMP环境(YUM)
  16. Eclipse安装Markdown插件
  17. TOJ 4383 n % ( pow( p , 2) ) ===0
  18. golang三方包应该如何安装--在线和离线
  19. BZOJ3155:Preprefix sum(线段树)
  20. python3 string

热门文章

  1. QPushButton CSS样式
  2. 「DIARY」PKUSC 2021 游记
  3. 解决eclipse创建动态Web项目没有Web-&gt;Dynamic Web Project问题
  4. APP性能测试——首次启动耗时测试
  5. phpExcel常用方法详解
  6. c++项目
  7. centos7(虚拟机)下安装redis
  8. Nginx系列---【配置文件中静态资源文件禁止通过目录查看】
  9. 针对“RuntimeError: each element in list of batch should be of equal size” 问题解决
  10. OSIDP-I/O管理和磁盘调度-11