/sample-spring-kafka-microservices

Example microservices showing how to use Kafka and Kafka Streams with Spring Boot on the example of distributed transactions implementations with the SAGA pattern

Primary LanguageJavaGNU General Public License v3.0GPL-3.0

Microservices with Spring Boot and Kafka Demo Project Twitter

CircleCI

SonarCloud Bugs Coverage Lines of Code

Articles

This repository is used as the example for the following articles:

  1. Distributed Transactions in Microservices with Kafka Streams and Spring Boot - how to implement distributed transaction based on the SAGA pattern with Spring Boot and Kafka Streams
  2. Deep Dive into Saga Transactions with Kafka Streams and Spring Boot - how to implement distributed transaction based on the SAGA pattern with Spring Boot and fully Kafka Streams KStream and KTable. You need to switch to the streams-full branch.

Description

There are three microservices:
order-service - it sends Order events to the Kafka topic and orchestrates the process of a distributed transaction
payment-service - it performs local transaction on the customer account basing on the Order price
stock-service - it performs local transaction on the store basing on number of products in the Order

Here's the diagram with our architecture:

image

(1) order-service send a new Order -> status == NEW
(2) payment-service and stock-service receive Order and handle it by performing a local transaction on the data
(3) payment-service and stock-service send a reponse Order -> status == ACCEPT or status == REJECT
(4) order-service process incoming stream of orders from payment-service and stock-service, join them by Order id and sends Order with a new status -> status == CONFIRMATION or status == ROLLBACK or status == REJECTED
(5) payment-service and stock-service receive Order with a final status and "commit" or "rollback" a local transaction make before

Running on Docker locally

You can easily run all the apps on Docker with Spring Boot support for (a) Testcontainers (b) Docker Compose

(a) For Testcontainers Go to the order-service directory and execute:

$ mvn clean spring-boot:test-run

Then go to the payment-service directory and execute:

$ mvn clean spring-boot:test-run

Finally go to the stock-service directory and execute:

$ mvn clean spring-boot:test-run

You will have three apps running with a single shared Kafka running on Testcontainers.

(b) For Docker Compose First build the whole project and images with the following command:

$ mvn clean package -DskipTests -Pbuild-image

Then, you can go to the one of available directories: order-service, payment-service or stock-service and execute:

$ mvn spring-boot:run

You start your app and have Kafka and two other containers started with Docker Compose.