Я узнал о Event Sourcing and CQRS
и нашел хороший сериал на Youtube. Серия имеет хранилище кодов, указанное в Github . Он использует 3 модуля (barista
, orders
и beans
), которые общаются друг с другом в распределенном режиме для управления заказами на кофе от клиентов. Инструкция по запуску предоставляется следующим образом:
Запустите брокеров Apache Kafka, например, используя Docker compose: https://github.com/wurstmeister/kafka-docker.
Настройте KAFKA_ADVERTISED_HOST_NAME
для вашего соответствующего IP
адрес.
Сконфигурируйте каждый из файлов kafka.properties
с bootstrap.servers=<your-IP>:9092
.
Сборка и запуск отдельных экземпляров. В каждом из каталогов orders/
, beans/
и barista/
выполните build-run-local.sh
.
Это создает проект Gradle, создает образ Docker и запускает
новый экземпляр данной услуги.
Я выполняю шаги без проблем. После создания и запуска отдельных экземпляров я выполняю команду
$ curl http://localhost:8002/beans/resources/beans -i
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/json
Content-Length: 2
Date: Tue, 08 Jan 2019 13:16:12 GMT
Затем я попытался POST-компонент с помощью команды,
$ curl http://localhost:8002/beans/resources/beans -i -XPOST \
-H 'content-type: application/json' \
-d '{"beanOrigin": "Colombia", "amount": 10}'
В этот момент терминал зависает и не дает ответа. Я смотрю на отдельные модули и вижу Dockerfile
и build-run-local.sh
с инструкциями по выполнению. Например, Dockerfile
для модуля beans
приведено ниже,
$ cat Dockerfile
FROM sdaschner/wildfly:javaee8-kafka-b1
COPY build/libs/beans.war $DEPLOYMENT_DIR
Предоставляется beans/build-run-local.sh
,
$ cat build-run-local.sh
#!/bin/bash
cd ${0%/*}
set -eu
gradle build
docker build --rm -t scalable-coffee-shop-beans:1 .
docker run --rm --name beans -p 8002:8080 scalable-coffee-shop-beans:1
Когда я запускаю файл, я получаю вывод (начальный lnes),
$ ./build-run-local.sh
BUILD SUCCESSFUL in 0s
5 actionable tasks: 5 up-to-date
Sending build context to Docker daemon 310.3kB
Step 1/2 : FROM sdaschner/wildfly:javaee8-kafka-b1
---> 7a638cd4a3c8
Step 2/2 : COPY build/libs/beans.war $DEPLOYMENT_DIR
---> Using cache
---> ef4901bbea66
Successfully built ef4901bbea66
Successfully tagged scalable-coffee-shop-beans:1
=========================================================================
JBoss Bootstrap Environment
JBOSS_HOME: /opt/jboss/wildfly
JAVA: /usr/lib/jvm/java/bin/java
JAVA_OPTS: -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true
Мое подозрение - зависание команды POST, потому что мне может понадобиться больше конфигураций, которые мне не хватает. Например, я не настроил ни один из $DEPLOYMENT_DIR
, JBOSS_HOME
или JAVA_OPTS
, упомянутых ранее.
Признаюсь, у меня ограниченный (или очень небольшой) опыт работы с Docker
. Но я считаю, что эта команда выполняет информацию из файла Docker
,
# get 2 instructions from the `Dockerfile` and excutes them.
$ docker build --rm -t scalable-coffee-shop-beans:1 .
Sending build context to Docker daemon 310.3kB
Step 1/2 : FROM sdaschner/wildfly:javaee8-kafka-b1
---> 7a638cd4a3c8
Step 2/2 : COPY build/libs/beans.war $DEPLOYMENT_DIR
---> Using cache
---> ef4901bbea66
Successfully built ef4901bbea66
Successfully tagged scalable-coffee-shop-beans:1
Может кто-нибудь помочь мне правильно запустить приложение?
Обновление:
Я последовал совету из комментария и выложил сообщения журнала. Что я получаю:
03:26:12,271 INFO [com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeansResource] (default task-1) Bean origin = Colombia , Amount = 10
03:26:12,273 INFO [com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeanCommandService] (default task-1) Bean origin = Colombia , Amount = 1
Похоже, что com.sebastian_daschner.scalable_coffee_shop.beans.boundary.BeanCommandService
правильно получил информацию и вызвал метод класса com.sebastian_daschner.scalable_coffee_shop.events.control.EventProducer
следующим образом,
public void storeBeans(final String beanOrigin, final int amount) {
LOGGER.log(Level.INFO, "Bean origin = " + beanOrigin +
" " + ", Amount = " + amount);
eventProducer.publish(new BeansStored(beanOrigin, amount));
}
Внутри EventProducer
он вызывает метод publish
, который представлен ниже,
public void publish(CoffeeEvent... events) {
try {
LOGGER.log(Level.INFO, "Events = " + Arrays.toString(events));
producer.beginTransaction();
send(events);
producer.commitTransaction();
} catch (ProducerFencedException e) {
LOGGER.log(Level.SEVERE, e.toString(), e);
producer.close();
} catch (KafkaException e) {
LOGGER.log(Level.SEVERE, e.toString(), e);
producer.abortTransaction();
}
}
На данный момент я не получаю никаких журналов из кода,
LOGGER.log(Level.INFO, "Events = " + Arrays.toString(events));
Я предполагаю, что это связано с Kafka, и приведенный ниже код не выполняется:
producer.beginTransaction();
send(events);
producer.commitTransaction();
Как я уже сказал, кто-нибудь может помочь теперь выяснить, в чем дело?