Spring 5的一大亮点是对响应式编程的支持。
我们假设,设置tomcat最大线程为200,遇到200个非常耗时的请求
那么当有200个线程同时并发在处理,那么当来201个请求的时候,就已经处理不了,因为所有的线程都阻塞了。这是3.0之前的处理情况
而3.0之后异步处理是怎样处理呢?学过Netty通信框架的同学会比较容易理解一点,Servlet3.0类似于Netty一样就一个boss线程池和work线程池,boss线程只负责接收请求,work线程只负责处理逻辑。那么servlet3.0规范中,这200个线程只负责接收请求,然后每个线程将收到的请求,转发到work线程去处理。因为这200个线程只负责接收请求,并不负责处理逻辑,故不会被阻塞,而影响通信,就算处理非常耗时,也只是对work线程形成阻塞,所以当再来请求,同样可以处理,其主要应用场景是针对业务处理较耗时的情况可以减少服务器资源的占用,并且提高并发处理速度。
servlet3.0是2009年12月分出现的。并在Tomcat7.0中被支持。
一个典型的SpringWebFlux的main方法如下
public static void main(String[] args) throws IOException {
HttpHandler httpHandler = toHttpHandler(
route(POST("/selectStudent").and(accept(MediaType.APPLICATION_JSON_UTF8)), StudentHandler::selectStudent).
and(route(GET("/saveStudent"), StudentHandler::insertStudent)));
ReactorHttpHandlerAdapter httpHandlerAdapter = new ReactorHttpHandlerAdapter(httpHandler);
HttpServer.create("localhost", 8080).newHandler(httpHandlerAdapter).block();
System.in.read();
}