日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringWebFlux核心組件詳解

環(huán)境:Springboot2.4.12

固原ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

概述

spring-web模塊包含了對響應(yīng)式web應(yīng)用程序的以下基本支持:

  • 對于服務(wù)器請求處理,有兩個級別的支持。
  1. HttpHandler:處理HTTP請求的基本協(xié)議,包括非阻塞I/O和響應(yīng)式流背壓,以及Reactor Netty、Undertow、Tomcat、Jetty和任何Servlet 3.1+容器的適配器。
  2. WebHandler API:稍微高級一點(diǎn)的,用于處理請求的通用web API,在此基礎(chǔ)上構(gòu)建具體的編程模型,如帶注釋的控制器和函數(shù)式端點(diǎn)。
  • 對于客戶端,有一個基本的ClientHttpConnector契約來執(zhí)行HTTP請求,包括非阻塞I/O和響應(yīng)式流回壓,以及Reactor Netty, Reactive Jetty HttpClient和Apache HttpComponents的適配器。應(yīng)用程序中使用的高級web客戶端構(gòu)建在這個基本契約之上。
  • 對于客戶端和服務(wù)器,用于HTTP請求和響應(yīng)內(nèi)容的序列化和反序列化的編解碼器。

HttpHandler

HttpHandler是一個簡單的協(xié)議,只有一個方法來處理請求和響應(yīng)。它故意最小化,其主要和唯一的目的是在不同的HTTP服務(wù)器api上提供最小的抽象。

支持的服務(wù)器api如下表所示:

服務(wù)器

服務(wù)的API

反應(yīng)式流支持

Netty

Netty API

Reactor Netty

Undertow

Undertow API

spring-web: Undertow到Reactive Streams橋接

Tomcat

Servlet 3.1 non-blocking I/O; Tomcat API to read and write ByteBuffers vs byte[]

spring-web:Servlet 3.1非阻塞 I/O到Reactive Streams橋接

Jetty

Servlet 3.1 non-blocking I/O; Jetty API to write ByteBuffers vs byte[]

spring-web:Servlet 3.1非阻塞 I/O到Reactive Streams橋接

Servlet 3.1 container

Servlet 3.1 non-blocking I/O

spring-web: Servlet 3.1非阻塞 I/O到Reactive Streams橋接

下表描述了服務(wù)器依賴關(guān)系:

服務(wù)器

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

下面的代碼片段顯示了在每個服務(wù)器API中使用HttpHandler適配器:

  • Reactor Netty
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create().host(host).port(port).handle(adapter).bind().block();
  • Undertow
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
UndertowHttpHandlerAdapter adapter = new UndertowHttpHandlerAdapter(handler);
Undertow server = Undertow.builder().addHttpListener(port, host).setHandler(adapter).build();
server.start();
  • Tomcat
HttpHandler handler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
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 = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();
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();
  • Servlet 3.1+ Container

要將war部署到任何Servlet 3.1+容器,你可以擴(kuò)展并在war中包含
AbstractReactiveWebInitializer。這個類用ServletHttpHandlerAdapter封裝了一個HttpHandler,并將其注冊為Servlet。

部分源碼:?

public abstract class AbstractReactiveWebInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
String servletName = getServletName();
ApplicationContext applicationContext = createApplicationContext();
refreshApplicationContext(applicationContext);
registerCloseListener(servletContext, applicationContext);


// 與上面的服務(wù)器一樣通過WebHttpHandlerBuilder構(gòu)建HttpHandler對象
HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();
// 該類實(shí)現(xiàn)了javax.servlet.Servlet接口
ServletHttpHandlerAdapter servlet = new ServletHttpHandlerAdapter(httpHandler);


ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, servlet);
registration.setLoadOnStartup(1);
registration.addMapping(getServletMapping());
registration.setAsyncSupported(true);
}
}

WebHandler

org.springframework.web.server包構(gòu)建在HttpHandler契約之上,為通過多個WebExceptionHandler、多個WebFilter和單個WebHandler組件的鏈處理請求提供通用的web API。只需指向自動檢測組件的Spring ApplicationContext,或者向構(gòu)建器注冊組件,就可以將該鏈與WebHttpHandlerBuilder組合在一起。

HttpHandler的目標(biāo)很簡單,就是抽象出不同的HTTP服務(wù)器,而WebHandler API的目標(biāo)是提供web應(yīng)用中常用的更廣泛的功能,例如:

  • 具有屬性的用戶會話
  • 請求屬性
  • 已解析請求的區(qū)域設(shè)置或主體
  • 訪問已解析和緩存的表單數(shù)據(jù)
  • 多部分?jǐn)?shù)據(jù)的摘要。
  • 等等

特殊bean類型

下表列出了WebHttpHandlerBuilder可以在Spring ApplicationContext中自動檢測或直接注冊的組件:

Bean name

Bean type

Count

Description

WebExceptionHandler

0..N

為來自WebFilter實(shí)例鏈和目標(biāo)WebHandler的異常提供處理。

WebFilter

0..N

在過濾器鏈的其余部分和目標(biāo)WebHandler的前后應(yīng)用攔截樣式邏輯。

webHandler

WebHandler

1

