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(服务员)为中心。传统需要多个服务员。
响应式一个就可以,服务员不间断监听后台。
服务员观察者模式
SpringBoot响应式编程(整理一)_第1张图片SpringBoot响应式编程(整理一)_第2张图片

案例二

	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
SpringBoot响应式编程(整理一)_第3张图片
SpringBoot响应式编程(整理一)_第4张图片
SpringBoot响应式编程(整理一)_第5张图片
一整条链路都不能阻塞,目前mysql不支持响应式编程,redis支持

3、Flux和Mono List User

简单业务而言:和其他普通对象差别不大,复杂请求业务,就可以提升性能

通俗理解:

		Mono 表示的是包含 0 或者 1 个元素的异步序列
			mono->单一对象 User     redis->用户ID-》唯一的用户Mono  
		
		Flux 表示的是包含 0 到 N 个元素的异步序列
			flux->数组列表对象 List   redis->所有用户->Flux
		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  getUser( @PathVariable Long user){
		 // ...
	}

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

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

}


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

	@Bean
	 public RouterFunction  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  getUser(ServerRequest请求){
		 // ...
	}

	public Mono  getUserCustomers(ServerRequest request){
		 // ...
	}

	公共 Mono  deleteUser(ServerRequest请求){
		 // ...
	}
}

你可能感兴趣的:(后端,SpringBoot响应式编程,Spring,WebFlux,Flux,Mono)