WebFlux技术升级-学习笔记
servlet由servlet container进行生命周期管理。container启动时构造servlet对象并调用servlet init()进行初始化;container关闭时调用servlet destory()销毁servlet;container运行时接受请求,并为每个请求分配一个线程(一般从线程池中获取空闲线程)然后调用service()。
弊端:servlet是一个简单的网络编程模型,当请求进入servlet container时,servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的,但是一旦并发上升,线程数量就会上涨,而线程资源代价是昂贵的(上线文切换,内存消耗大)严重影响请求的处理时间。在一些简单的业务场景下,不希望为每个request分配一个线程,只需要1个或几个线程就能应对极大并发的请求,这种业务场景下servlet模型没有优势。
spring webmvc是基于servlet之上的一个路由模型,即spring实现了处理所有request请求的一个servlet(DispatcherServlet),并由该servlet进行路由。所以spring webmvc无法摆脱servlet模型的弊端。
在Spring Webflux中,异常分两种。一是controller中方法抛出的异常,这在webflux中同样可以像在mvc中用@ExceptionHandler声明异常处理方法。二是在WebHandler API这种比较偏底层的api,典型的是WebFilter,异常处理使用了支持Mono的新接口:WebExceptionHandler,可用于处理来自WebFilter链和WebHandler的异常。使用WebExceptionHandler时,只要将其声明为Spring bean即可自动注入并使用,并可选择通过bean声明上的@Order或通过实现Ordered来表示优先级。需要注意的是webflux有默认的WebExceptionHandler-DefaultErrorWebExceptionHandler,其order为默认的-1。如果我们想自定义WebExceptionHandler,那么必须将order声明为-2以上,否则异常将不会传递到我们自定义的WebExceptionHandler中。
SpringMVC是同步阻塞的IO模型,资源浪费相对来说比较严重
Spring WebFlux特性
特性一 异步非阻塞
特性二 响应式(reactive)函数编程
特性三 不再拘束于Servlet容器
- 数据来源,一般称为生产者(Producer)
- 数据的目的地,一般称为消费者(Consumer)
- 在处理时,对数据执行某些操作一个或多个处理阶段。(Processor)
到这里我们再看回响应式流的接口,我们应该就能懂了:
- Publisher(发布者)相当于生产者(Producer)
- Subscriber(订阅者)相当于消费者(Consumer)
- Processor就是在发布者与订阅者之间处理数据用的
在响应式流上提到了back pressure(背压)这么一个概念,其实非常好理解。在响应式流实现异步非阻塞是基于生产者和消费者模式的,而生产者消费者很容易出现的一个问题就是:生产者生产数据多了,就把消费者给压垮了。