請求處理程序。

webSessionManager

WebSessionManager

0..1

通過ServerWebExchange上的方法公開的WebSession實(shí)例管理器。默認(rèn)為DefaultWebSessionManager。

serverCodecConfigurer

ServerCodecConfigurer

0..1

用于訪問HttpMessageReader實(shí)例,解析表單數(shù)據(jù)和multipart數(shù)據(jù),然后通過ServerWebExchange上的方法公開這些數(shù)據(jù)。默認(rèn)情況下是servercodecconfiguration.create()。

localeContextResolver

LocaleContextResolver

0..1

LocaleContext的解析器通過ServerWebExchange上的方法公開。默認(rèn)為AcceptHeaderLocaleContextResolver。

forwardedHeaderTransformer

ForwardedHeaderTransformer

0..1

對于處理轉(zhuǎn)發(fā)的類型頭,可以提取并刪除它們,也可以只刪除它們。默認(rèn)不使用。

Form Data

ServerWebExchange公開了以下訪問表單數(shù)據(jù)的方法:

Mono> getFormData();

DefaultServerWebExchange使用配置的HttpMessageReader將表單數(shù)據(jù)(
application/x-www-form-urlencoded)解析為MultiValueMap。默認(rèn)情況下,F(xiàn)ormHttpMessageReader被配置為由ServerCodecConfigurer bean使用。

Multipart Data

ServerWebExchange公開了以下訪問多部分?jǐn)?shù)據(jù)的方法:

Mono> getMultipartData();

DefaultServerWebExchange使用配置的HttpMessageReader>來將multipart/form-data內(nèi)容解析為MultiValueMap。默認(rèn)情況下,這是DefaultPartHttpMessageReader,它沒有任何第三方依賴。另外,還可以使用基于Synchronoss nio Multipart庫的SynchronossPartHttpMessageReader。兩者都是通過ServerCodecConfigurer bean進(jìn)行配置的。

要以流式方式解析多部分?jǐn)?shù)據(jù),你可以使用HttpMessageReader返回的` Flux `。例如,在帶注釋的控制器中,使用@RequestPart意味著通過名稱訪問各個部分,就像map一樣,因此需要完整解析多個部分的數(shù)據(jù)。相比之下,可以使用@RequestBody將內(nèi)容解碼到Flux,而無需收集到MultiValueMap。

Filters

在WebHandler API中,你可以使用WebFilter在過濾器和目標(biāo)WebHandler處理鏈的其余部分之前和之后應(yīng)用攔截風(fēng)格的邏輯。當(dāng)使用WebFlux配置時,注冊WebFilter就像把它聲明為Spring bean一樣簡單,并且(可選地)通過在bean聲明上使用@Order或?qū)崿F(xiàn)Ordered來表示優(yōu)先級。

Exceptions

在WebHandler API中,可以使用WebExceptionHandler來處理來自WebFilter實(shí)例鏈和目標(biāo)WebHandler的異常。當(dāng)使用WebFlux配置時,注冊WebExceptionHandler就像聲明它為Spring bean一樣簡單,并且(可選)通過在bean聲明上使用@Order或?qū)崿F(xiàn)Ordered來表示優(yōu)先級。

下表描述了可用的WebExceptionHandler實(shí)現(xiàn):

Exception Handler

Description

ResponseStatusExceptionHandler

通過將響應(yīng)設(shè)置為異常的HTTP狀態(tài)碼,提供對ResponseStatusException類型異常的處理。

WebFluxResponseStatusExceptionHandler

擴(kuò)展了ResponseStatusExceptionHandler,它還可以確定任何異常的@ResponseStatus注解的HTTP狀態(tài)碼。

這個處理程序是在WebFlux配置中聲明的。

Codecs

spring-web和spring-core模塊通過非阻塞I/O提供響應(yīng)式流回壓,支持序列化和反序列化與高層對象之間的字節(jié)內(nèi)容。下面介紹這種支持:

  • Encoder與Decoder是底層協(xié)議,獨(dú)立于HTTP對內(nèi)容進(jìn)行編碼和解碼。
  • HttpMessageReader和HttpMessageWriter是編碼和解碼HTTP消息內(nèi)容的協(xié)議。
  • Encoder可以使用EncoderHttpMessageWriter包裝,以適應(yīng)在web應(yīng)用程序中使用,而 Decoder可以使用DecoderHttpMessageReader包裝。
  • DataBuffer抽象了不同的字節(jié)緩沖區(qū)表示形式(例如Netty ByteBuf、java.nio。ByteBuffer等),也是所有編解碼器都能處理的。

spring-core模塊提供了byte[]、ByteBuffer、DataBuffer、Resource和String編碼器和解碼器的實(shí)現(xiàn)。spring-web模塊提供了Jackson JSON、Jackson Smile、JAXB2、Protocol buffer和其他Encoder和Decoder,以及針對表單數(shù)據(jù)、多部分內(nèi)容、服務(wù)器發(fā)送事件等只支持web的HTTP消息閱讀器和writer實(shí)現(xiàn)。


新聞標(biāo)題:SpringWebFlux核心組件詳解
文章位置:http://www.dlmjj.cn/article/djgphjd.html