Ce contenu n'est pas disponible dans la langue sélectionnée.
Chapter 2. Developing reactive applications using Spring Boot with Eclipse Vert.x
This section provides an introduction to developing applications in a reactive way using Spring Boot starters based on Spring Boot and Eclipse Vert.x. The following examples demonstrate how you can use the starters to create reactive applications.
2.1. Introduction to Spring Boot with Eclipse Vert.x Copier lienLien copié sur presse-papiers!
The Spring reactive stack is build on Project Reactor, a reactive library that implements backpressure and is compliant with the Reactive Streams specification. It provides the Flux
and Mono
functional API types that enable asynchronous event stream processing.
On top of Project Reactor, Spring provides WebFlux, an asynchronous event-driven web application framework. While WebFlux is designed to work primarily with Reactor Netty, it can also operate with other reactive HTTP servers, such as Eclipse Vert.x.
Spring WebFlux and Reactor enable you to create applications that are:
- Non-blocking: The application continues to handle further requests when waiting for a response from a remote component or service that is required to complete the current request.
- Asynchronous: the application responds to events from an event stream by generating response events and publishing them back to the event stream where they can be picked up by other clients in the application.
- Event-driven: The application responds to events generated by the user or by another service, such as mouse clicks, HTTP requests, or new files being added to a storage.
- Scalable: Increasing the number of Publishers or Subscribers to match the required event processing capacity of an application only results in a slight increase in the complexity of routing requests between individual clients in the application. Reactive applications can handle large numbers of events using fewer computing and networking resources as compared to other application programming models.
- Resilient: The application can handle failure of services it depend on without a negative impact on its overall quality of service.
Additional advantages of using Spring WebFlux include:
- Similarity with SpringMVC
- The SpringMVC API types and WebFlux API types are similar, and it is easy for developers to apply knowledge of SpringMVC to programming applications with WebFlux.
The Spring Reactive offering by Red Hat brings the benefits of Reactor and WebFlux to OpenShift and stand-alone RHEL, and introduces a set of Eclipse Vert.x extensions for the WebFLux framework. This allows you to retain the level of abstraction and rapid prototyping capabilities of Spring Boot, and provides an asynchronous IO API that handles the network communications between the services in your application in a fully reactive manner.
- Annotated controllers support
- WebFlux retains the endpoint controller annotations introduced by SpringMVC (Both SpringMVC and WebFlux support reactive RxJava2 and Reactor return types).
- Functional programming support
-
Reactor interacts with the Java 8 Functional API, as well as
CompletablebFuture
, andStream
APIs. In addition to annotation-based endpoints, WebFlux also supports functional endpoints.
Additional resources
See the following resources for additional in-depth information on the implementation details of technologies that are part of the Spring Reactive stack:
- The Reactive Manifesto
- Reactive Streams specification
- Spring Framework reference documentation: Web Applications on Reactive Stack
- Reactor Netty documentation
-
API Reference page for the
Mono
class in Project Reactor Documentation -
API Reference page for the
Flux
class in Project Reactor Documentation
2.2. Reactive Spring Web Copier lienLien copié sur presse-papiers!
The spring-web
module provides the foundational elements of the reactive capabilities of Spring WebFlux, including:
-
HTTP abstractions provided by the
HttpHandler
API - Reactive Streams adapters for supported servers (Eclipse Vert.x, Undertow and others)
Codecs for encoding and decoding event stream data. This includes:
-
DataBuffer
, an abstraction for different types of byte buffer representations (NettyByteBuf
,java.nio.ByteBuffer
, as well as others) - Low-level contracts to encode and decode content independent of HTTP
-
HttpMessageReader
andHTTPMessageWriter
contracts to encode and decode HTTP message content
-
-
The
WebHandler
API (a counterpart to the Servlet 3.1 I/O API that uses non-blocking contracts).
When designing your web application, you can choose between 2 programming models that Spring WebFlux provides:
- Annotated Controllers
-
Annotated controllers in Spring WebFlux are consistent with Spring MVC, and are based on the same annotations from the
spring-web
module. In addition to thespring-web
module from SpringMVC, its WebFlux counterpart also supports reactive@RequestBody
arguments. - Functional Endpoints
- Functional endpoints provided by spring WebFlux on Java 8 Lambda expressions and functional APIs, this programming model relies on a dedicated library (Reactor, in this case) that routes and handles requests. As opposed to annotation-based endpoint controllers that rely on declaring Intent and using callbacks to complete an activity, the reactive model based on functional endpoints allows request handling to be fully controlled by the application.
2.3. Creating a reactive Spring Boot HTTP service with WebFlux Copier lienLien copié sur presse-papiers!
Create a basic reactive Hello World HTTP web service using Spring Boot and WebFlux.
Prerequisites
- JDK 8 or JDK 11 installed
- Maven installed
- A Maven-based application project configured to use Spring Boot
Procedure
Add
vertx-spring-boot-starter-http
as a dependency in thepom.xml
file of your project.pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a main class for your application and define the router and handler methods.
HttpSampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-http.jar
$ java -jar target/vertx-spring-boot-sample-http.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow In a new terminal window, issue an HTTP request on the
/hello
endpoint:curl localhost:8080/hello
$ curl localhost:8080/hello Hello, World!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Provide a custom name with your request to get a personalized response:
curl http://localhost:8080/hello?name=John
$ curl http://localhost:8080/hello?name=John Hello, John!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
- For more detail on creating reactive web services with Spring Boot, see the reactive REST service development guide in the Spring community documentation.
2.4. Using basic authentication in a reactive Spring Boot WebFlux application. Copier lienLien copié sur presse-papiers!
Create a reactive Hello World HTTP web service with basic form-based authentication using Spring Security and WebFlux starters.
Prerequisites
- JDK 8 or JDK 11 installed
- Maven installed
- A Maven-based application project configured to use Spring Boot
Procedure
Add
vertx-spring-boot-starter-http
andspring-boot-starter-security
as dependencies in thepom.xml
file of your project.pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create an endpoint controller class for your application:
HelloController.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the main class of your application:
HttpSecuritySampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
SecurityConfiguration
class that stores the user credentials for accessing the/hello
endpoint.SecurityConfiguration.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-http-security.jar
$ java -jar target/vertx-spring-boot-sample-http-security.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Navigate to
http://localhost:8080
using a browser to access the login screen. Log in using the credentials below:
- username: user
- password: user
You receive a customized greeting when you are logged in:
Hello, user!
Hello, user!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Navigate to
http://localhost:8080/logout
using a web browser and use the Log out button to log out of your application. Alternatively, use a terminal to make an unauthenticated HTTP request on
localhost:8080
. You receive HTTP401 Unauthorized
response from your application.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Issue an authenticated request using the example user credentials. You receive a personalized response.
curl -u user:user http://localhost:8080
$ curl -u user:user http://localhost:8080 Hello, user!
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
- For the full specification of the Basic HTTP authentication scheme, see document RFC-7617.
- For the full specification of HTTP authentication extensions for interactive clients, including form-based authentication, see document RFC-8053.
2.5. Using OAuth2 authentication in a reactive Spring Boot application. Copier lienLien copié sur presse-papiers!
Set up OAuth2 authentication for your reactive Spring Boot application and authenticate using your client ID and client secret.
Prerequisites
- JDK 8 or JDK 11 installed
- Maven installed
- A Maven-based application project configured to use Spring Boot
- A GitHub account
Procedure
Register a new OAuth 2 application on your Github account. Ensure that you provide the following values in the registration form:
-
Homepage URL:
http://localhost:8080
Authorization callback URL:
http://localhost:8080/login/oauth2/code/github
Ensure that you save the client ID and a client secret that you receive upon completing the registration.
-
Homepage URL:
Add the following dependencies in the
pom.xml
file of your project:-
vertx-spring-boot-starter-http
-
spring-boot-starter-security
-
spring-boot-starter-oauth2-client
reactor-netty
Note that the
reactor-netty
client is required to ensure thatspring-boot-starter-oauth2-client
works properly.pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
Create an endpoint controller class for your application:
HelloController.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the main class of your application:
OAuthSampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a YAML configuration file to store the OAuth2 client ID and client secret you received from GitHub upon registering your application.
src/main/resources/application.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-http-oauth.jar
$ java -jar target/vertx-spring-boot-sample-http-oauth.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Navigate to
http://localhost:8080
using a web browser. You are redirected to an OAuth2 application authorization screen on GitHub. If prompted, log in using your GitHub account credentials. - Click Authorize to confirm. You are redirected to a screen showing a personalized greeting message.
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
- For more information, see the OAuth2 tutorial in the Spring community documentation. Alternatively, see the tutorial on using OAuth2 with Spring Security.
- For the full OAuth2 authentication framework specification, see document RFC-6749.
2.6. Creating a reactive Spring Boot SMTP mail application Copier lienLien copié sur presse-papiers!
Create a reactive SMTP email service with Spring Boot with Eclipse Vert.x.
Prerequisites
- JDK 8 or JDK 11 installed
- Maven installed
- A Maven-based application project configured to use Spring Boot
- A SMTP mail server configured on your machine
Procedure
Add
vertx-spring-boot-starter-http
andvertx-spring-boot-starter-mail
as dependencies in thepom.xml
file of your project.pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a mail handler class for your application:
MailHandler.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the main class of your application:
MailSampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create an
application.properties
file to store your SMTP server credentials:application.properties
vertx.mail.host=YOUR_SMTP_SERVER_HOSTNAME vertx.mail.username=YOUR_SMTP_SERVER_USERNAME vertx.mail.password=YOUR_SMTP_SERVER_PASSWORD
vertx.mail.host=YOUR_SMTP_SERVER_HOSTNAME vertx.mail.username=YOUR_SMTP_SERVER_USERNAME vertx.mail.password=YOUR_SMTP_SERVER_PASSWORD
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Create a
src/main/resources/static/index.html
file that serves as the frontend of your application. Alternatively, use the example HTML email form available for this procedure. OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line.
java -jar target/vertx-spring-boot-sample-mail.jar
$ java -jar target/vertx-spring-boot-sample-mail.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
Navigate to
http://localhost:8080/index.html
using a web browser to access the email form.
Additional resources
- For more information on setting up an SMTP mail server on RHEL 7, see the Mail Transport Agent Configuration section in the RHEL 7 documentation.
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
2.7. Server-sent events Copier lienLien copié sur presse-papiers!
Server-sent events (SSE) is a push technology allowing HTTP sever to send unidirectional updates to the client. SSE works by establishing a connection between the event source and the client. The event source uses this connection to push events to the client-side. After the server pushes the events, the connection remains open and can be used to push subsequent events. When the client terminates the request on the server, the connection is closed. SSE represents a more resource-efficient alternative to polling, where a new connection must be established each time the client polls the event source for updates. As opposed to WebSockets, SSE pushes events in one direction only (that is, from the source to the client). It does not handle bidirectional communication between the event source and the client.
The specification for SSE is incorporated into HTML5, and is widely supported by web browsers, including their legacy versions. SSE can be used from the command line, and is relatively simple to set up compared to other protocols.
SSE is suitable for use cases that require frequent updates from the server to the client, while updates from the client side to the server are expected to be less frequent. Updates form the client side to the server can then be handled over a different protocol, such as REST. Examples of such use cases include social media feed updates or notifications sent to a client when new files are uploaded to a file server.
2.8. Using Server-sent events in a reactive Spring Boot application Copier lienLien copié sur presse-papiers!
Create a simple service that accepts HTTP requests and returns a stream of server-sent events (SSE). When the client establishes a connection to the server and the streaming starts, the connection remains open. The server re-uses the connection to continuously push new events to the client. Canceling the request closes the connection and stops the stream, causing the client to stop receiving updates form the server.
Prerequisites
- JDK 8 or JDK 11 installed
- Maven installed
- A Maven-based application project configured to use Spring Boot
Procedure
Add
vertx-spring-boot-starter-http
as a dependency in thepom.xml
file of your project.pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the main class of your application:
SseExampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a Server-sent Event controller class for your application. In this example, the class generates a stream of random integers and prints them to a terminal application.
SseController.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-sse.jar
$ java -jar target/vertx-spring-boot-sample-sse.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow In a new terminal window, issue a HTTP request to
localhost
. You start receiving a continuous stream of random integers from the server-sent event controller:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Press
Ctrl
+C
to cancel your HTTP request and terminate the stream of responses.
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
2.9. WebSocket Protocol Copier lienLien copié sur presse-papiers!
The WebSocket protocol upgrades a standard HTTP connection to make it persistent and subsequently uses that connection to pass specially formatted messages between the client and server of your application. While the protocol relies on HTTP like handshakes to establish the initial connection between client and server over TCP, it uses a special message format for communication between client and server.
Unlike a standard HTTP connection, a WebSocket connection:
- can be used to send messages in both directions
- remains open after the initial request is completed,
- uses special framing headers in messages, which allows you to send non-HTTP-formatted message payloads (for example control data) inside an HTTP request.
As a result, the WebSockets protocol extends the possibilities of a standard HTTP connection while requiring fewer networking resources and decreasing the risk of services failing due to network timeouts (compared to alternative methods of providing a real time messaging functionality, such as HTTP Long Polling).
WebSockets connections are supported by default on most currently available web browsers across different operating systems and hardware architectures, which makes WebSockets a suitable choice for writing cross-platform web-based applications that you can connect to using only a web browser.
2.10. Using WebSockets in a reactive application based on WebFlux Copier lienLien copié sur presse-papiers!
The following example demonstrates how you can use the WebSocket protocol in an application that provides a backend service that you can connect to using a web browser. When you access the web front end URL of your application using a web browser, the front-end initiates a WebSocket connection to a backend service. You can use the web form available on the website to send values formatted as text strings to the back-end service using the WebSocket connection. The application processes the received value by converting all characters to uppercase and sends the result to the front end using the same WebSocket connection.
Create an application using Spring on Reactive Stack that consists of:
- a back end Java-based service with a WebSocket handler
- a web front end based on HTML and JavaScript.
Prerequisites
- A Maven-based Java application project that uses Spring Boot
- JDK 8 or JDK 11 installed
- Maven installed
Procedure:
Add the
vertx-spring-boot-starter-http
as a dependency in thepom.xml
file of your application project:pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the class file containing the back-end application code:
/src/main/java/webSocketSampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the HTML document that serves as a front end for the application. Note, that in the following example, the
<script>
element contains the JavaScript code that handles the communication with the back end of your application:/src/main/resources/static/index.html
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-websocket.jar
$ java -jar target/vertx-spring-boot-sample-websocket.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Navigate to
http://localhost:8080/index.html
using a web browser. The website shows a web interface that contains- an input text box,
- a list of processed results,
- a Submit button.
- Enter a string value into the text box and select Submit.
- View the resulting value rendered in uppercase in the list below the input text box.
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
2.11. Advanced Message Queuing Protocol Copier lienLien copié sur presse-papiers!
The Advanced Message Queuing Protocol (AMQP) is a communication protocol designed to move messages between applications in a a non-blocking way. Standardized as AMQP 1.0, the protocol provides interoperability and messaging integration between new and legacy applications across different network topologies and environments. AMQP works with multiple broker architectures and provides a range of ways to deliver, receive, queue and route messages. AMQP can also work peer-to-peer when you are not using a broker. In a hybrid cloud environment, you can use AMQP to integrate your services with legacy applications without having to deal with processing a variety of different message formats. AMQP Supports real-time asynchronous message processing capabilities and is therefore suitable for use in reactive applications.
2.12. How the AMQP reactive example works Copier lienLien copié sur presse-papiers!
The messaging integration pattern that this example features is a Publisher-Subscriber pattern that 2 queues and a broker.
- The Request queue stores HTTP requests containing strings that you enter using the Web interface to be processed by the text string processor.
- The Result queue stores responses containing the strings that have been converted to Uppercase and are ready to be displayed.
The components that the application consist of are:
- A front-end service that you can use to submit a text string to the application.
- A back-end service that converts the string to uppercase characters.
- A HTTP controller that is configured and provided by the Spring Boot HTTP Starter
- An embedded Artemis AMQP Broker instance that routes messages between 2 messaging queues:
The request queue passes messages containing text strings from the front end to the text string processor service. When you submit a string for processing:
-
The front end service sends a HTTP
POST
request containing your string as the payload of the request to the HTTP controller. - The request is picked up by the messaging manager that routes the message to the AMQP Broker.
- The broker routes the message to the text string processor service. If the text processor service is unavailable to pick up the request, the broker routes the message to the next available processor instance, if such instance is available. Alternatively, the broker waits before resending the request to the same instance when it becomes available again.
- The text string processor service picks up the message and converts the characters in the string to uppercase. The processor service sends a request with the processed result in uppercase to the AMQP Broker.
- The AMQP broker routes the request with the processed results to the messaging manager.
- The messaging manager stores the request with the processed results in the outgoing queue where it can be accessed by the front end service.
The response queue stores HTTP responses that contain results processed by the string processor service. The front end application polls this queue at regular intervals to retrieve the results. When the processed result is ready to be displayed:
-
The front end service sends a HTTP
GET
request to the HTTP controller provided by the Spring Boot HTTP Starter. - The HTTP controller routes the request to the messaging manager.
-
When a request previously submitted by the front end for processing is ready and available in the outgoing queue, the messaging manager sends the result as a response to the HTTP
GET
request back to the HTTP controller - The HTTP controller routes the response back to the front end service that displays the result.
2.13. Using AMQP in a reactive application Copier lienLien copié sur presse-papiers!
Develop a simple messaging reactive application using the AMQP Client Starter with a Spring Boot HTTP controller. This example application integrates 2 services in a Publisher-Subscriber messaging integration pattern that uses 2 messaging queues and a broker.
This example shows how you can create a basic application with Spring Boot and Eclipse Vert.x on Reactor Netty that consists of 2 services integrated using AMQP messaging. The application consist of the following components:
- A front-end service that you can use to submit text strings to the application
- A back-end service that converts strings to uppercase characters
- An Artemis AMQP broker that routes massages between the services and manages the request queue and response queue.
- A HTTP controller provided by the Spring Boot HTTP Starter
Prerequisites
- A Maven-based Java application project configured to use Spring Boot
- JDK 8 or JDK 11 installed
- Maven installed
Procedure
Add the following dependencies to the
pom.xml
file of your application project:pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the main class file of the example application. This class contains methods that define the respective processing queues for requests and results:
/src/main/java/AmqpExampleApplication.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the class file containing the code for the HTTP REST controller that manages the request queue and the response queue by exposing REST endpoints that handle your GET and POST requests:
/src/main/java/Controller.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the class file containing the messaging manager. The manager controls how applications components publish requests to the request queue and subsequently subscribe to the response queue to obtain processed results:
/src/main/java/MessagesManager.java:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the class file containing the uppercase processor that receives text strings from the request queue and converts them to uppercase characters. The processor subsequently publishes the results to the response queue:
/src/main/java/UppercaseProcessor.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd myApp
$ cd myApp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-amqp.jar
$ java -jar target/vertx-spring-boot-sample-amqp.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow In a new terminal window, send a number of HTTP
POST
request that contain text strings to be processed tolocalhost
curl -H "Content-Type: text/plain" -d 'Hello, World' -X POST http://localhost:8080 curl -H "Content-Type: text/plain" -d 'Hello again' -X POST http://localhost:8080
$ curl -H "Content-Type: text/plain" -d 'Hello, World' -X POST http://localhost:8080 $ curl -H "Content-Type: text/plain" -d 'Hello again' -X POST http://localhost:8080
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Send an HTTP
GET
request tolocalhost
. You receive a HTTP response with the strings in uppercase.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.
2.14. Apache Kafka Copier lienLien copié sur presse-papiers!
Apache Kafka is a scalable messaging integration system that is designed to exchange messages between processes, applications, and services. Kafka is based on clusters with one or more brokers that maintain a set of topics. Essentially, topics are categories that can be defined for every cluster using topic IDs. Each topic contains pieces of data called records that contain information about the events taking place in your application. Applications connected to the system can add records to these topics, or process and reprocess messages added earlier.
The broker is responsible for handling the communication with client applications and for managing the records in the topic. To ensure that no records are lost, the broker tracks all records in a commit log and keeps track of an offset value for each application. The offset is similar to a pointer that indicates the most recently added record.
Applications can pull the latest records from the topic, or they can change the offset to read records that have been added earlier earlier message. This functionality prevents client applications from becoming overwhelmed with incoming requests in case they can not process them in real time. When this happens, Kafka prevents loss of data by storing records that cannot be processed in real time in the commit log. when the client application is able to catch up with the incoming requests, it resumes processing records in real time
A broker can manage records in multiple topics by sorting them into topic partitions. Apache Kafka replicates these partitions to allow records form a single topic to be handled by multiple brokers in parallel, allowing you to scale the rate at which your applications process records in a topic. The replicated topic partitions (also called followers) are synchronized with the original topic partition (also called a Leader) to avoid redundancy in processing records. New records are committed to the Leader partition, Followers only replicate the changes made to the leader.
2.15. How the Apache Kafka reactive example works Copier lienLien copié sur presse-papiers!
This example application is based on a Publisher-Subscriber message streaming pattern implemented using an Apache Kafka. The components that the application consist of are:
-
The
KafkaExampleApplication
class that instantiates the log message producer and consumer - A WebFlux HTTP controller that is configured and provided by the Spring Boot HTTP Starter. The controller provides rest resources used to publish and read messages.
-
A
KafkaLogger
class that defines how the producer publishes messages to thelog
topic on Kafka. -
A
KafkaLog
class that displays messages that the example application receives from thelog
topic on Kafka.
Publishing messages:
- You make an HTTP POST request to the example application with the log message as the payload.
- The HTTP controller routes the message to the REST endpoint used for publishing messages, and passes the message to the logger instance.
-
The HTTP controller publishes the received message to the
log
topic on Kafka. - KafkaLog instance receives the log message from a Kafka topic.
Reading messages:
-
You send a HTTP
GET
request to the example application URL. -
The controller gets the messages from the
KafkaLog
instance and returns them as the body of the HTTP response.
2.16. Using Kafka in a reactive application Copier lienLien copié sur presse-papiers!
This example shows how you can create an example messaging application that uses Apache Kafka with Spring Boot and Eclipse Vert.x on Reactor Netty. The application publishes messages to a Kafka topic and then retrieves them and displays them when you send a request.
The Kafka configuration properties for message topics, URLs, and metadata used by the the Kafka cluster are stored in src/main/resources/application.yml
.
Prerequisites
- A Maven-based Java application project configured to use Spring Boot
- JDK 8 or JDK 11 installed
- Maven installed
Procedure
Add the WebFlux HTTP Starter and the Apache Kafka Starter as dependencies in the
pom.xml
file of your application project:pom.xml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Create the
KafkaLogger
class. This class functions s a producer and sendas messages TheKafkaLogger
class defines how the Producer publishes messages (also called records) to the topic:/src/main/java/KafkaLogger.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crate
KafkaLog
class. This class functions as the consumer of kafka messages.KafkaLog
retrieves messages from the topic an displays them in your terminal:/src/main/java/KafkaLog.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the class file that contains the the HTTP REST controller. The controller that exposes REST resources that your application uses to handle the logging and reading of messages.
/src/main/java/Controller.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Crate the YAML template that contains the URLs that producers and consumers in your Apache Kafka Cluster use to log and read messages. In this example, the consumer and producer on your Apache Kafka Cluster communicate using port
9092
onlocalhost
by default. Note, that you must configure the producers and consumers separately, as the following example shows:/src/main/resources/application.yml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow OPTIONAL: Run and test your application locally:
Navigate to the root directory of your Maven project:
cd vertx-spring-boot-sample-kafka
$ cd vertx-spring-boot-sample-kafka
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Package your application:
mvn clean package
$ mvn clean package
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start your application from the command line:
java -jar target/vertx-spring-boot-sample-kafka.jar
$ java -jar target/vertx-spring-boot-sample-kafka.jar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow In a new terminal window, send a number of HTTP
POST
request that contain messages formatted as text strings tolocalhost
. The messages are all published to thelog
topic.curl -H "Content-Type: text/plain" -d 'Hello, World' -X POST http://localhost:8080 curl -H "Content-Type: text/plain" -d 'Hello again' -X POST http://localhost:8080
$ curl -H "Content-Type: text/plain" -d 'Hello, World' -X POST http://localhost:8080 $ curl -H "Content-Type: text/plain" -d 'Hello again' -X POST http://localhost:8080 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Send an HTTP
GET
request tolocalhost
. You receive a HTTP response that contains all the messages in the topic that your consumers subscribe to.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Additional resources
- You can deploy your application to an OpenShift cluster using Fabric8 Maven Plugin.
- You can also configure your application for deployment on stand-alone Red Hat Enterprise Linux.