WebFlux是Spring 5 新增特性,提供响应式web应用。本文我们利用RestController 和 WebClient组件实现简单的响应式Restful应用。

Spring WebFlux Framework

WebFlux内部使用Project Rector并实现了——Flux 和 Mono 。新的框架支持两种编程模型:

  • 基于注解方式响应式组件
  • 函数式路由和处理

本文聚焦基于注解响应式组件。

我们需要增加 spring-boot-starter-webflux 依赖,它自动拉取其他依赖:

  • spring-bootspring-boot-starter
  • spring-webflux
  • reactor-corereactor-netty
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.2.6.RELEASE</version>
</dependency>

Reactive REST 应用示例

下面我们构建简单Reactive REST员工管理应用,使用 Spring WebFlux:

  • 使用简单领域对象——Employee ,包括id 和name
  • 使用RestController 构建Rest api ,发布 Employee资源,单个资源和列表资源
  • 使用WebClient作为客户端获取资源
  • WebFlux 和 Spring Security 保护响应式请求

响应式RestController

WebFlux 支持注解方式配置,与Spring Web mvc框架一样。我们在服务端创建注解Controller发布响应式Employee资源流。

@RestController
@RequestMapping("/employees")
public class EmployeeController {private final EmployeeRepository employeeRepository;// constructor...
}

EmployeeRepository 可以是任意支持非阻塞响应式流的数据访问层。对于不支持非阻塞的数据访问数据库,可以使用线程池进行转换。

单个资源

下面定义返回单个资源的请求:

@GetMapping("/{id}")
private Mono<Employee> getEmployeeById(@PathVariable String id) {return employeeRepository.findEmployeeById(id);
}

这里使用*Mono* 包装,因为最多就返回一个对象。

集合资源

下面定义请求返回所有Employee对象集合:

@GetMapping
private Flux<Employee> getAllEmployees() {return employeeRepository.findAllEmployees();
}

对于集合资源,使用Flux,返回0 或 n个元素。

响应式 WebClient

WebClient 是Spring 5 引入支持响应式流的非阻塞客户端。我们可以使用WebClient创建客户端,从EmployeeController请求获取数据:

public class EmployeeWebClient {WebClient client = WebClient.create("http://localhost:8080");// ...
}

上面使用create方法创建WebClient ,它执行 localhost:8080 ,因此我们可以使用相对路径调用请求。

返回单个资源

/employees/{id} 请求路径获取Mono类型的单个资源:

Mono<Employee> employeeMono = client.get().uri("/employees/{id}", "1").retrieve().bodyToMono(Employee.class);employeeMono.subscribe(System.out::println);

返回集合资源

类似 /employees路径返回集合资源:

Flux<Employee> employeeFlux = client.get().uri("/employees").retrieve().bodyToFlux(Employee.class);employeeFlux.subscribe(System.out::println);

WebFlux 安全管理

可以使用Spring Security 保护响应式请求。我们继续再EmployeeController中增加更新请求,让用户可以对已存在的员工进行更新操作,但该操作仅由管理员角色可以使用。首先增加新的方法:

@PostMapping("/update")
private Mono<Employee> updateEmployee(@RequestBody Employee employee) {return employeeRepository.updateEmployee(employee);
}

创建SecurityConfig ,定义基于路径的访问规则,仅容许ADMIN角色执行更新请求:

@EnableWebFluxSecurity
public class EmployeeWebSecurityConfig {// ...@Beanpublic SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {http.csrf().disable().authorizeExchange().pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN").pathMatchers("/**").permitAll().and().httpBasic();return http.build();}
}

上面示例只有管理员用户可以执行操作,最后使用 @EnableWebFluxSecurity 注解增加 Spring Security WebFlux的缺省配置。

总结

本文通过示例展示如何创建Spring WebFlux 框架支持的响应式web应用。

Spring 5 WebFlux入门教程相关推荐

  1. Spring Boot WebFlux 上手教程

    Spring Boot WebFlux 上手教程 背景 大家都知道,Spring Framework 是 Java/Spring 应用程序跨平台开发框架,也是 Java EE(Java Enterpr ...

  2. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  3. Spring Boot WebFlux 入门

    1. 概述 友情提示:Reactive Programming ,翻译为反应式编程,又称为响应式编程.本文,我们统一使用响应式.不过,比较正确的叫法还是反应式. Spring Framework 5  ...

  4. Spring注解开发入门教程

    注解开发: 什么是驱动注解? 注解启动时使用注解的形式替代xml配置,将繁杂的spring配置文件从工程中彻底消除掉,简化书写 注解驱动的弊端 为了达成注解驱动的目的,可能会将原先很简单的书写,变的更 ...

  5. Spring Integration 快速入门教程

    本文通过小的实际示例介绍Spring Integration(SI)的核心概念.Spring Integration提供了许多功能强大的组件,这些组件可以极大地增强企业架构内系统和流程的互连互通. 它 ...

  6. Spring Cloud Alibaba入门教程-05【Alibaba微服务组件Nacos配置中心】

    1. Nacos配置中心使用 官方文档: https://github.com/alibaba/spring­cloud­alibaba/wiki/Nacos­config Nacos 提供用于存储配 ...

  7. Spring Boot 初级入门教程(十) —— 打完整 jar 包、部署和测试

    不知不觉都第十篇了,用了这么久,都是在本机运行,localhost 还是不爽,加上目前 jsp 页面已配置,可以做几个炫一些的页面,挂服务器上试试.那么问题来了,如何打包.部署呢?接下来开始尝试打包, ...

  8. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  9. Spring Boot 2 快速教程:WebFlux Restful CRUD 实践(三)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第102篇原创 03:WebFlux Web CR ...

最新文章

  1. python中若干关于类的问题
  2. 吴裕雄 oracle PL/SQL编程
  3. keepalived(7)——操作脚本
  4. (五)EasyUI使用——datagrid数据表格
  5. 【转载】ASP.NET应用程序与页面生命周期
  6. 服务器遭受攻击后,这样排查处理不背锅!
  7. 【神经网络】神经网络结构在命名实体识别(NER)中的应用
  8. JSP表单提交中文乱码解决方案
  9. 密码应用安全性评估实施之(一)密码应用方案设计
  10. nodejs怎么使用爬虫HTTP代理IP抓取数据
  11. GPS 原始坐标 (WGS-84) ddmm.mmmm 格式转高德(GCJ)百度(BD09)坐标
  12. CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周
  13. 树莓派—raspbian软件源
  14. Ubuntu出现“dpkg: 依赖关系问题使得libbsd0:i386的配置工作不能继续”错误
  15. 1000句英语经典口语(4)
  16. 树莓派搭建远程视频监控教程
  17. 实现css六边形边框,css 这种六边形的边框怎么画?
  18. c++ stl栈容器stack用法介绍
  19. IOI 2005 Riv 河流 题解
  20. 两大图灵奖得主力作:计算机架构的新黄金时代

热门文章

  1. fastjson:对于Exception中复杂类型(enum,...以及自定义类型)成员的处理
  2. 活动目录:域控制器策略大全
  3. Android网络版五子棋
  4. 电脑微信发送文件总显示“文件被占用,无法发送,请重新选择。”
  5. CL9000系列气体报警器
  6. 微型计算机的三种线路,微机线路保护
  7. SQL语句大全[300个关键字]
  8. 手把手教你撸一个小程序带太阳码的海报分享
  9. 编写一个JSP程序Jiecheng.jsp,计算整数的阶乘,并显示出结果。
  10. MATLAB R2022b Update4安装包下载及安装教程