响应式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;DefaultWebSessionManagerby default
"serverCodecConfigurer" ServerCodecConfigurer 0..1 Custom form and multipart data decoders;ServerCodecConfigurer.create()by default
"localeContextResolver" LocaleContextResolver 0..1 Custom resolver forLocaleContext;AcceptHeaderLocaleContextResolverby default

编解码器

spring web模块提供HttpMessageReader和HttpMessageWriter,用于编码和解码HTTP请求和响应的响应体。

spring-core中存在着基本编码器和解码器,但有关JSON、XML和其他格式的编解码器存在spring-web中.开发者分可以使用EncoderHttpMessageWriter和DecoderHttpMessageReader来封装任何编码器和解码器。还有一些附加的、仅针对服务器发送的事件、表单数据等更多的实现。

最后,ClientCodecConfigurer和ServerCodecConfigurer可以用来初始化列表的读者和作家。包括对类路径检测和默认值的支持,以及覆盖或替换这些默认值的能力。

results matching ""

    No results matching ""