На данный момент на рынке мало Event sourcing + CQRS фреймворков. А то что есть непопулярны и имеют слабую поддержку. Поэтому многие создают свои in-house решения. Данный проект может служить примером при создании собственного решения.
- Java >= 17
- Apache maven
- Mongodb
- Kafka
prostore-core- ядро, основные абстракцииprostore-eureka- имплементация CommandBus на основе Spring Cloud Eurekaprostore-mongo- имплементация EventStore на Mongodbprostore-kafka- имплементация EventBus на основе Apache Kafkaprostore-test-common- общая библиотека для тестовых проектовprostore-test-service- тестовый проект "сервис"prostore-test-client- тестовый проект "клиент"spring-boot-prostore-starter- основной стартерspring-boot-prostore-eureka-starter- стартер для eurekaspring-boot-prostore-mongo-starter- стартер для mongospring-boot-prostore-kafka-starter- стартер для kafkaprostore-eureka-server- eureka server
При создании собственного решения Event sourcing важно уделить внимание на гибкость. Не стоит внедрять жесткие зависимости. Возможно для каких-то случаев вам понадобится заменить базу, например на SQL. В данном проекте был выбран Mongodb, как наиболее оптимальный для хранения event-ов. Другие возможные варианты:
- Apache Cassandra
- Redis
- PostgreSQL/MySQL
Не советую выбирать Apache Kafka в качестве имплементации EventStore.
- Запустите локально mongodb
- Запустите локально kafka
mvn clean installmvn spring-boot:run -f prostore-eureka-serverPORT=9000 mvn spring-boot:run -f prostore-test-clientPORT=9001 mvn spring-boot:run -f prostore-test-servicePORT=9002 mvn spring-boot:run -f prostore-test-service
Отправьте тестовые запросы на prostore-test-client:
- Создание shipment (в ответ получите aggregateId)
curl -v -H "Content-Type: application/json" \ -d '{"destination":"Moscow", "location": "Almaty"}' \ http://localhost:9000/shipment - Получение shipment (вместо AGGREGATE_ID вставьте aggregateId полученный командой создания)
curl -v -X GET -H "Content-Type: application/json" \ -d '{"aggregateId": "AGGREGATE_ID"}' \ http://localhost:9000/shipment - Изменение shipment (вместо AGGREGATE_ID вставьте aggregateId полученный командой создания)
curl -v -H "Content-Type: application/json" \ -d '{"aggregateId":"AGGREGATE_ID", "location": "Sydney"}' \ http://localhost:9000/shipment/move - Если запущены несколько инстансов
prostore-test-service, запросы будут балансироваться по round-robin - Попробуйте перезапустить сервисы. При старте сервиса будет запущен replay event-ов для восстановления аггрегатов
Все event-ы хранятся в коллекции MongoEvent (база test по умолчанию)