Enseñarle cómo usar RSocket en Spring Boot.
Comencemos agregando la dependencia spring-boot-starter-rsocket:
Esta dependencia extraerá de manera transitoria las dependencias relacionadas con RSocket, como rsocket-core y rsocket-transport-netty.
Ahora pasemos a la aplicación sencilla. Para resaltar los modos interactivos proporcionados por RSocket, planeo crear una aplicación comercial que consta de un cliente y un servidor.
3.1. Configuración del servidor
Primero, configuramos el servidor RSocket iniciado por la aplicación springboot. Debido a la dependencia de Spring-Boot-Starter-R Socket, springboot configura automáticamente el servidor R Socket. Como de costumbre, puede modificar los valores de configuración predeterminados del servidor RSocket según las propiedades. Por ejemplo, modifique el puerto RSocket agregando la siguiente configuración en application.properties.
Puedes modificar aún más otras propiedades del servidor según sea necesario.
3.2. Configurar el cliente
A continuación, configuremos el cliente, que también es una aplicación springboot. Aunque Springboot configura automáticamente la mayoría de los componentes relacionados con RSocket, algunos objetos también deben personalizarse para completar la configuración.
Aquí creamos el cliente RSocket y configuramos el puerto TCP en: 7000. Nota: Ya hemos configurado este puerto de servicio. A continuación, definimos un objeto de decoración RSocketRequester para RSocket. Este objeto nos ayudará cuando interactuemos con el servidor RSocket. Después de definir estas configuraciones de objetos, tenemos un marco. A continuación expondremos diferentes modos de interacción para ver cómo Springboot puede ayudar aquí.
Hablemos primero de solicitud/respuesta, que también utiliza HTTP y es el método de interacción más común y similar. En este modo interactivo, el cliente inicia la comunicación y envía solicitudes. Luego, el servidor realiza la operación y devuelve una respuesta al cliente; en este punto, la comunicación está completa. En nuestra aplicación de negociación, un cliente solicita datos de mercado actuales para una acción determinada. En respuesta, el servidor pasará los datos solicitados.
4.1. Servidor de Red de Computadoras
En el lado del servidor, primero debemos crear un controlador para contener los métodos de nuestro procesador. Usaremos la anotación @MessageMapping en lugar de la anotación @RequestMapping o @GetMapping en SpringMVC.
Echemos un vistazo a nuestro controlador. Definiremos un controlador usando la anotación @Controller para manejar las solicitudes que llegan a RSocket. Además, la anotación @MessageMapping nos permite definir las rutas de interés y cómo responder a las solicitudes. En este ejemplo, el servidor escucha la ruta currentMarketData y responde con un resultado mono
Cliente 4.2
A continuación, nuestro cliente RSocket debería preguntar el precio de una acción y obtener un. respuesta. Para inicializar la solicitud, debemos usar la clase RSocketRequester de la siguiente manera:
Nota: En el ejemplo, el cliente RSocket también es un controlador de estilo REST que se usa para acceder a nuestro servidor RSocket. Por lo tanto, utilizamos las anotaciones @RestController y @GetMapping para definir nuestros puntos finales de solicitud/respuesta.
En el método de punto final, usamos la clase RSocketRequester y especificamos la ruta. De hecho, esta es la ruta esperada por RSocket del lado del servidor, y luego pasamos los datos solicitados. Finalmente, cuando llamamos al método retrieveMono(), springboot nos ayudará a iniciar la interacción solicitud/respuesta.
A continuación, echemos un vistazo al modo interactivo de Fire and Oblivion. Como sugiere el nombre, el cliente envía una solicitud al servidor pero no espera una respuesta del servidor. En nuestro programa comercial, algunos clientes actuarán como recursos de datos y enviarán datos del mercado al servidor.
5.1. Lado del servidor
Creemos otro punto final en la aplicación del servidor como se muestra a continuación:
Definiremos la nueva ruta @MessageMapping nuevamente para CollectMarketData. Además, Spring Boot convierte automáticamente las cargas útiles entrantes en instancias de MarketData. Sin embargo, la mayor diferencia aquí es que devolvemos un Cliente Mono
5.2.
Veamos cómo inicializar nuestras solicitudes de modo de inicio y olvido. Crearemos otro punto final de estilo REST como se muestra a continuación:
Aquí especificamos que la ruta y la carga útil serán una instancia de MarketData. Dado que utilizamos el método send() en lugar de retrieveMono(), todos los modos de interacción pasan a ser modos de configurar y olvidar.
La transmisión de solicitudes es un patrón de interacción más complejo en el que el cliente envía una solicitud pero recibe múltiples respuestas del servidor durante un período de tiempo. Para simular este modo de interacción, el cliente solicitará todos los datos del mercado para una acción determinada.
6.1. Lado del servidor
Empecemos por el servidor. Agregaremos otro método de mapa de mensajes de la siguiente manera:
Como puede ver, este método de controlador es muy similar a los otros métodos de controlador. La diferencia es que devolvemos un flujo
6.2. Cliente
En el lado del cliente, debemos crear un punto final para inicializar la comunicación solicitud/respuesta de la siguiente manera:
Estudiemos las solicitudes de RSocket. Primero, definimos la ruta y solicitamos la carga útil. Luego, definimos las expectativas de respuesta cuando se llama con retrieveFlux(). Esta parte determina el método de interacción. Nota adicional: dado que nuestro cliente también es un servidor de estilo REST, el cliente también define el tipo de medio de respuesta text_event_stream_value.
Aquí marcamos el método de manejo de excepciones como @MessageExceptionHandler. Por lo tanto, este método manejará todos los tipos de excepciones ya que excepción es la superclase de todos los demás tipos de excepciones. También podemos crear explícitamente más tipos diferentes y diferentes métodos de manejo de excepciones. Por supuesto, este es el modo solicitud/respuesta, lo que devolvemos es mono