每日報道:Spring Integration的網絡通量支持

2022-12-14 18:17:27 來源:51CTO博客

WebFlux Spring 集成模塊 () 允許以反應方式執行 HTTP 請求和處理入站 HTTP 請求。??spring-integration-webflux??

您需要將此依賴項包含在項目中:


【資料圖】

    org.springframework.integration    spring-integration-webflux    6.0.0

在非基于 Servlet 的服務器配置的情況下,必須包含依賴關系。??io.projectreactor.netty:reactor-netty??

WebFlux 支持由以下網關實現組成:和 。 該支持完全基于SpringWebFlux和Project Actor基礎。 有關詳細信息,請參閱 HTTP 支持,因為許多選項在反應式和常規HTTP組件之間共享。??WebFluxInboundEndpoint????WebFluxRequestExecutingMessageHandler??

WebFlux 命名空間支持

Spring 集成提供了一個命名空間和相應的模式定義。 若要將其包含在配置中,請在應用程序上下文配置文件中添加以下命名空間聲明:??webflux??

    ...

WebFlux 入站組件

從版本 5.0 開始,提供了 的實現。 這個組件類似于基于MVC的,它通過新提取的共享一些常用選項。 它用于Spring WebFlux反應式環境(而不是MVC)。 以下示例顯示了 WebFlux 端點的簡單實現:??WebFluxInboundEndpoint????WebHandler????HttpRequestHandlingEndpointSupport????BaseHttpInboundEndpoint??

@Beanpublic IntegrationFlow inboundChannelAdapterFlow() {    return IntegrationFlow        .from(WebFlux.inboundChannelAdapter("/reactivePost")            .requestMapping(m -> m.methods(HttpMethod.POST))            .requestPayloadType(ResolvableType.forClassWithGenerics(Flux.class, String.class))            .statusCodeFunction(m -> HttpStatus.ACCEPTED))        .channel(c -> c.queue("storeChannel"))        .get();}

配置類似于(示例前面提到的),不同之處在于我們用于將 WebFlux 基礎架構添加到我們的集成應用程序中。 此外,通過使用反應式 HTTP 服務器實現提供的基于按需的背壓功能對下游流執行操作。??HttpRequestHandlingEndpointSupport????@EnableWebFlux????WebFluxInboundEndpoint????sendAndReceive??

回復部分也是非阻塞的,并且基于內部 ,該部分平面映射到按需解決的回復。??FutureReplyChannel????Mono??

您可以使用自定義、 甚至 . 后者提供了一種機制,可用于將回復作為任何響應式類型返回:Reactor 、RxJava 等。 這樣,我們就可以使用 Spring 集成組件實現服務器發送事件場景,如以下示例所示:??WebFluxInboundEndpoint????ServerCodecConfigurer????RequestedContentTypeResolver????ReactiveAdapterRegistry????Flux????Observable????Flowable??

@Beanpublic IntegrationFlow sseFlow() {    return IntegrationFlow            .from(WebFlux.inboundGateway("/sse")                    .requestMapping(m -> m.produces(MediaType.TEXT_EVENT_STREAM_VALUE)))            .handle((p, h) -> Flux.just("foo", "bar", "baz"))            .get();}

有關更多可能的配置選項,請參閱請求映射支持和跨源資源共享 (CORS) 支持。

當請求正文為空或返回 時,請求參數 () 用于處理目標消息的 。??payloadExpression????null????MultiValueMap????payload??

有效負載驗證

從版本 5.2 開始,可以使用 . 與HTTP 支持中的 MVC 驗證不同,它用于在執行回退和函數之前驗證請求已轉換為的元素。 框架無法假設對象在構建最終有效負載后會有多復雜。 如果需要限制最終有效負載(或其元素)的驗證可見性,則應將驗證轉移到下游,而不是 WebFlux 端點。 更多信息請參閱Spring WebFlux文檔。 無效的有效負載被拒絕,并顯示包含所有驗證的(擴展名)。 在 Spring 框架參考手冊中查看有關驗證的更多信息。??WebFluxInboundEndpoint????Validator????Publisher????HttpMessageReader????payloadExpression????Publisher????Publisher????IntegrationWebExchangeBindException????WebExchangeBindException????Errors??

