Anwendungsbeispiel Federreaktiv (Stand 14.01.2020)

Frohes verspätetes neues Jahr, Frühlingsgemeinschaft!

Zu Beginn des nächsten erstaunlichen Jahres der Entwicklung und Verbesserung des Spring-Ökosystems möchte ich Ihnen ein aktualisiertes Anwendungsbeispiel vorstellen, das einen Teil der Fortschritte im Spring-Projektportfolio in Bezug auf die Unterstützung des reaktiven Programmiermodells demonstriert.

Die BookStore Service Broker-Beispielanwendung wurde aktualisiert, um die Integration verschiedener Spring-Projekte zu demonstrieren, darunter Spring Cloud Open Service Broker, Spring Data, Spring Security, Spring HATEOAS und natürlich Spring WebFlux und Spring Boot. Alle diese Projekte verfügen über GA-Versionen, einschließlich Reactive-Support, und sind für die Produktion in Ihren eigenen Anwendungen und Diensten bereit.

Übersetzt von @middle_java

Der Einfachheit halber fungiert die Anwendung selbst sowohl als Broker als auch als Service-Instanz. Obwohl sich die Broker selbst an die Open Service Broker-API halten, werden die von ihnen bereitgestellten Services abstrakter definiert. Dienste können fast alles tun oder sein. Bei unserer Anwendung wird für jede Instanz des Dienstes ein neuer Satz von Anmeldeinformationen erstellt. Diese Anmeldeinformationen werden in Anforderungen an die Dienstinstanz verwendet. Die URL der neuen Dienstinstanz wird auf die gleiche Adresse wie die Route zum Broker festgelegt. Aus diesem Grund werden Anmeldeinformationen verwendet, um Anforderungen an verschiedene Dienstinstanzen zu trennen. Ziel war es, ein voll ausgestattetes Beispiel zu entwickeln, das viele Teile des Spring-Projektportfolios zeigt.

Spring Cloud Open Service Broker 3.1


Spring Cloud Open Service Broker ist eine Plattform zum Erstellen von Spring Boot-Anwendungen, die die Open Service Broker-API implementieren, und ermöglicht Entwicklern, Dienste für Anwendungen bereitzustellen, die auf Cloud-Plattformen wie Cloud Foundry, Kubernetes und OpenShift ausgeführt werden. Ab Version 3.0 unterstützt Spring Cloud Open Service Broker Spring WebFlux- und Spring MVC-Webframeworks mit reaktiven Typen in der Controller- und Serviceschnittstelle.

Um mit dem Spring Cloud Open Service Broker zu beginnen, fügen Sie den Spring Boot-Starter in Ihre Anwendung ein:

implementation('org.springframework.cloud:spring-cloud-starter-open-service-broker:3.1.0.RELEASE') 

Dann implementieren wir ServiceInstateService und ServiceInstateBindingService . Der folgende Code veranschaulicht die erforderliche API. Ausführliche Informationen finden Sie in der Beispielanwendung.

 @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) { ... } } 

Frühlingsdaten mehr


In der Spring Data- Projektfamilie wurde die reaktive Unterstützung ursprünglich in Spring Data Kay eingeführt . Spring Data R2DBC hat kürzlich eine GA-Version angekündigt, Spring Boot verfügt jedoch noch nicht über eine GA-Version, die in Spring Data R2DBC integriert ist. In diesem Beispiel wird MongoDB als Sicherungsdatenspeicher verwendet.

Um mit Reactive MongoDB zu beginnen, fügen Sie den Spring Boot-Starter in Ihre Anwendung ein:

 implementation('org.springframework.boot:spring-boot-starter-data-mongodb-reactive') 

Fügen Sie zur Veranschaulichung den integrierten MongoDB-Server hinzu:

 implementation('de.flapdoodle.embed:de.flapdoodle.embed.mongo') 

Richten Sie dann das Jet-Repository ein:

 @Configuration @EnableReactiveMongoRepositories(basePackageClasses = { ServiceBrokerRepositoryPackageMarker.class, WebRepositoryPackageMarker.class }) public class ApplicationRepositoryConfiguration { } 

Definieren Sie ReactiveCrudRepository . Die folgende Schnittstelle ist ein Beispiel für eine Beispielanwendung:

 public interface ServiceInstanceRepository extends ReactiveCrudRepository < ServiceInstance, String > { } 

