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 即可

spring-boot-starter-webflux的更多相关文章

  1. Spring Boot WebFlux-01——WebFlux 快速入门实践

    第01课:WebFlux 快速入门实践 Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot ...

  2. Spring Boot Starter 介绍

    http://www.baeldung.com/spring-boot-starters 作者:baeldung 译者:http://oopsguy.com 1.概述 依赖管理是任何复杂项目的关键部分 ...

  3. spring -boot s-tarter 详解

    Starter POMs是可以包含到应用中的一个方便的依赖关系描述符集合.你可以获取所有Spring及相关技术的一站式服务,而不需要翻阅示例代码,拷贝粘贴大量的依赖描述符.例如,如果你想使用Sprin ...

  4. Spring Boot (一): Spring Boot starter自定义

    前些日子在公司接触了spring boot和spring cloud,有感于其大大简化了spring的配置过程,十分方便使用者快速构建项目,而且拥有丰富的starter供开发者使用.但是由于其自动化配 ...

  5. SpringBoot 之Spring Boot Starter依赖包及作用

    Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...

  6. Spring boot starter pom的依赖关系说明

    Spring Boot 通过starter依赖为项目的依赖管理提供帮助.starter依赖起始就是特殊的maven依赖,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖. sp ...

  7. Spring Boot Starter列表

    转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...

  8. 创建自己的Spring Boot Starter

    抽取通用模块作为项目的一个spring boot starter.可参照mybatis的写法. IDEA创建Empty Project并添加如下2个module,一个基本maven模块,另一个引入sp ...

  9. 自己写spring boot starter

    自己写spring boot starter 学习了:<spring boot实战>汪云飞著 6.5.4节 pom.xml <project xmlns="http://m ...

  10. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

随机推荐

  1. C++ 读取文本, 读取( 单字符/ 一行/ 全部 )

    C++ 读取文本 介绍三种读取方式: 逐字符读取(注意不是字节) 读取一行 读取全部 示例代码: #include <iostream> #include <string> # ...

  2. kubernetes中 pause的作用

    pause的作用 重要概念:Pod内的容器都是平等的关系,共享Network Namespace.共享文件 pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名 ...

  3. kali Linux--打开&关闭防火墙

    1.安装ufw apt-get install ufw 2.关闭防火墙 ufw disable. 3.开启防火墙 ufw enable

  4. 使用python+poco+夜神模拟器进行自动化测试。

    https://blog.csdn.net/saint_228/article/details/84889017 网易最近出的一款自动化UI测试工具:Airtest 挺火的,还受到谷歌的推荐.我试着用 ...

  5. 在VUE里实现一个简单的中国地图

    如何在vue里面实现一个简单的中国地图,并且实现一些简单的个性化修改. 下面是最终实现的效果图.透明的地图加一个背景图. 1.在你的项目里安装echarts的依赖 npm install echart ...

  6. docker-compose实践(携程apollo项目)

    docker-compose使用开源镜像启动容器 以携程apollo项目为例,使用docker-compose部署单节点模式 创建apollo文件夹,vim一个新的docker-compose.yam ...

  7. 搭建react项目

    1.打开新建的项目空文件夹,终端输入命令:npm init,文件夹生成package.json文件: 2.安装webpack.webpack-cli和cross-env:npm install web ...

  8. #Python #字符画 #灰度图 使用Python绘制字符画及其原理

    由于最近身体状况不太好所以更新会有点慢,请大家多多包涵.同时也提醒大家注意保重身体! 前提:默认大家已经正确安装了 Python,且正确将Python配置到了系统Path . 目录 1.字符画的概况 ...

  9. 连接打印机Lodop

    <div class="panel-body"> <div class="row show-grid"> <div class=& ...

  10. Gabor滤波(个人学习)

    Gabor滤波 1.优点 Gabor小波与人类视觉系统中简单细胞的视觉刺激响应非常相似.在提取目标的局部空间和频率与信息方面具有良好的特性. 对于图像的边缘敏感,能够提供良好的方向选择和尺度选择.因此 ...