Selamat Tahun Baru, Komunitas Musim Semi!
Ketika tahun menakjubkan berikutnya dari pengembangan dan peningkatan dalam ekosistem Spring dimulai, saya ingin berbagi dengan Anda contoh terbaru dari aplikasi yang menunjukkan bagian dari kemajuan yang dibuat dalam portofolio proyek Spring mengenai mendukung model pemrograman Reaktif.
Contoh aplikasi
BookStore Service Broker telah diperbarui untuk menunjukkan integrasi beberapa proyek Musim Semi yang berbeda, termasuk Spring Cloud Open Service Broker, Data Musim Semi, Keamanan Musim Semi, Musim Semi HATEOAS dan, tentu saja, Spring WebFlux dan Spring Boot. Semua proyek ini memiliki versi GA, termasuk dukungan Reaktif dan siap diproduksi di aplikasi dan layanan Anda sendiri.
Diterjemahkan oleh
@middle_javaUntuk kesederhanaan, aplikasi itu sendiri berfungsi baik sebagai pialang maupun sebagai contoh layanan. Meskipun pialang sendiri mematuhi API Pialang Layanan Terbuka, layanan yang mereka berikan didefinisikan lebih abstrak. Layanan dapat melakukan atau hampir apa saja. Dalam hal aplikasi kami, serangkaian kredensial baru dibuat untuk setiap instance layanan. Kredensial ini digunakan dalam permintaan ke instance layanan. URL instance layanan baru disetel sama dengan rute ke broker. Dengan demikian, kredensial digunakan untuk memisahkan permintaan ke berbagai layanan yang berbeda. Tujuannya adalah untuk mengembangkan contoh lengkap yang menunjukkan banyak bagian dari portofolio proyek Spring.
Broker Layanan Open Cloud Spring 3.1
Spring Cloud Open Service Broker adalah platform untuk membangun aplikasi Spring Boot yang mengimplementasikan API Open Service Broker, dan memungkinkan pengembang untuk menyediakan layanan untuk aplikasi yang berjalan pada platform cloud seperti Cloud Foundry, Kubernetes, dan OpenShift. Dimulai dengan versi 3.0, Spring Cloud Open Service Broker mendukung kerangka kerja Spring WebFlux dan Spring MVC menggunakan tipe Reactive di antarmuka pengontrol dan layanan.
Untuk memulai dengan Spring Cloud Open Service Broker, sertakan starter Spring Boot di aplikasi Anda:
implementation('org.springframework.cloud:spring-cloud-starter-open-service-broker:3.1.0.RELEASE')
Kemudian kami mengimplementasikan
ServiceInstateService
dan
ServiceInstateBindingService
. Kode berikut menggambarkan API yang diperlukan. Lihat contoh aplikasi untuk detail lengkap.
@Service public class BookStoreServiceInstanceService implements ServiceInstanceService { @Override public Mono < CreateServiceInstanceResponse > createServiceInstance( CreateServiceInstanceRequest request) { ... } @Override public Mono < GetServiceInstanceResponse > getServiceInstance( GetServiceInstanceRequest request) { ... } @Override public Mono < DeleteServiceInstanceResponse > deleteServiceInstance( DeleteServiceInstanceRequest request) { ... } }
Data musim semi moore
Dalam keluarga proyek
Spring Data , dukungan Reaktif pada awalnya diperkenalkan di
Spring Data Kay . Spring Data R2DBC baru-baru ini mengumumkan rilis GA, tetapi Spring Boot belum memiliki rilis GA yang terintegrasi dengan Spring Data R2DBC. Contoh ini menggunakan MongoDB sebagai penyimpanan data cadangan.
Untuk memulai dengan Reactive MongoDB, sertakan starter Spring Boot di aplikasi Anda:
implementation('org.springframework.boot:spring-boot-starter-data-mongodb-reactive')
Untuk menunjukkan, tambahkan server MongoDB bawaan:
implementation('de.flapdoodle.embed:de.flapdoodle.embed.mongo')
Kemudian atur Jet Repository:
@Configuration @EnableReactiveMongoRepositories(basePackageClasses = { ServiceBrokerRepositoryPackageMarker.class, WebRepositoryPackageMarker.class }) public class ApplicationRepositoryConfiguration { }
Terakhir, tentukan
ReactiveCrudRepository
. Antarmuka berikut adalah salah satu contoh dari aplikasi sampel:
public interface ServiceInstanceRepository extends ReactiveCrudRepository < ServiceInstance, String > { }
Keamanan pegas 5.2
Dukungan reaktif pada awalnya termasuk dalam
Spring Security 5, dan integrasi dengan Spring Boot dan Spring Framework terus berkembang.
Untuk menggunakan Spring Security, tambahkan starter Spring Boot:
implementation('org.springframework.boot:spring-boot-starter-security')
Selanjutnya, tentukan konfigurasi keamanan menggunakan
@EnableWebCardingSecurity
. Kode ini menggambarkan bagaimana satu aplikasi melindungi titik akhir broker
/v2
dan
/bookstars
, yang merespons permintaan dari mesin
/bookstars
layanan:
@Configuration @EnableWebFluxSecurity public class SecurityConfiguration { @Bean public SecurityWebFilterChain securityWebFilterChain( ServerHttpSecurity http) { return http .csrf().disable() .httpBasic() .and().authorizeExchange() .pathMatchers("/bookstores/**").authenticated() .pathMatchers("/v2/**").hasAuthority( SecurityAuthorities.ADMIN) .matchers(EndpointRequest.to("info", "health")).permitAll() .matchers(EndpointRequest.toAnyEndpoint()).hasAuthority( SecurityAuthorities.ADMIN) .and().build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
Selanjutnya, kami menerapkan
ReactiveUserDetailsService
:
@Service public class RepositoryUserDetailsService implements ReactiveUserDetailsService { private final UserRepository userRepository; public RepositoryUserDetailsService(UserRepository userRepository) { this.userRepository = userRepository; } }
Akhirnya, evaluator izin tidak didukung di pengontrol WebFlux, tetapi kami dapat mencapai fungsionalitas yang sama dengan memanggil kacang di ekspresi SpEL dan melewati objek Otentikasi:
@GetMapping("/{bookStoreId}") @PreAuthorize("hasAnyRole('ROLE_FULL_ACCESS','ROLE_READ_ONLY') and @bookStoreIdEvaluator.canAccessBookstore(authentication, #bookStoreId)") public Mono<ResponseEntity<BookStoreResource>> getBooks( @PathVariable String bookStoreId) { return bookStoreService.getBookStore(bookStoreId) .flatMap(this::createResponse); }
Contoh ini menganalisis izin untuk menentukan apakah ada pengidentifikasi toko buku:
public boolean canAccessBookstore(Authentication authentication, String bookStoreId) { return authentication.getAuthorities().stream() .filter(authority - > authority.getAuthority() .startsWith(BOOK_STORE_ID_PREFIX)) .map(authority - > { String serviceInstanceId = authority.getAuthority() .substring(BOOK_STORE_ID_PREFIX.length()); return serviceInstanceId.equals(bookStoreId); }) .findFirst() .orElse(true); }
Spring HATEOAS 1.0
Spring HATEOAS 1.0 GA baru-baru ini dirilis dan mencakup dukungan reaktif untuk menghubungkan dan memodelkan tampilan.
Tambahkan Spring HATEOAS Starter untuk mengaktifkan konfigurasi Spring Boot otomatis. Karena kami membuat Aplikasi Spring WebFlux Reactive, kami harus mengecualikan starter Web Spring:
implementation('org.springframework.boot:spring-boot-starter-hateoas') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-web' }
Selanjutnya, Anda dapat menggunakan
WebFluxLinkBuilder
untuk membangun sumber daya Hypermedia:
public Mono < BookResource > toModel(Book book, String bookStoreId) { return Mono.just(new BookResource(book)) .flatMap(bookResource - > linkTo(methodOn( BookController.class).getBook(bookStoreId, book.getId())) .withSelfRel() .toMono() .flatMap(link - > Mono.just(bookResource.add(link))) .thenReturn(bookResource)); }
Kemudian Anda dapat menggunakan sumber daya ini di tubuh respons pengontrol:
return new BookStoreResourceAssembler().toModel(bookStore) .flatMap(bookStoreResource - > Mono.just(new ResponseEntity < > (bookStoreResource, HttpStatus.OK)));
Kerangka pegas 5.2
Spring Framework 5 awalnya menawarkan Dukungan Reaktif di Spring WebFlux Web Framework baru. Selain itu, WebClient dan WebTestClient baru termasuk dukungan untuk menggunakan dan menguji aplikasi Spring WebFlux.
Untuk menggunakannya, cukup tambahkan permulaan Spring Boot:
implementation('org.springframework.boot:spring-boot-starter-webflux') testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' }
Misalnya, gunakan
WebTestClient
untuk menguji fungsionalitas pengontrol:
this.client.get().uri("/bookstores/{bookStoreId}", bookStoreId) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isEqualTo(HttpStatus.OK);
Boot musim semi 2.2
Spring Boot mengintegrasikan semua proyek ini, menawarkan Konfigurasi Otomatis Dukungan Reaktif di Spring WebFlux, Data Spring, Keamanan Spring, Spring HATEOAS, serta dalam alat pengujian. Dalam banyak kasus, implementasi hanya memerlukan penambahan permulaan Boot Musim Semi spesifik atau dependensi terkait untuk mengaktifkan fungsionalitas.
Kesimpulan
Posting ini termasuk pengantar singkat tentang Dukungan Reaktif di beberapa proyek Musim Semi. Karena semakin banyak proyek Musim Semi beradaptasi dan mendukung API Reaktif, pengembang akan memiliki lebih banyak pilihan untuk menggunakan pemrograman imperatif atau reaktif dalam aplikasi mereka. Selain itu, aplikasi sampel ini hanya menunjukkan beberapa proyek Musim Semi yang saat ini menawarkan Dukungan Reaktif. Cari lebih banyak di masa depan! Jika Anda memiliki pertanyaan atau masalah tentang proyek Musim Semi tertentu, silakan hubungi pengelola proyek di halaman GitHub yang sesuai.
Diterjemahkan oleh
@middle_java