Scalable, event-driven coffee shop
How to use event sourcing in several services with an event-driven architecture, Apache Kafka and Java EE.
Run
- Start Apache Kafka brokers, e.g. using Docker compose: wurstmeister/kafka-docker.
Configure theKAFKA_ADVERTISED_HOST_NAMEto your corresponding IP address. - Configure each of the 
kafka.propertiesfiles withbootstrap.servers=<your-IP>:9092. - Build and run the individual instances.
On each of theorders/,beans/andbarista/directories, executebuild-run-local.sh.
This builds the Gradle project, builds the Docker image and starts a new instance of the given service. 
Usage
The following will demonstrate the usage of the HTTP endpoints and example responses.
- In order to create coffee orders you have to add beans to the beans storage first:
 
$> curl http://localhost:8002/beans/resources/beans -i -XPOST \
  -H 'content-type: application/json' \
  -d '{"beanOrigin": "Colombia", "amount": 10}'
HTTP/1.1 204 No Content
X-Powered-By: Undertow/1
Server: WildFly/10
Date: Fri, 17 Nov 2017 20:49:26 GMT
- Check the creation of the beans:
 
$> curl http://localhost:8002/beans/resources/beans
{"Colombia":10}
- Create a new coffee order:
 
$> curl http://localhost:8001/orders/resources/orders/ -i -XPOST \
  -H 'Content-type: application/json' \
  -d '{"beanOrigin": "Colombia", "coffeeType": "Espresso"}'
HTTP/1.1 202 Accepted
Connection: keep-alive
X-Powered-By: Undertow/1
Server: WildFly/10
Location: http://localhost:8001/orders/resources/orders/c099c158-b748-4115-bed3-7b5dfff70771
Content-Length: 0
Date: Fri, 17 Nov 2017 20:51:16 GMT
- Check the creation of the coffee order using your 
Locationheader, for example: 
$> curl http://localhost:8001/orders/resources/orders/c099c158-b748-4115-bed3-7b5dfff70771
{"status":"started","type":"espresso","beanOrigin":"Colombia"}