响应式SpringWeb
spring-web
模块提供了低级的基础结构和HTTP抽象——客户端和服务器,构建响应式web应用程序。
服务器支持分为两层
- Http处理器(HttpHandler) —— 和服务器适配器构成web最基础的、通用的API。用于处理响应式背压的HTTP请求。
- Web处理器API(WebHandler API) —— 略高的处理水平,但仍然是通用服务器web API的过滤器链样式处理。
HttpHandler
每一个HTTP服务器都有一些API用于HTTP请求处理。HTTP处理器是用来处于请求和响应的一个简单协议。它的主要目的是提供一个公共的、基于流的API处理不同服务器上的HTTP请求。
spring-web
模块包含了各个服务器的适配器
服务器 | 服务器相关API | 响应流支持 |
---|---|---|
Netty | Netty API | Reactor Netty |
Undertow | Undertow API | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Tomcat | Servlet 3.1 异步 I/O; Tomcat API 读写字节流 | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Jetty | Servlet 3.1 异步I/O; Jetty写字节流 | spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge |
Servlet 3.1 容器 | Servlet 异步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.ipc | reactor-netty |
Undertow | io.undertow | undertow-core |
Tomcat | org.apache.tomcat.embed | tomcat-embed-core |
Jetty | org.eclipse.jetty | jetty-server, jetty-servlet |
Reactor Netty:
HttpHandler handler = ...
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create(host, port).newHandler(adapter).block();
Undertow:
HttpHandler handler = ...
UndertowHttpHandlerAdapter adapter = new UndertowHttpHandlerAdapter(handler);
Undertow server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build();
server.start();
Tomcat:
HttpHandler handler = ...
Servlet servlet = new TomcatHttpHandlerAdapter(handler)
Tomcat server = new Tomcat();
File base = new File(System.getProperty("java.io.tmpdir"));
Context rootContext = server.addContext("", base.getAbsolutePath());
Tomcat.addServlet(rootContext, "main", servlet);
rootContext.addServletMappingDecoded("/", "main");
server.setHost(host);
server.setPort(port);
server.start();
Jetty
HttpHandler handler = ...
Servlet servlet = new JettyHttpHandlerAdapter(handler)
Server server = new Server();
ServletContextHandler contextHandler = new ServletContextHandler(server, "");
contextHandler.addServlet(new ServletHolder(servlet), "/");
contextHandler.start();
ServerConnector connector = new ServerConnector(server);
connector.setHost(host);
connector.setPort(port);
server.addConnector(connector);
server.start();
WebHandler API
HttpHandler是在不同服务器上运行的基础。在这个基础上,WebHandler API提供了一个稍高级的处理链,异常处理程序(WebExceptionHandler)、过滤器(WebFilter)和目标处理程序(WebHandler)
所有组件在ServerWebExchange上工作—— 一个HTTP请求和响应的容器,它还增加了请求属性、会话属性、访问表单数据、复合数据等等。
可以将处理链与WebHttpHandlerBuilder组合在一起,构建一个HttpHandler,然后通过使用服务器适配器运行HttpHandler。通过分别添加组件使用构建器。或者指向一个ApplicationContext来检测以下内容
Bean Name | Bean type | Count | Description |
---|---|---|---|
"webHandler" | WebHandler | 1 | Target handler after filters |
<any> | WebFilter | 0..N | Filters |
<any> | WebExceptionHandler | 0..N | Exception handlers after filter chain |
"webSessionManager" | WebSessionManager | 0..1 | Custom session manager;DefaultWebSessionManager by default |
"serverCodecConfigurer" | ServerCodecConfigurer | 0..1 | Custom form and multipart data decoders;ServerCodecConfigurer.create() by default |
"localeContextResolver" | LocaleContextResolver | 0..1 | Custom resolver forLocaleContext ;AcceptHeaderLocaleContextResolver by default |
编解码器
spring web模块提供HttpMessageReader和HttpMessageWriter,用于编码和解码HTTP请求和响应的响应体。
DataBuffer — 抽象的字节缓冲区— 例如: Netty
ByteBuf
,java.nio.ByteBuffer
Data Buffers and CodecsEncoder — 序列化对象的流数据流缓冲区
Decoder — 反序列化对象的流数据流缓冲区
spring-core中存在着基本编码器和解码器,但有关JSON、XML和其他格式的编解码器存在spring-web中.开发者分可以使用EncoderHttpMessageWriter和DecoderHttpMessageReader来封装任何编码器和解码器。还有一些附加的、仅针对服务器发送的事件、表单数据等更多的实现。
最后,ClientCodecConfigurer和ServerCodecConfigurer可以用来初始化列表的读者和作家。包括对类路径检测和默认值的支持,以及覆盖或替换这些默认值的能力。