spring webflux之Reactive Spring Web

 

        spring-web模块为client和server两端构建响应式web应用提供了低级别的基础结构和http抽象概念。所有的公共api都将围绕着Reactive Streams和Reactor建立和实现。

        server端支持下面两个层次:

        HttpHandler and server adapters —http请求处理 Reactive Streams back pressure 的最基本、通用的api。

        WebHandler API — 稍高级别的,但是一般用在过滤器式链的server web api。

        每一个http server都有一些处理http请求的api。HttpHandler 是一个处理简单的通过一个方法来处理请求和响应的协议。它主要的目的是为不同的server提供一个共用的、Reactive Streams based API。

        spring-web 模块包含了对所有支持的server的适配器。下面的表显示了已被使用的server APIs以及Reactive Streams的支持来源:

Server nameServer API usedReactive Streams support

Netty

Netty API

Reactor Netty

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

 

        这里是必须的依赖, supported versions,以及每个server的代码片段:

Server nameGroup idArtifact 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();

        你也可以将通过包装处理过将ServletHttpHandlerAdapter转换成Servlet后的war包部署在servlet3.1容器中。

    httphandler 是运行在不同server的基础。而WebHandler API为exception handlers (WebExceptionHandler), filters (WebFilter),当前处理器(WebHandler)提供了一个稍高级别的api。

        所有的组件都可以工作在ServerWebExchange --http request和response的容器,增加了request attributes, session attributes, access to form data, multipart data,以及更多。

        这个处理链可以和WebHttpHandlerBuilder放在一起,当创建在一个可以运行在server adapter 的HttpHandler上时。如果要增加单独的组件或者指向ApplicationContext时就需要注意以下的检测:

        

Bean nameBean typeCountDescription

"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 for LocaleContextAcceptHeaderLocaleContextResolver by default

 

    spring-web 模块提供了 HttpMessageReader 和 HttpMessageWriter 来编解码Reactive Streams. 的 http请求和响应体。它建立在一个低级别的协议上从 spring-core:

  • DataBuffer — 抽象化的字节buffer — e.g. Netty ByteBufjava.nio.ByteBuffer

  • Encoder — 序列化一个对象流到数据buffer

  • Decoder — 反序列化一个数据buffer到对象流

        基本的 Encoder 和 Decoder 实现存在于spring-core,但是spring-web增加了更多像XML,JSON以及其他的格式。你可以通过EncoderHttpMessageWriter 和 DecoderHttpMessageReader 来包装encoder和decoder成reader和writer。这里是附加的信息,web-only reader 和 writer 实现自server-sent事件、表单数据以及更多。

        最后,ClientCodecConfigurer 和 ServerCodecConfigurer可以用来实例化 readers and writers 的列表。他们支持classpath检测以及一个默认值随着需要覆盖货替换默认值。

转载于:https://my.oschina.net/u/615618/blog/1547980

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值