The Todo List application is the hello world application for the Eventuate™ Platform. It illustrates how you can use the platform to write an application with a microservices architecture that uses Event Sourcing and Command Query Responsibility Segregation (CQRS). The Todo List application lets users maintain a todo list.
The Todo List application is a Java and Spring Boot application built using Eventuate™'s Event Sourcing based programming model.
Todos are implemented by an Event Sourcing-based TodoAggregate
.
The aggregate's events are persisted in the Eventuate event store.
The application also maintains a materialized view of the data in MySQL.
Don't forget to take a look at the other Eventuate example applications.
Don't hesitate to create an issue or see
The Todo application has a microservice architecture. It is written using the Eventuate Client Framework for Java, which provides an event sourcing based programming model. The following diagram shows the Todo List application architecture:
The application consists of the following:
- Todo service - a Java and Spring Boot-based service that has a HATEOAS-style REST API for creating, updating and querying todo list items. It uses Eventuate to persist aggregates using event sourcing.
- Todo view service - a Java and Spring Boot-based service that provides a REST API for querying todos. It implements a Command Query Responsibility Segregation (CQRS) view of todos using MySQL. MySQL is kept up to date by subscribing to events produced by the Todo service.
- MySQL database - stores the CQRS view of todo list items.
Note: for simplicity, the Todo list application can be deployed as a monolithic application.
There are two versions of the source code:
single-module
- a single module Gradle project for a monolithic version of the application. It is the easiest to get started with.multi-module
- a multi-module Gradle project for the microservices-based version of the application.
Note: you do not need to install Gradle since it will be downloaded automatically. You just need to have Java 8 installed.
The steps for building both versions of the application are identical.
First, build the application
./gradlew assemble -P eventuateDriver=local
Next, launch the services using Docker Compose:
export DOCKER_HOST_IP=...
./gradlew <database-mode>ComposeBuild
./gradlew <database-mode>ComposeUp
Where database-mode
is one of:
mysqlbinlog
- use MySQL with Binlog-based event publishingpostgreswal
- use Postgres with Postgres WAL-based event publishingpostgrespolling
- use Postgres with generic JDBC polling-based event publishing
Note: You need to set DOCKER_HOST_IP
before running Docker Compose.
This must be an IP address or resolvable hostname.
It cannot be localhost
.
See this guide to setting DOCKER_HOST_IP
for more information.
Once the application has started, you can use the application via the Swagger UI.
If you are running the multi-module
version:
http://${DOCKER_HOST_IP}:8081/swagger-ui.html
- the command-side servicehttp://${DOCKER_HOST_IP}:8082/swagger-ui.html
- the query-side service
If you are running the single-module
version:
http://${DOCKER_HOST_IP}:8080/swagger-ui.html
- the monolithic application
You can also use the Eventuate Local console to view aggregates and watch the stream of events.
Visit the URL http://${DOCKER_HOST_IP}:8085
Don't hesitate to create an issue or see