WebFlux 出站組件

(從版本 5.0 開始)實現類似于 。 它使用來自Spring Framework WebFlux模塊。 要配置它,請定義類似于以下內容的 Bean:??WebFluxRequestExecutingMessageHandler????HttpRequestExecutingMessageHandler????WebClient??

@Beanpublic IntegrationFlow outboundReactive() {    return f -> f        .handle(WebFlux.>outboundGateway(m ->                UriComponentsBuilder.fromUriString("http://localhost:8080/foo")                        .queryParams(m.getPayload())                        .build()                        .toUri())                .httpMethod(HttpMethod.GET)                .expectedResponseType(String.class));}

該操作返回 ,該 映射到 (通過使用幾個步驟)作為 的輸出。 與 as 一起,評估將推遲到進行下游訂閱。 否則,它被視為一種模式,并且響應將適于 a 以獲得來自 的異步回復。 輸出消息的目標有效負載取決于配置。 或標識響應正文元素轉換的目標類型。 如果設置為 ,則響應正文將轉換為 a,并為每個元素提供,并將其作為有效負載發送到下游。 之后,您可以使用拆分器以反應方式迭代它。??WebClient????exchange()????Mono????Mono.map()????AbstractIntegrationMessageBuilder????WebFluxRequestExecutingMessageHandler????ReactiveChannel????outputChannel????Mono????async????Mono????SettableListenableFuture????WebFluxRequestExecutingMessageHandler????WebFluxRequestExecutingMessageHandler????setExpectedResponseType(Class)????setExpectedResponseTypeExpression(Expression)????replyPayloadToFlux????true????Flux????expectedResponseType????Flux????Flux??

此外,可以注入 a 而不是 and 屬性。 它可用于對正文和 HTTP 標頭轉換的低級訪問和更多控制。 Spring 集成作為一個標識函數來生成(下游)整體和任何其他可能的自定義邏輯。??BodyExtractor????WebFluxRequestExecutingMessageHandler????expectedResponseType????replyPayloadToFlux????ClientHttpResponse????ClientHttpResponseBodyExtractor????ClientHttpResponse??

從版本 5.2 開始,支持 反應式 、 和類型作為請求消息有效負載。 在內部使用相應的 以填充到 . 當有效負載是反應式 時,已配置 或 可用于確定發布者元素類型的類型。 表達式必須解析為 ,該解析為目標或 。??WebFluxRequestExecutingMessageHandler????Publisher????Resource????MultiValueMap????BodyInserter????WebClient.RequestBodySpec????Publisher????publisherElementType????publisherElementTypeExpression????Class????String????Class????ParameterizedTypeReference??

從版本 5.5 開始,公開一個標志(默認情況下)以僅返回響應正文,或返回整體作為回復消息有效負載,與提供的 or 無關。 如果 中不存在主體,則忽略此標志并返回整體。??WebFluxRequestExecutingMessageHandler????extractResponseBody????true????ResponseEntity????expectedResponseType????replyPayloadToFlux????ResponseEntity????ResponseEntity??

有關更多可能的配置選項,請參閱HTTP 出站組件。

WebFlux 標頭映射

由于 WebFlux 組件完全基于 HTTP 協議,因此 HTTP 標頭映射沒有區別。 有關用于映射標頭的更多可能選項和組件,請參閱HTTP 標頭映射。

網絡通量請求屬性

從版本 6.0 開始,可以將 配置為通過 評估請求屬性。 必須在 中計算此 SpEL 表達式。 然后將此類映射傳播到 HTTP 請求配置回調。 如果需要將鍵值對象形式的信息從請求傳遞,并且下游過濾器將訪問這些屬性以進行進一步處理,這將很有幫助。??WebFluxRequestExecutingMessageHandler????setAttributeVariablesExpression()????Map????WebClient.RequestBodySpec.attributes(Consumer> attributesConsumer)????Message??

標簽: 有效負載 命名空間 應用程序

上一篇:從 MySQL 到 ClickHouse 實時復制與實現
下一篇:全球新資訊:#yyds干貨盤點# LeetCode程序員面試金典:三合一