1.2. Reactive Core
spring-web模块包含以下对响应式web应用程序的基本支持。
服务端支持:
1)在服务端请求处理过程中,提供了两个层次的支持,
HttpHandler:提供了用于非阻塞I/O和响应式流反压机制的处理机制。以及用于响应式Netty、Undertow、Tomcat、Jetty和任何Servlet 3.1+容器的适配器。
2)WebHandler API
: 用于处理请求的高级通用web API,使用这个API可以构建具体的编程模型,如带注释的控制器和功能入口。
客户端支持:
对于客户端,有一个基本的ClientHttpConnector来执行带有非阻塞I/O和响应式流反压机制的HTTP请求,以及用于适配器Netty和Jetty HttpClient的API。在实际的应用开发过程中,我们使用的更高层级的WebClient就是构建在这个基本的ClientHttpConnector之上。
1.2.1. HttpHandler
HttpHandler是一个简单的契约或者编程规范,它是被故意设计成最小化的,且只有一个方法来处理请求和响应。其主要的、也是唯一的目的是对不同的HTTP服务器api进行最小的抽象。
下表描述了它支持的服务器api:
erver name | Server API used | Reactive Streams support |
Netty | Netty API | |
Undertow | Undertow API | spring-web: Undertow to Reactive Streams bridge |
Tomcat | Servlet 3.1 non-blocking I/O; Tomcat API to read and write ByteBuffers vs byte[] | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Jetty | Servlet 3.1 non-blocking I/O; Jetty API to write ByteBuffers vs byte[] | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Servlet 3.1 container | Servlet 3.1 non-blocking I/O | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
下表描述了不通服务端容器的程序依赖 (也参见支持的版本):
Server name | Group id | Artifact name |
Reactor Netty | io.projectreactor.netty | reactor-netty |
Undertow | io.undertow | undertow-core |
Tomcat | org.apache.tomcat.embed | tomcat-embed-core |
Jetty | org.eclipse.jetty | jetty-server, jetty-servlet |
下面的代码片段显示如何在不同的服务端容器中使用HttpHandler适配器,这些代码一般都是集成在框架中,不需要程序人员编写。
##Java:
HttpHandler handler = ...
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create().host(host).port(port).handle(adapter).bind().block();
##Kotlin:
val handler: HttpHandler = ...
val adapter = ReactorHttpHandlerAdapter(handler)
HttpServer.create().host(host).port(port).handle(adapter).bind().block()
1.2.2. WebHandler
API
org.springframework.web.server 包运行在HttpHandler的上层,它提供了一个通用的web API,通过多个WebExceptionHandler、多个WebFilter和单个WebHandler组件组成的链来处理请求。在Spring ApplicationContext的上下文中,可以通过动态的自动注入或者生成器来注册进去,让整个链式处理过程与WebHttpHandlerBuilder放在一起。HttpHandler目标时提供一个简单的抽象设计以便适配不同的服务器,但是 WebHandler API的目标是提供一组更广泛的web应用程序中常用的特性,比如:
• User session with attributes.
• Request attributes.
• Resolved Locale or Principal for the request.
• Access to parsed and cached form data.
• Abstractions for multipart data.
• and more..