La programación receptiva ha sido popular entre la comunidad de desarrolladores y los clientes en los últimos años debido a su capacidad para crear aplicaciones de manera declarativa en lugar de obligarlos a formar aplicaciones más sensibles y resistentes. El hecho de que Spring 5 incorpore sistemas de reacción en su marco central ha mostrado un cambio de paradigma a la programación declarativa.
La programación receptiva gestiona los flujos de datos asincrónicos entre los productores de datos y los consumidores, que deben responder a los datos de manera suave. Por lo tanto, la programación receptiva es una aplicación suave que es asíncrona y basada en eventos, lo que requiere un pequeño número de hilos a escala.
La programación receptiva es difícil de construir arquitecturas basadas en hilos debido a la alta complejidad involucrada en la expansión de aplicaciones basadas en estados, hilos y cerraduras mutables compartidos.
En el contexto de la programación receptiva, "Cuando hay datos en una secuencia, todo es una transmisión y se comporta de manera suave".
La abstracción de alto nivel y la programación receptiva conducen a una mejor legibilidad de código, por lo que los desarrolladores pueden centrarse principalmente en la interdependencia de los eventos que definen la lógica comercial.
En entornos altamente concurrentes, el patrón de respuesta es naturalmente adecuado para el procesamiento de mensajes, que es un caso de uso empresarial común.
Debido a la naturaleza de la contrapresión de ejecución, un enfoque receptivo es el más adecuado para controlar el tráfico entre productores y consumidores, lo que ayudará a evitar el agotamiento de la memoria.
Para uno o varios hilos, las tareas de enlace IO se pueden ejecutar de forma asincrónica y sin bloquear sin bloquear el hilo actual.
Las notificaciones de los subsistemas de conexión múltiple pueden activarse en aplicaciones de alta interacción y en tiempo real o cualquier operación/evento, en cuyo caso la programación receptiva puede administrarse de manera más eficiente.
El "flujo de respuesta" define una especificación API que contiene un conjunto mínimo de interfaces que revelan métodos para definir operaciones y entidades de flujos de datos que no son backpresas sin bloqueo.
Con la introducción de la presión posterior, el flujo de respuesta permite al usuario controlar el tipo de cambio de datos desde el editor.
La transmisión de respuesta API Java.util.concurrent.flow se ha convertido oficialmente en parte de Java 9.
La corriente de respuesta se usa principalmente como una capa de interoperabilidad.
Tanto el módulo de reactivo Spring-Web como el MVC de Spring admiten la misma programación de @Controller, pero Spring-Web-Reactive se ejecuta en motores reactivos y sin bloqueo.
Siga este documento, vea:
http://docs.spring.io/spring-ramework/docs/5.0.0.build-snapshot/spring-framework-reference/html/web-reactive.html
El módulo reactivo de Spring-WEB y el MVC de primavera comparten muchos algoritmos comunes, pero el módulo de reacción de Spring-WEB ha redefinido muchos contratos de MVC de primavera, como la mano de mano y el controlador de controlador, para que sean asíncronos y no bloqueados, y para encender las solicitudes y respuestas HTTP (en el formulario de la formulario de routerfunción y handlerfunción).
Además de la placa de restauración existente, también se introduce un nuevo client web receptivo en la primavera 5.
Los clientes de HTTP que admiten la programación receptiva (como Reactor, Netty, Untow) han adoptado una serie de abstracciones receptivas de ClientHTTPRequest y ClienthttTTPSponse que exponen las solicitudes y los cuerpos de respuesta como flujo <satabuffer> y proporcionan soporte de retroceso integral en el lado de lectura y escritura.
El marco de Spring 5 introduce el reactor como una implementación de la especificación de transmisiones reactivas.
Reactor es la biblioteca reactiva de la próxima generación para construir aplicaciones que no sean de bloqueo en el JVM.
Reactor extiende el contrato básico del editor de transmisiones reactivas y define los tipos de flujo y mono API para proporcionar operaciones declarativas para secuencias de datos de 0..N y 0..1, respectivamente.
Spring Web Reactive utiliza Servlet 3.1 para proporcionar E/S sin bloqueo y se ejecuta en contenedores Servlet 3.1.
Spring WebFlux ofrece dos modelos de programación para elegir.
Spring 5 incluye Spring Web Reactive (bajo el módulo de reacción de Spring-Web) y Spring Web MVC (debajo del módulo Spring-WebMVC).
Aunque los módulos de MVC web de Spring Web y Spring Web comparten muchos algoritmos, debido a que Spring Web Reactive puede ejecutarse en la capa de adaptador HTTP HTTP de los flujos HTTP que no bloquean, no comparten código entre ellos.
La ejecución de Spring MVC requiere un contenedor de servlet, mientras que Spring Web Reactive también puede ejecutarse en tiempos de ejecución no servicio, como en Netty y Untow.
Si necesita utilizar una pila web que no sea de bloqueo con un marco web funcional ligero y usarla con Java 8 Lambda o Kotlin, debe considerar cambiar de aplicaciones MVC de Spring a Spring Web Reactive.
Esta es una versión 2.0.0 M5 de Pom.xml que se basa en WebFiux.
<Parent> <MoupRoMID> org.springframework.boot </groupid> <artifactid> spring-boot-starter-parent </arfactid> <verserse> 2.0.0.m5 </verversion> </parent> <pendencies> <pendency> <grupo> org.springframework.boot </proupid> <artifactID> spring-boot starter-webflux </artifactid> </dependencia> </pendencs>
Método tradicional versus método de respuesta
En los métodos tradicionales, la ejecución se bloqueará y esperará hasta que se complete la ejecución de su servicio. En el siguiente código, después de la primera declaración de impresión, la ejecución del programa se bloqueará y esperará a que la ejecución del servicio se complete. Después de completar la ejecución del servicio, se reanuda la ejecución del programa y se ejecuta una segunda declaración de impresión.
@GetMapping ("/tradicional") Lista pública <Product> getAllProducts () {System.out.println ("Way tradicional iniciada"); Lista <Product> Productos = ProducerService.getProducts ("tradicional"); System.out.println ("camino tradicional completado"); Productos de devolución;}En el método de respuesta, la ejecución del programa continuará sin esperar la finalización de la ejecución del servicio. En el siguiente código, después de la primera declaración de impresión, la segunda declaración de impresión se ejecutará de manera que no sea de bloqueo sin esperar a que la ejecución del servicio se complete. El flujo de flujo se llenará con la disponibilidad de datos del producto.
@GetMapping (value = "/reactive", .Text_event_stream_value) Public Flux <Product> getAll () {System.out.println ("Camino reactivo usando el flujo iniciado"); Flux <Product> FluxProducts = prodService.getProductsStream ("Flux"); System.out.println ("forma reactiva usando flujo completado"); return fluxproducts;}Además de la plantilla de restauración existente, Spring 5 también introdujo el client web reactivo.
Las abstracciones ClientHttpRequest y ClientHttTTTPonse exponen los cuerpos de solicitud y respuesta utilizando Flux <Stabuffer> y proporcionan soporte de retroceso completo tanto en el lado de lectura como en la escritura.
Las abstracciones de codificadores y decodificadores del núcleo de resorte también se usan en el lado del cliente para serializar o transmitir FLU de Endian a objetos de tipo.
Aquí hay un ejemplo de un cliente web reactivo que llama al terminal y recibe y procesa objetos de flujo de flujo reactivo.
@GetMapping ("/cuentas/{id}/alerts") Flux público <Alert> getAccountAlts (@PathVariable Long ID) {WebClient WebClient = new WebClient (new ReactorclientHttpConnector ()); Devuelve this.repository.getAccount (id) .flatmap (cuenta -> webclient.perform (get ("/alerts/{key}", cuenta.getKey ())). Extract (BodyStream (alert.class)));}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.