日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
新一代SpringWeb框架WebFlux!

 反應(yīng)式系統(tǒng)提供了我們在高數(shù)據(jù)流世界中所需的無與倫比的響應(yīng)能力和可擴展性。然而,反應(yīng)式系統(tǒng)需要經(jīng)過專門培訓(xùn)的工具和開發(fā)人員來實現(xiàn)這些獨特的程序架構(gòu)。Spring WebFlux with Project Reactor 是一個專門為滿足現(xiàn)代公司的響應(yīng)式需求而構(gòu)建的框架。

高淳網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),高淳網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為高淳上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的高淳做網(wǎng)站的公司定做!

今天,我們將通過解釋 WebFlux 如何與其他反應(yīng)式堆棧工具配合、有何不同以及如何制作您的第一個應(yīng)用程序來幫助您開始使用 WebFlux。

 什么是反應(yīng)式系統(tǒng)?

反應(yīng)式系統(tǒng)是采用反應(yīng)式架構(gòu)模式設(shè)計的系統(tǒng),該模式優(yōu)先使用松耦合、靈活和可擴展的組件。它們的設(shè)計還考慮了故障解決方案,以確保即使出現(xiàn)故障,大部分系統(tǒng)仍能運行。

反應(yīng)式系統(tǒng)專注于:

  •  反應(yīng)性:最重要的是,反應(yīng)性系統(tǒng)應(yīng)該對任何用戶輸入做出快速響應(yīng)。反應(yīng)式系統(tǒng)倡導(dǎo)者認為,反應(yīng)式有助于優(yōu)化系統(tǒng)的所有其他部分,從數(shù)據(jù)收集到用戶體驗。
  •  彈性:反應(yīng)式系統(tǒng)的設(shè)計應(yīng)該能夠預(yù)測系統(tǒng)故障。反應(yīng)式系統(tǒng)期望組件最終會失效,并設(shè)計松散耦合的系統(tǒng),即使幾個單獨的部件停止工作也能保持活動狀態(tài)。
  •  彈性:反應(yīng)式系統(tǒng)應(yīng)該通過擴大或縮小以滿足需求來適應(yīng)工作負載的大小。許多反應(yīng)式系統(tǒng)還將使用預(yù)測性擴展來預(yù)測和準備突然變化。實現(xiàn)彈性的關(guān)鍵是消除任何瓶頸并構(gòu)建可以根據(jù)需要分片或復(fù)制組件的系統(tǒng)。
  •  消息驅(qū)動的通信:反應(yīng)式系統(tǒng)的所有組件都是松散耦合的,每個組件之間都有硬邊界。您的系統(tǒng)應(yīng)該通過顯式消息傳遞跨越這些邊界進行通信。這些消息讓不同的組件了解故障,并幫助他們將工作流委派給可以處理它的組件。

 反應(yīng)式和其他 Web 模式之間最顯著的區(qū)別是反應(yīng)式系統(tǒng)可以一次執(zhí)行多個未阻塞的調(diào)用,而不是讓一些調(diào)用等待其他調(diào)用。因此,響應(yīng)式系統(tǒng)可以提高性能和響應(yīng)速度,因為 Web 應(yīng)用程序的每個部分都可以比必須等待另一部分更快地完成自己的部分。

什么是反應(yīng)堆項目?

Project Reactor 是一個由 Pivotal 構(gòu)建并由 Spring 提供支持的框架。它實現(xiàn)了反應(yīng)式 API 模式,最著名的是反應(yīng)式流規(guī)范。

如果您熟悉Java 8 Streams,您會很快發(fā)現(xiàn) Stream 和 Flux(或其單元素版本 Mono)之間的許多相似之處。它們之間的主要區(qū)別在于 Fluxes 和 Monos 遵循一種publisher-subscriber模式并實現(xiàn)背壓,而 Stream API 則沒有。

背壓是數(shù)據(jù)端點向數(shù)據(jù)生產(chǎn)者發(fā)出信號,表明它接收了太多數(shù)據(jù)的一種方式。這允許更好的流量管理和分配,因為它可以防止單個組件過度工作。

使用 Reactor 的主要優(yōu)點是您可以完全控制數(shù)據(jù)流。您可以依靠訂閱者在準備好處理信息時詢問更多信息的能力,或者在發(fā)布者端緩沖一些結(jié)果,甚至使用沒有背壓的全推送方法。

