Spring Boot響應式客戶端WebClient入門

banq發表於2018-11-12

WebClient是一個響應式客戶端,它提供了RestTemplate的替代方法。它公開了一個功能齊全、流暢的API,並依賴於非阻塞I / O,使其能夠比RestTemplate更高效地支援高併發性。WebClient非常適合流式的傳輸方案,並且依賴於較低階別的HTTP客戶端庫來執行請求,是可插拔的。
如果在你係統的類路徑上有Spring WebFlux,就可以選擇使用WebClient來呼叫遠端REST服務。相比之下RestTemplate,這個客戶端具有更多的函式感並且完全Reactive響應式的。您可以在Spring Framework文件WebClient的專用 部分中瞭解有關該內容的更多資訊。
WebClient使用與WebFlux伺服器應用程式相同的編解碼器,並與伺服器功能Web框架共享公共基本包,一些通用API和基礎結構。API公開了Reactor Flux和Mono型別。預設情況下,它使用Reactor Netty作為HTTP客戶端庫,但其他人可以透過自定義ClientHttpConnector插入。
與RestTemplate相比,WebClient是:
  • 非阻塞,Reactive的,並支援更高的併發性和更少的硬體資源。
  • 提供利用Java 8 lambdas的函式API。
  • 支援同步和非同步方案。
  • 支援從伺服器向上或向下流式傳輸。

RestTemplate不適合在非阻塞應用程式中使用,因此Spring WebFlux應用程式應始終使用WebClient。在大多數高併發場景中,WebClient也應該是Spring MVC中的首選,並且用於編寫一系列遠端,相互依賴的呼叫。

讓我們建立一個新Spring Boot專案,包含org.springframework.boot:spring-boot-starter-webflux,org.projectlombok:lombok。使用Maven:
spring init --dependencies=webflux,lombok --language=maven --build=gradle spring-boot-webclient
pom.xml主要依賴:

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>



在這個例子中,我們將使用RESTFul在這個專案中實現一個服務案例,這是一個Android應用案例,主要用於改善你的飲料食譜健康方面的app,下面主要是伺服器端方面,它將食譜和飲料暴露為API服務。

retrieve()方法
retrieve()方法是獲取響應內容並對其進行解碼的最簡單方法:

@Service
public class BeverageServiceImpl implements BeverageService {

  private WebClient client = WebClient.create("http://jugoterapia.josdem.io/jugoterapia-server");

  public Mono<Beverage> getBeverage(Long id){
    return client.get()
      .uri("/beverages/{id}", id).accept(APPLICATION_JSON)
      .retrieve()
      .bodyToMono(Beverage.class);
  }

}


飲料服務介面:
public interface BeverageService { Mono<Beverage> getBeverage(Long id); }

現在讓我們建立一個簡單的POJO來從我們的API中檢索資訊。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Beverage {

  private Long id;
  private String name;
  private String ingredients;
  private String recipe;

}


接下來,我們將CommandLineRunner用於啟動我們的工作流程。這CommandLineRunner是Spring Boot中的回撥介面,當Spring Boot啟動時會呼叫它並透過run()內部方法傳入args 。

@SpringBootApplication
public class DemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
  }

  @Bean
  CommandLineRunner run(BeverageService beverageService){
    return args -> {
      beverageService.getBeverage(35)
      .subscribe(System.out::println);
    };
  }

}


以上原始碼下載:此處

相關文章