Federsicherung 5.2


Die reaktive Unterstützung war ursprünglich in Spring Security 5 enthalten, und die Integration in Spring Boot und das Spring Framework wird weiterentwickelt.

Fügen Sie den Spring Boot-Starter hinzu, um Spring Security zu verwenden:

 implementation('org.springframework.boot:spring-boot-starter-security') 

Definieren Sie als Nächstes die Sicherheitskonfiguration mit @EnableWebCardingSecurity . Dieser Code veranschaulicht, wie eine Anwendung die Broker-Endpunkte /v2 und /bookstars , die auf Anforderungen von /bookstars reagieren:

 @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(); } } 

Als nächstes implementieren wir ReactiveUserDetailsService :

 @Service public class RepositoryUserDetailsService implements ReactiveUserDetailsService { private final UserRepository userRepository; public RepositoryUserDetailsService(UserRepository userRepository) { this.userRepository = userRepository; } } 

Schließlich werden Berechtigungsauswertungsprogramme in WebFlux-Controllern nicht unterstützt. Sie können jedoch eine ähnliche Funktionalität erzielen, indem Sie das Bean im SpEL-Ausdruck aufrufen und das Authentication-Objekt übergeben:

 @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); } 

In diesem Beispiel werden Berechtigungen analysiert, um festzustellen, ob eine Buchhandlungs-ID vorhanden ist:

 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); } 

Frühling HATEOAS 1.0


Spring HATEOAS 1.0 GA wurde kürzlich veröffentlicht und bietet reaktive Unterstützung für das Verknüpfen und Modellieren von Ansichten.

Fügen Sie einen Spring HATEOAS Starter hinzu, um die automatische Spring Boot-Konfiguration zu aktivieren. Da wir die reaktive Spring WebFlux-Anwendung erstellen, müssen wir den Spring Web-Starter ausschließen:

 implementation('org.springframework.boot:spring-boot-starter-hateoas') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-web' } 

Als Nächstes können Sie mit WebFluxLinkBuilder Hypermedia-Ressourcen erstellen:

 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)); } 

Dann können Sie diese Ressource im Hauptteil der Controller-Antwort verwenden:

 return new BookStoreResourceAssembler().toModel(bookStore) .flatMap(bookStoreResource - > Mono.just(new ResponseEntity < > (bookStoreResource, HttpStatus.OK))); 

Federrahmen 5.2


Spring Framework 5 bot ursprünglich Reactive Support im neuen Spring WebFlux Web Framework. Darüber hinaus unterstützen der neue WebClient und der neue WebTestClient die Verwendung und das Testen von Spring WebFlux-Anwendungen.

Fügen Sie dazu einfach Spring Boot-Starter hinzu:

 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' } 

Verwenden WebTestClient zum Beispiel WebTestClient , um die Controller-Funktionalität zu testen:

 this.client.get().uri("/bookstores/{bookStoreId}", bookStoreId) .accept(MediaType.APPLICATION_JSON) .exchange() .expectStatus().isEqualTo(HttpStatus.OK); 

Federstiefel 2.2


Spring Boot integriert all diese Projekte und bietet eine automatische Konfiguration der reaktiven Unterstützung in Spring WebFlux, Spring Data, Spring Security, Spring HATEOAS sowie in Testtools. In vielen Fällen müssen für die Implementierung nur bestimmte Spring Boot-Starter oder verwandte Abhängigkeiten hinzugefügt werden, um die Funktionalität zu aktivieren.

Fazit


Dieser Beitrag enthält eine kurze Einführung in Reactive Support in einigen Frühjahrsprojekten. Je mehr Spring-Projekte die Reactive APIs anpassen und unterstützen, desto mehr Möglichkeiten haben Entwickler, Imperative oder Reactive Programming in ihren Anwendungen zu verwenden. Darüber hinaus werden in dieser Beispielanwendung nur einige der Frühjahrsprojekte veranschaulicht, die derzeit Reactive Support anbieten. Suchen Sie in Zukunft nach mehr! Wenn Sie Fragen oder Bedenken zu einem bestimmten Spring-Projekt haben, wenden Sie sich bitte an die Projektbetreuer auf der entsprechenden GitHub-Seite.

Übersetzt von @middle_java

Source: https://habr.com/ru/post/de485498/


All Articles