SpringBoot响应式编程(整理一)

1、SprinBoot响应式编程简介

基础理解:
依赖于事件,事件驱动(Event-driven)
一系列事件称为“流”
异步
非阻塞
观察者模式

(1)Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架。
与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,并 通过Reactor项目实现Reactive Streams规范
(2)Spring WebFlux应用程序不严格依赖于Servlet API,因此它们不能作为war文件部署,也不能使用src/main/webapp目录
(3)可以整合多个模板引擎,除了REST Web服务外,您还可以使用Spring WebFlux提供动态HTML内容。Spring WebFlux支持各种模板技术,包括Thymeleaf,FreeMarker

案例一

以F(服务员)为中心。传统需要多个服务员。
响应式一个就可以,服务员不间断监听后台。
服务员观察者模式
在这里插入图片描述在这里插入图片描述

案例二
	int b= 2;
	int c= 3;
	int a = b+c  //命令式编程后续b和c变化,都不影响a
	b=5;

	int b= 2;
	int c= 3
	int a = b+c;  //响应式编程中,a的变化,会和b、c的变化而变化(事件驱动)
	b=5;

2、官方文档

1、https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux
SpingBoot2底层是用spring5,开始支持响应式编程,Spring又是基于Reactor试下响应式。
2、reactive-streams学习资料:http://www.reactive-streams.org/
3、web-flux相关资料:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一整条链路都不能阻塞,目前mysql不支持响应式编程,redis支持

3、Flux和Mono List User

简单业务而言:和其他普通对象差别不大,复杂请求业务,就可以提升性能
通俗理解:
		Mono 表示的是包含 0 或者 1 个元素的异步序列
			mono->单一对象 User     redis->用户ID-》唯一的用户Mono<User>  
		
		Flux 表示的是包含 0 到 N 个元素的异步序列
			flux->数组列表对象 List<User>   redis->所有用户->Flux<User>
		Flux 和 Mono 之间可以进行转换

4、Spring WebFlux有两种风格:基于功能和基于注解的。基于注解非常接近Spring MVC模型,如以下示例所示:

官方文档:https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux

第一种:
@RestController 
@RequestMapping(“/ users”)
 public  class MyRestController {

	@GetMapping(“/ {user}”)
	 public Mono <User> getUser( @PathVariable Long user){
		 // ...
	}

	@GetMapping(“/ {user} / customers”)
	 public Flux <Customer> getUserCustomers( @PathVariable Long user){
		 // ...
	}

	@DeleteMapping(“/ {user}”)
	 public Mono <User> deleteUser( @PathVariable Long user){
		 // ...
	}

}


第二种: 路由配置与请求的实际处理分开
@Configuration
 public  class RoutingConfiguration {

	@Bean
	 public RouterFunction <ServerResponse> monoRouterFunction(UserHandler userHandler){
		 return route(GET( “/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: getUser)
				.andRoute(GET(“/ {user} / customers”).and(accept(APPLICATION_JSON)),userHandler :: getUserCustomers)
				.andRoute(DELETE(“/ {user}”).and(accept(APPLICATION_JSON)),userHandler :: deleteUser);
	}
}

@Component
public class UserHandler {

	公共 Mono <ServerResponse> getUser(ServerRequest请求){
		 // ...
	}

	public Mono <ServerResponse> getUserCustomers(ServerRequest request){
		 // ...
	}

	公共 Mono <ServerResponse> deleteUser(ServerRequest请求){
		 // ...
	}
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值