在我們的反應(yīng)式堆棧中,它位于 Spring Boot 2.0 和 WebFlux 之上:

示例反應(yīng)式堆棧

 堆棧:技術(shù)堆棧是用于創(chuàng)建 Web 或移動應(yīng)用程序的軟件產(chǎn)品和編程語言的組合。反應(yīng)式堆棧是相同的,但用于創(chuàng)建反應(yīng)式應(yīng)用程序。

什么是 Spring WebFlux?

Spring WebFlux 是一個完全非阻塞、基于注解的 Web 框架,它構(gòu)建在 Project Reactor 之上,它使得在 HTTP 層上構(gòu)建響應(yīng)式應(yīng)用程序成為可能。WebFlux 使用新的路由器功能特性將函數(shù)式編程應(yīng)用于 Web 層并繞過聲明性控制器和請求映射。WebFlux 要求您將 Reactor 作為核心依賴項導(dǎo)入。

WebFlux 作為Spring MVC的響應(yīng)式替代品在 Spring 5 中添加,并增加了對以下內(nèi)容的支持:

  •  非阻塞線程:無需等待先前任務(wù)完成即可完成指定任務(wù)的并發(fā)線程。
  •  Reactive Stream API:一種標準化工具,包括用于非阻塞背壓的異步流處理選項。
  •  異步數(shù)據(jù)處理:當數(shù)據(jù)在后臺處理并且用戶可以不間斷地繼續(xù)使用正常的應(yīng)用程序功能時。

最終WebFlux摒棄了SpringMVC的多請求線程模型,而是使用多EventLoop非阻塞模型來啟用反應(yīng)式、可擴展的應(yīng)用程序。由于支持Netty、Undertow 和Servlet 3.1+ 容器等流行服務(wù)器,WebFlux 已成為反應(yīng)式堆棧的關(guān)鍵部分。

Router功能

RouterFunction是標準springmvc中使用的@RequestMapping和@Controller注釋樣式的一種功能替代。

我們可以使用它將請求路由到處理程序函數(shù):

  •  傳統(tǒng)的路由定義
 
 
 
 
  1. @RestController 
  2. public class ProductController { 
  3.     @RequestMapping("/product") 
  4.     public List productListing() { 
  5.         return ps.findAll(); 
  6.     } 
  7. }
  •  函數(shù)式定義
 
 
 
 
  1. @Bean 
  2. public RouterFunction productListing(ProductService ps) { 
  3.     return route().GET("/product", req -> ok().body(ps.findAll())) 
  4.       .build(); 
  5. }

你可以使用RouterFunctions.route()來創(chuàng)建路由,而不是編寫完整的路由器函數(shù)。路由注冊為spring的bean,因此可以在任何配置類中創(chuàng)建。路由器功能避免了由請求映射的多步驟過程引起的潛在副作用,而是將其簡化為直接的路由器/處理程序鏈。這允許函數(shù)式編程實現(xiàn)反應(yīng)式編程。

RequestMapping和Controller注釋樣式在WebFlux中仍然有效如果您對舊樣式更熟悉,RouterFunctions只是解決方案的一個新選項。

WebClient 詳解

項目中經(jīng)常用到發(fā)送Http請求的客戶端,如果你使用webflux那非常簡單去創(chuàng)建一個Http請求。WebClient是WebFlux的反應(yīng)式web客戶端,它是從著名的rest模板構(gòu)建的。它是一個接口,表示web請求的主要入口點,并支持同步和異步操作。WebClient主要用于反應(yīng)式后端到后端通信。

您可以通過使用Maven導(dǎo)入標準WebFlux依賴項來構(gòu)建和創(chuàng)建WebClient實例:

 
 
 
 
  1.  
  2.     org.springframework.boot 
  3.     spring-boot-starter-webflux 

創(chuàng)建實例

 
 
 
 
  1. WebClient webClient = WebClient.create(); 
  2. // 如果是調(diào)用特定服務(wù)的API,可以在初始化webclient 時使用,baseUrl 
  3. WebClient webClient = WebClient.create("https://github.com/1ssqq1lxr");

