spring-boot-starter-webflux
2024-10-21 15:32:54
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 即可
最新文章
- es6新特性:
- 使用VIM + Ctags
- 模板的Traits
- - Shell - sort处理大文件(页 1) - ChinaUnix.net
- Best Grass
- linux下c语言的多线程编程
- Tencent研发工程师笔试知识点
- Alpha冲刺第一天
- webstorm破解安装版本
- js获取input上传文件名和后缀
- Linux运维工程师应具备哪些技能?
- linux学习笔记-时间配置综述
- jQuery键盘敲击事件,换键的话换键码就可以
- 【转】STM32 独立看门狗简介
- Linux下搭建LAMP环境(YUM)
- Eclipse安装Markdown插件
- TOJ 4383 n % ( pow( p , 2) ) ===0
- golang三方包应该如何安装--在线和离线
- BZOJ3155:Preprefix sum(线段树)
- python3 string
热门文章
- QPushButton CSS样式
- 「DIARY」PKUSC 2021 游记
- 解决eclipse创建动态Web项目没有Web->;Dynamic Web Project问题
- APP性能测试——首次启动耗时测试
- phpExcel常用方法详解
- c++项目
- centos7(虚拟机)下安装redis
- Nginx系列---【配置文件中静态资源文件禁止通过目录查看】
- 针对“RuntimeError: each element in list of batch should be of equal size” 问题解决
- OSIDP-I/O管理和磁盘调度-11