Panduan untuk Spring 5 WebFlux

1. Ikhtisar

Spring WebFlux adalah bagian dari Spring 5 dan memberikan dukungan pemrograman reaktif untuk aplikasi web.

Dalam tutorial ini, kita akan membuat aplikasi REST reaktif kecil menggunakan komponen web reaktif RestController dan WebClient.

Kami juga akan melihat cara mengamankan titik akhir reaktif kami menggunakan Keamanan Musim Semi.

2. Kerangka WebFlux Musim Semi

Spring WebFlux secara internal menggunakan Project Reactor dan implementasi penerbitnya - Flux dan Mono .

Kerangka kerja baru mendukung dua model pemrograman:

  • Komponen reaktif berbasis anotasi
  • Perutean dan penanganan fungsional

Kami akan fokus pada komponen reaktif berbasis anotasi, karena kami telah menjelajahi gaya fungsional - perutean dan penanganan di tutorial lain.

3. Ketergantungan

Mari kita mulai dengan dependensi spring-boot-starter-webflux , yang menarik semua dependensi lain yang diperlukan:

  • spring-boot dan spring-boot-starter untuk pengaturan aplikasi Spring Boot dasar
  • framework spring-webflux
  • reactor-core yang kita butuhkan untuk aliran reaktif dan juga reactor-netty
 org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE 

Spring-boot-starter-webflux terbaru dapat diunduh dari Maven Central.

4. Aplikasi REST Reaktif

Sekarang kita akan membuat aplikasi REST EmployeeManagement reaktif yang sangat sederhana - menggunakan Spring WebFlux:

  • Kami akan menggunakan model domain sederhana - Karyawan dengan id dan bidang nama
  • Kami akan membangun REST API dengan RestController untuk menerbitkan sumber daya Karyawan sebagai sumber daya tunggal dan sebagai koleksi
  • Kami akan membangun klien dengan WebClient untuk mengambil sumber daya yang sama
  • Kami akan membuat titik akhir reaktif yang aman menggunakan WebFlux dan Spring Security

5. RestController Reaktif

Spring WebFlux mendukung konfigurasi berbasis anotasi dengan cara yang sama seperti kerangka MVC Spring Web.

Untuk memulainya, di server, kami membuat pengontrol beranotasi yang menerbitkan aliran reaktif sumber daya Karyawan .

Mari buat EmployeeController beranotasi kita :

@RestController @RequestMapping("/employees") public class EmployeeController { private final EmployeeRepository employeeRepository; // constructor... }

EmployeeRepository dapat berupa repositori data apa pun yang mendukung aliran reaktif non-pemblokiran.

5.1. Sumber Daya Tunggal

Mari buat titik akhir di pengontrol kita yang menerbitkan satu sumber daya Karyawan :

@GetMapping("/{id}") private Mono getEmployeeById(@PathVariable String id) { return employeeRepository.findEmployeeById(id); }

Kami membungkus satu sumber daya Karyawan dalam Mono karena kami mengembalikan paling banyak satu karyawan.

5.2. Sumber Daya Koleksi

Mari tambahkan juga titik akhir yang menerbitkan sumber daya koleksi semua Karyawan :

@GetMapping private Flux getAllEmployees() { return employeeRepository.findAllEmployees(); }

Untuk resource collection, kami menggunakan Flux bertipe Employee - karena itulah penerbit untuk elemen 0. .n.

6. Klien Web Reaktif

WebClient yang diperkenalkan pada Spring 5 adalah klien non-pemblokiran dengan dukungan untuk streaming reaktif.

Kita bisa menggunakan WebClient untuk membuat klien untuk mengambil data dari titik akhir yang disediakan oleh EmployeeController.

Mari buat EmployeeWebClient sederhana :

public class EmployeeWebClient { WebClient client = WebClient.create("//localhost:8080"); // ... }

Di sini kita telah menciptakan sebuah WebClient menggunakan metode pabrik membuat . Ini akan mengarah ke localhost: 8080 sehingga kita dapat menggunakan atau URL relatif untuk panggilan yang dilakukan oleh instance klien ini.

6.1. Mengambil Sumber Daya Tunggal

Untuk mengambil sumber daya tunggal berjenis Mono dari endpoint / karyawan / {id} :

Mono employeeMono = client.get() .uri("/employees/{id}", "1") .retrieve() .bodyToMono(Employee.class); employeeMono.subscribe(System.out::println);

6.2. Mengambil Sumber Daya Koleksi

Demikian pula, untuk mengambil sumber daya kumpulan tipe Flux dari endpoint / karyawan :

Flux employeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); employeeFlux.subscribe(System.out::println);

Kami juga memiliki artikel mendetail tentang menyiapkan dan bekerja dengan WebClient .

7. Keamanan Spring WebFlux

Kita dapat menggunakan Keamanan Musim Semi untuk mengamankan titik akhir reaktif kita.

Misalkan kita memiliki titik akhir baru di EmployeeController. Titik akhir ini memperbarui detail Karyawan dan mengirim kembali Karyawan yang diperbarui .

Karena ini memungkinkan pengguna untuk mengubah karyawan yang ada, kami ingin membatasi titik akhir ini hanya untuk pengguna peran ADMIN .

Mari tambahkan metode baru ke EmployeeController kita :

@PostMapping("/update") private Mono updateEmployee(@RequestBody Employee employee) { return employeeRepository.updateEmployee(employee); }

Now, to restrict access to this method let's create SecurityConfig and define some path-based rules to only allow ADMIN users:

@EnableWebFluxSecurity public class EmployeeWebSecurityConfig { // ... @Bean public SecurityWebFilterChain springSecurityFilterChain( ServerHttpSecurity http) { http.csrf().disable() .authorizeExchange() .pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN") .pathMatchers("/**").permitAll() .and() .httpBasic(); return http.build(); } }

This configuration will restrict access to the endpoint /employees/update. Therefore only users having a role ADMIN will be able to access this endpoint and update an existing Employee.

Finally, the annotation @EnableWebFluxSecurity adds Spring Security WebFlux support with some default configurations.

We also have a detailed article on configuring and working with Spring WebFlux security.

8. Conclusion

In this article, we've explored how to create and work with reactive web components as supported by the Spring WebFlux framework. As an example, we've built a small Reactive REST application.

We learned how to use RestController and WebClient to publish and consume reactive streams.

We also looked into how to create a secured reactive endpoint with the help of Spring Security.

Other than Reactive RestController and WebClient, the WebFlux framework also supports reactive WebSocket and the corresponding WebSocketClient for socket style streaming of Reactive Streams.

We have a detailed article focused on working with Reactive WebSocket with Spring 5.

Terakhir, kode sumber lengkap yang digunakan dalam tutorial ini tersedia di Github.