或者構(gòu)造器方式初始化

 
 
 
 
  1. WebClient webClient1 = WebClient.builder() 
  2.     .baseUrl("https://github.com/1ssqq1lxr") 
  3.     .defaultHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.github.v3+json") 
  4.     .defaultHeader(HttpHeaders.USER_AGENT, "Spring 5 WebClient")
  5.     .build();
  •  Get請求
 
 
 
 
  1. Mono resp = WebClient.create() 
  2.       .method(HttpMethod.GET) 
  3.       .uri("https://github.com/1ssqq1lxr") 
  4.       .cookie("token","xxxx") 
  5.       .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) 
  6.       .retrieve().bodyToMono(String.class);
  •  Post請求(表單)
 
 
 
 
  1. MultiValueMap formData = new LinkedMultiValueMap(); 
  2. formData.add("name1","value1"); 
  3. formData.add("name2","value2"); 
  4. Mono resp = WebClient.create().post() 
  5.       .uri("http://www.w3school.com.cn/test/demo_form.asp") 
  6.       .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
  7.       .body(BodyInserters.fromFormData(formData)) 
  8.       .retrieve().bodyToMono(String.class);
  •  Post請求(Body)
 
 
 
 
  1. Book book = new Book(); 
  2. book.setName("name"); 
  3. book.setTitle("this is title"); 
  4. Mono resp = WebClient.create().post()
  5.         .uri("https://github.com/1ssqq1lxr") 
  6.         .contentType(MediaType.APPLICATION_JSON_UTF8) 
  7.         .body(Mono.just(book),Book.class) 
  8.         .retrieve().bodyToMono(String.class);
  •  文件上傳
 
 
 
 
  1. HttpHeaders headers = new HttpHeaders(); 
  2. headers.setContentType(MediaType.IMAGE_PNG); 
  3. HttpEntity entity = new HttpEntity<>(new ClassPathResource("parallel.png"), headers); 
  4. MultiValueMap parts = new LinkedMultiValueMap<>(); 
  5. arts.add("file", entity); 
  6. Mono resp = WebClient.create().post() 
  7.         .uri("http://localhost:8080/upload") 
  8.         .contentType(MediaType.MULTIPART_FORM_DATA) 
  9.         .body(BodyInserters.fromMultipartData(parts)) 
  10.         .retrieve().bodyToMono(String.class);

Reactive Steam API

下篇文章給大家詳細講下Reactor3的API

Reactive Stream API是一個的函數(shù)集合,允許更智能的流數(shù)據(jù)流。它內(nèi)置了對背壓和異步處理的支持,確保應(yīng)用程序最有效地利用計算機和組件資源。

反應(yīng)流API有四個主要接口:

  •  Publisher:根據(jù)鏈接訂閱者的需求向他們發(fā)布事件。充當訂戶可以監(jiān)視事件的中心鏈接點。
  •  Subscriber:接收和處理發(fā)布服務(wù)器發(fā)出的事件。多個訂閱服務(wù)器可以鏈接到單個發(fā)布服務(wù)器,并對同一事件做出不同的響應(yīng)。訂戶可以設(shè)置為反應(yīng):
    •   onNext,當它接收到下一個事件時。
    •   onSubscribe,添加新訂閱時
    •   onError,當另一個訂閱服務(wù)器發(fā)生錯誤時
    •   onComplete,當一個訂閱完成時

Server容器

WebFlux在Tomcat、Jetty、servlet3.1+容器以及Netty和Undertow等非Servlet運行時上都受支持。Netty最常用于異步和非阻塞設(shè)計,因此WebFlux將默認使用它。只需對Maven或Gradle構(gòu)建軟件進行簡單的更改,就可以輕松地在這些服務(wù)器選項之間切換。

這使得WebFlux在它可以使用的技術(shù)方面具有高度的通用性,并允許您使用現(xiàn)有的基礎(chǔ)設(shè)施輕松地實現(xiàn)它。

并發(fā)模型

WebFlux是以無阻塞的思想構(gòu)建的,因此使用了與springmvc不同的并發(fā)編程模型。

springmvc假設(shè)線程將被阻塞,并在阻塞實例期間使用一個大的線程池來保持移動。這個更大的線程池使得MVC資源更密集,因為計算機硬件必須同時保持更多的線

WebFlux使用了一個小的線程池,因為它假設(shè)您永遠不需要通過工作來避免阻塞。這些線程稱為事件循環(huán)工作線程,數(shù)量固定,在傳入請求中的循環(huán)速度比MVC線程快。這意味著WebFlux更有效地使用計算機資源,因為活動線程總是在工作。

Spring WebFlux Security

WebFlux使用Spring安全性來實現(xiàn)身份驗證和授權(quán)協(xié)議。springsecurity使用WebFilter根據(jù)經(jīng)過身份驗證的用戶列表認證請求。

 
 
 
 
  1. @EnableWebFluxSecurity 
  2. public class HelloWebFluxSecurityConfig { 
  3.     @Bean 
  4.     public MapReactiveUserDetailsService userDetailsService() { 
  5.         UserDetails user = User.withDefaultPasswordEncoder() 
  6.             .username("user") 
  7.             .password("user") 
  8.             .roles("USER") 
  9.             .build();
  10.         return new MapReactiveUserDetailsService(user); 
  11.     } 
  12. }

在這里,我們可以看到用戶有一個用戶名、一個密碼和一個或多個roles標簽,這些標簽允許自定義定訪問。類似于SpringBoot Security的 UserDetailsService接口

開始使用 Spring WebFlux

生成項目

spring代碼生成器

參考配置

生成后的pom如下

 
 
 
 
  1.  
  2.  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 
  3.  4.0.0 
  4.   
  5.   org.springframework.boot 
  6.   spring-boot-starter-parent 
  7.   2.5.1 
  8.     
  9.   
  10.  com.github.webflux.learn 
  11.  demo
  12.  0.0.1-SNAPSHOT 
  13.  demo 
  14.  Demo project for Spring Boot 
  15.   
  16.   1.8 
  17.   
  18.   
  19.    
  20.    org.springframework.boot 
  21.    spring-boot-starter-webflux 
  22.    
  23.    
  24.    org.projectlombok 
  25.    lombok 
  26.    true 
  27.    
  28.    
  29.    org.springframework.boot 
  30.    spring-boot-starter-test 
  31.    test 
  32.    
  33.    
  34.    io.projectreactor 
  35.    reactor-test 
  36.    test 
  37.    
  38.   
  39.   
  40.    
  41.     
  42.     org.springframework.boot 
  43.     spring-boot-maven-plugin 
  44.      
  45.       
  46.       
  47.        org.projectlombok 
  48.        lombok 
  49.        
  50.       
  51.      
  52.     
  53.    
  54.    

開發(fā)接口

自定義一個函數(shù)路由:將請求path中的占位參數(shù)獲取作為返回值

 
 
 
 
  1. /** 
  2.  * @author coding途中 
  3.  */ 
  4. @Configuration 
  5. public class TestRouter { 
  6.     @Bean 
  7.     public RouterFunction routeExample() { 
  8.         return RouterFunctions 
  9.                 .route(RequestPredicates.GET("/hello/{path}").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), serverRequest -> { 
  10.                     String str = serverRequest.pathVariable("path"); 
  11.                     return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).bodyValue(str) 
  12.                             .switchIfEmpty(ServerResponse.notFound().build()); 
  13.                 }); 
  14.     } 
  15. }

瀏覽器請求 http://localhost:4990/hello/haha

 
 
 
 
  1. haha

添加認證

 
 
 
 
  1. /** 
  2.  * @author coding途中 
  3.  */
  4. @Configuration 
  5. @EnableWebFluxSecurity 
  6. public class HelloWebfluxSecurityConfig  { 
  7.     @Bean 
  8.     public MapReactiveUserDetailsService userDetailsService() { 
  9.         UserDetails user = User.withDefaultPasswordEncoder() 
  10.                 .username("user") 
  11.                 .password("user") 
  12.                 .roles("USER") 
  13.                 .build(); 
  14.         return new MapReactiveUserDetailsService(user);
  15.     } 
  16.     @Bean
  17.      public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { 
  18.         // @formatter:off 
  19.         return http.authorizeExchange() 
  20.                 .pathMatchers( "/hello/**").authenticated() 
  21.                 .pathMatchers("/hello/login").permitAll() 
  22.                 .anyExchange().authenticated() 
  23.                 .and() 
  24.                 .formLogin().and() 
  25.                 .logout().and() 
  26.                 .httpBasic().and() 
  27.                 .csrf().disable() 
  28.                 .build(); 
  29.     } 
  30. }
  •  再次請求接口 瀏覽器請求 http://localhost:4990/hello/haha 此時瀏覽重定向到 http://localhost:4990/login

登陸頁面

輸入user/user 用戶名密碼后完成登陸。

再次瀏覽器請求 http://localhost:4990/hello/authenticate

 
 
 
 
  1. authenticate 

網(wǎng)頁名稱:新一代SpringWeb框架WebFlux!
轉(zhuǎn)載來于:http://m.5511xx.com/article/dpjoiei.html