From 6d8376cfd50d706af5b4219f20b70bad1c13f8c0 Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Tue, 31 May 2016 15:08:34 -0700 Subject: [PATCH 1/8] Use specific Java 8 Docker image --- java-spring/docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java-spring/docker-compose.yml b/java-spring/docker-compose.yml index 0b1e916..b7199a5 100644 --- a/java-spring/docker-compose.yml +++ b/java-spring/docker-compose.yml @@ -1,5 +1,5 @@ accountscommandside: - image: java:8 + image: java:openjdk-8u91-jdk working_dir: /app volumes: - ./accounts-command-side-service/build/libs:/app @@ -11,7 +11,7 @@ accountscommandside: EVENTUATE_API_KEY_SECRET: transactionscommandside: - image: java:8 + image: java:openjdk-8u91-jdk working_dir: /app volumes: - ./transactions-command-side-service/build/libs:/app @@ -24,11 +24,11 @@ transactionscommandside: accountsqueryside: - image: java:8 + image: java:openjdk-8u91-jdk working_dir: /app volumes: - ./accounts-query-side-service/build/libs:/app - command: java -jar /app/accounts-query-side-service.jar + command: java -jar /app/accounts-query-side-service.jar ports: - "8081:8080" links: From 3117f1240294af0f9f0b16138c36b0a4c04cb5f6 Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Mon, 6 Jun 2016 20:48:58 -0700 Subject: [PATCH 2/8] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index de3fd0a..e6e693f 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ First, you need to tell the query side code how to connect to MongoDB: [Docker Compose](https://docs.docker.com/compose/) is a great way to run MongoDB. You can run the `docker-compose up -d mongodb` to run MongoDB. -Second, some of the tests in accounts-command-side-service, transactions-command-side-service, accounts-query-side-service and e2e-test need you need to set some environment variables that tell them how to connect to the Event Store server. +Second, some of the tests in accounts-command-side-service, transactions-command-side-service, accounts-query-side-service and e2e-test require you to set some environment variables that tell them how to connect to the Event Store server. But don't worry. The build is configured to ignore failures for those projects. From b573027fc2b07090cf022d3af882d0e88832202d Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Fri, 10 Jun 2016 16:43:14 -0700 Subject: [PATCH 3/8] Added Swagger to monolithic deployment, Added mongodb-cli.sh --- README.md | 14 +++++++++++++- java-spring/mongodb-cli.sh | 3 +-- java-spring/monolithic-service/build.gradle | 1 + .../banking/web/BankingWebConfiguration.java | 4 +++- java-spring/show-urls.sh | 7 +++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100755 java-spring/show-urls.sh diff --git a/README.md b/README.md index de3fd0a..6cfa2c2 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,10 @@ First, you need to tell the query side code how to connect to MongoDB: ``` [Docker Compose](https://docs.docker.com/compose/) is a great way to run MongoDB. -You can run the `docker-compose up -d mongodb` to run MongoDB. +You can run the `docker-compose up -d mongodb` to run MongoDB and then set `SPRING_DATA_MONGODB_URI` as follows: +``` + export SPRING_DATA_MONGODB_URI=mongodb://$(docker-machine ip default)/yourdb +``` Second, some of the tests in accounts-command-side-service, transactions-command-side-service, accounts-query-side-service and e2e-test need you need to set some environment variables that tell them how to connect to the Event Store server. But don't worry. @@ -117,6 +120,15 @@ Simply use this command: java -jar monolithic-service/build/libs/monolithic-service.jar ``` +This will start the service running on port 8080 (you can change using the --server.port=9999 option). + +Once the service has started you can open the Swagger UI: http://localhost:8080/swagger-ui.html. +You can then: + +1. Create two accounts (save the account ids) +2. Create a money transfer +3. View the updated account balances + ## Running the microservices The other option is to run the services separately. diff --git a/java-spring/mongodb-cli.sh b/java-spring/mongodb-cli.sh index a99d99b..d2955c0 100755 --- a/java-spring/mongodb-cli.sh +++ b/java-spring/mongodb-cli.sh @@ -1,4 +1,3 @@ #! /bin/bash -docker run --link javaspring_mongodb_1:mongodb -i -t mongo:3.0.4 /usr/bin/mongo --host mongodb - +docker run --rm --link javaspring_mongodb_1:mongodb -i -t mongo:3.0.4 /usr/bin/mongo --host mongodb diff --git a/java-spring/monolithic-service/build.gradle b/java-spring/monolithic-service/build.gradle index 71d9f26..27ba39e 100644 --- a/java-spring/monolithic-service/build.gradle +++ b/java-spring/monolithic-service/build.gradle @@ -11,6 +11,7 @@ dependencies { compile "org.springframework.boot:spring-boot-starter-actuator" compile "net.chrisrichardson.eventstore.client:eventstore-jdbc_2.10:$eventStoreClientVersion" + compile project(":common-swagger") testCompile project(":testutil") testCompile "org.springframework.boot:spring-boot-starter-test" diff --git a/java-spring/monolithic-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/BankingWebConfiguration.java b/java-spring/monolithic-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/BankingWebConfiguration.java index a3e2253..656b2fe 100644 --- a/java-spring/monolithic-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/BankingWebConfiguration.java +++ b/java-spring/monolithic-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/BankingWebConfiguration.java @@ -1,5 +1,6 @@ package net.chrisrichardson.eventstore.javaexamples.banking.web; +import net.chrisrichardson.eventstore.javaexamples.banking.commonswagger.CommonSwaggerConfiguration; import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.accounts.CommandSideWebAccountsConfiguration; import net.chrisrichardson.eventstore.javaexamples.banking.web.commandside.transactions.CommandSideWebTransactionsConfiguration; import net.chrisrichardson.eventstore.javaexamples.banking.web.queryside.QuerySideWebConfiguration; @@ -14,7 +15,8 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; @Configuration -@Import({CommandSideWebAccountsConfiguration.class, CommandSideWebTransactionsConfiguration.class, JdbcEventStoreConfiguration.class, QuerySideWebConfiguration.class}) +@Import({CommandSideWebAccountsConfiguration.class, CommandSideWebTransactionsConfiguration.class, JdbcEventStoreConfiguration.class, + QuerySideWebConfiguration.class, CommonSwaggerConfiguration.class}) @EnableAutoConfiguration @ComponentScan public class BankingWebConfiguration { diff --git a/java-spring/show-urls.sh b/java-spring/show-urls.sh new file mode 100755 index 0000000..1b6aacf --- /dev/null +++ b/java-spring/show-urls.sh @@ -0,0 +1,7 @@ +#!/bin/bash -e + +IP=$(docker-machine ip default) + +echo Accounts command-side service = http://${IP}:8080/swagger-ui.html +echo Money Transfers command-side service = http://${IP}:8082/swagger-ui.html +echo Accounts query-side service = http://${IP}:8081/swagger-ui.html From e488df3d064e3ebc08ce9dfa965cb9ff93a411a4 Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Fri, 10 Jun 2016 16:45:02 -0700 Subject: [PATCH 4/8] Fixed typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6d38f43..57649cf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ #Event-Sourcing+CQRS example application This example application is the money transfer application described in my talk [Building and deploying microservices with event sourcing, CQRS and Docker](http://plainoldobjects.com/presentations/building-and-deploying-microservices-with-event-sourcing-cqrs-and-docker/). -This talk describe a way of architecting highly scalable and available applications that is based on microservices, polyglot persistence, +This talk describes a way of architecting highly scalable and available applications that is based on microservices, polyglot persistence, event sourcing (ES) and command query responsibility segregation (CQRS). Applications consist of loosely coupled components that communicate using events. These components can be deployed either as separate services or packaged as a monolithic application for simplified development and testing. From d0bdd514069987c1b92c5dfdb83722861ea457cd Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Thu, 25 Aug 2016 12:15:54 -0700 Subject: [PATCH 5/8] Fixed typo --- java-spring/README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/java-spring/README.md b/java-spring/README.md index 7434865..7909f32 100644 --- a/java-spring/README.md +++ b/java-spring/README.md @@ -7,19 +7,19 @@ This application consists of three microservices: * Account Service - the command side business logic for Accounts * Money Transfer Service - the command side business logic for Money Transfers * Query service - query side implementation of a MongoDB-based, denormalized view of Accounts and MoneyTransfers - + The Account Service consists of the following modules: * accounts-command-side-backend - the Account aggregate * accounts-command-side-web - a REST API for creating and retrieving Accounts * accounts-command-side-service - a standalone microservice - + The Money Transfer Service consists of the following modules: * transactions-command-side-backend - the MoneyTransfer aggregate * transactions-command-side-web - a REST API for creating and retrieving Money Transfers * transactions-command-side-service - a standalone microservice - + The Query Service consists the following modules: * accounts-query-side-backend - MongoDB-based, denormalized view of Accounts and MoneyTransfers @@ -28,10 +28,8 @@ The Query Service consists the following modules: # Deploying the application -These services can be deployed either as either separate standalone services using the Event Store server, or they can be deployed as a monolithic application for simpified integration testing. +These services can be deployed either as either separate standalone services using the Event Store server, or they can be deployed as a monolithic application for simplified integration testing. The three services can also be packaged as a single monolithic web application in order to be used with the embedded Event Store: * monolithic-service - all-in-one, monolithic packaging of the application - - From 7c47d590dfff8bda19d6085b6a107ac365707a32 Mon Sep 17 00:00:00 2001 From: dartpopikyardo Date: Wed, 7 Sep 2016 19:50:17 +0300 Subject: [PATCH 6/8] private-event-sourcing-examples-26 solved comments on previous commit: - changed getting Content-Type header for GatewayController - updated transaction state change logic - renamed "date" field in AccountInfo --- .../queryside/accounts/AccountInfo.java | 12 ++++--- .../accounts/AccountInfoUpdateService.java | 14 +++++--- .../accounts/AccountQueryWorkflow.java | 35 +++++++++++++++---- .../controller/GatewayController.java | 6 ++-- 4 files changed, 47 insertions(+), 20 deletions(-) diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java index cd134f1..8574f66 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfo.java @@ -1,5 +1,6 @@ package net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts; +import com.fasterxml.jackson.annotation.JsonProperty; import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountChangeInfo; import net.chrisrichardson.eventstore.javaexamples.banking.common.accounts.AccountTransactionInfo; import net.chrisrichardson.eventstore.javaexamples.banking.common.transactions.TransferState; @@ -19,7 +20,8 @@ public class AccountInfo { private List changes; private Map transactions; private String version; - private Date date; + @JsonProperty("date") + private Date creationDate; private AccountInfo() { } @@ -28,7 +30,7 @@ public class AccountInfo { this(id, customerId, title, description, balance, changes, transactions, version, new Date()); } - public AccountInfo(String id, String customerId, String title, String description, long balance, List changes, Map transactions, String version, Date date) { + public AccountInfo(String id, String customerId, String title, String description, long balance, List changes, Map transactions, String version, Date creationDate) { this.id = id; this.customerId = customerId; @@ -38,7 +40,7 @@ public class AccountInfo { this.changes = changes; this.transactions = transactions; this.version = version; - this.date = date; + this.creationDate = creationDate; } public String getId() { @@ -73,7 +75,7 @@ public class AccountInfo { return version; } - public Date getDate() { - return date; + public Date getCreationDate() { + return creationDate; } } diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java index 9fe105d..71751f3 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountInfoUpdateService.java @@ -40,7 +40,7 @@ public class AccountInfoUpdateService { .set("description", description) .set("balance", toIntegerRepr(initialBalance)) .push("changes", ci) - .set("date", new Date()) + .set("date", getFromEventId(version)) .set("version", version), AccountInfo.class); logger.info("Saved in mongo"); @@ -55,12 +55,10 @@ public class AccountInfoUpdateService { public void addTransaction(String accountId, AccountTransactionInfo ti) { - System.out.println("Start addTransaction for: "+ti.toString()); mongoTemplate.upsert(new Query(where("id").is(accountId)), new Update(). set("transactions." + ti.getTransactionId(), ti), AccountInfo.class); - System.out.println("End addTransaction for: "+ti.toString()); } @@ -74,11 +72,17 @@ public class AccountInfoUpdateService { } public void updateTransactionStatus(String accountId, String transactionId, TransferState status) { - System.out.println("Start updateTransactionStatus "+accountId +" "+transactionId+" "+status); mongoTemplate.upsert(new Query(where("id").is(accountId)), new Update(). set("transactions." + transactionId + ".status", status), AccountInfo.class); - System.out.println("End updateTransactionStatus "+accountId +" "+transactionId+" "+status); + } + + private Date getFromEventId(String eventId) { + String[] s = eventId.split("-"); + if (s.length != 2) { + return new Date(); + } + return new Date(Long.parseUnsignedLong(s[0], 16)); } } diff --git a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java index a8f0780..e94be56 100644 --- a/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java +++ b/java-spring/accounts-query-side-backend/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/backend/queryside/accounts/AccountQueryWorkflow.java @@ -15,6 +15,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; +import java.util.Date; import static net.chrisrichardson.eventstore.javaexamples.banking.backend.queryside.accounts.MoneyUtil.toIntegerRepr; @@ -40,6 +41,7 @@ public class AccountQueryWorkflow { String customerId = event.getCustomerId(); String title = event.getTitle(); String description = event.getDescription(); + accountInfoUpdateService.create(id, customerId, title, initialBalance, description, eventId); } @@ -68,7 +70,6 @@ public class AccountQueryWorkflow { String accountId = de.getEntityId(); String transactionId = de.getEvent().getTransactionId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.DEBITED); saveChange(de, -1); } @@ -77,16 +78,37 @@ public class AccountQueryWorkflow { String accountId = de.getEntityId(); String transactionId = de.getEvent().getTransactionId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.COMPLETED); saveChange(de, +1); } @EventHandlerMethod - public void recordFailed(DispatchedEvent de) { - String accountId = de.getEntityId(); - String transactionId = de.getEvent().getTransactionId(); + public void updateDebitTransactionState(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); - accountInfoUpdateService.updateTransactionStatus(accountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.DEBITED); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.DEBITED); + } + + @EventHandlerMethod + public void updateCreditTransactionState(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); + + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.COMPLETED); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.COMPLETED); + } + + @EventHandlerMethod + public void recordFailed(DispatchedEvent de) { + String transactionId = de.getEntityId(); + String fromAccountId = de.getEvent().getDetails().getFromAccountId(); + String toAccountId = de.getEvent().getDetails().getToAccountId(); + + accountInfoUpdateService.updateTransactionStatus(fromAccountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); + accountInfoUpdateService.updateTransactionStatus(toAccountId, transactionId, TransferState.FAILED_DUE_TO_INSUFFICIENT_FUNDS); } public void saveChange(DispatchedEvent de, int delta) { @@ -101,5 +123,4 @@ public class AccountQueryWorkflow { accountInfoUpdateService.updateBalance(accountId, changeId, balanceDelta, ci); } - } diff --git a/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java b/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java index 347ba21..291a733 100755 --- a/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java +++ b/java-spring/api-gateway-service/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/apigateway/controller/GatewayController.java @@ -64,12 +64,12 @@ public class GatewayController { logger.info("request: {}", proxiedRequest); HttpResponse proxiedResponse = httpClient.execute(proxiedRequest); logger.info("Response {}", proxiedResponse.getStatusLine().getStatusCode()); - return new ResponseEntity<>(read(proxiedResponse.getEntity().getContent()), processHeaders(proxiedResponse.getAllHeaders()), HttpStatus.valueOf(proxiedResponse.getStatusLine().getStatusCode())); + return new ResponseEntity<>(read(proxiedResponse.getEntity().getContent()), processHeaders(proxiedResponse.getFirstHeader("Content-Type")), HttpStatus.valueOf(proxiedResponse.getStatusLine().getStatusCode())); } - private HttpHeaders processHeaders(Header[] headers) { + private HttpHeaders processHeaders(Header h) { HttpHeaders result = new HttpHeaders(); - Stream.of(headers).filter(h -> h.getName().equalsIgnoreCase("Content-Type")).forEach( h -> result.set(h.getName(), h.getValue())); + result.set(h.getName(), h.getValue()); return result; } From c916bc85eb218098cce0ffd5d5a476c4ac5c4c1b Mon Sep 17 00:00:00 2001 From: dartpopikyardo Date: Wed, 7 Sep 2016 20:08:36 +0300 Subject: [PATCH 7/8] fixed getDate() --- .../banking/web/queryside/accounts/AccountQueryController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java index 455ddf1..fd31810 100644 --- a/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java +++ b/java-spring/accounts-query-side-web/src/main/java/net/chrisrichardson/eventstore/javaexamples/banking/web/queryside/accounts/AccountQueryController.java @@ -52,7 +52,7 @@ public class AccountQueryController { public ResponseEntity getTransactionsHistory(@PathVariable String accountId) { AccountInfo accountInfo = accountInfoQueryService.findByAccountId(accountId); List historyEntries = new ArrayList<>(); - historyEntries.add(new AccountOpenInfo(accountInfo.getDate(), AccountHistoryEntry.EntryType.account, accountInfo.getChanges().get(0).getAmount())); + historyEntries.add(new AccountOpenInfo(accountInfo.getCreationDate(), AccountHistoryEntry.EntryType.account, accountInfo.getChanges().get(0).getAmount())); accountInfo.getTransactions().forEach(historyEntries::add); return ResponseEntity.ok().body(new AccountHistoryResponse(historyEntries)); From c88ba88063b6e54d9a2f14f898698f2725e33cb2 Mon Sep 17 00:00:00 2001 From: Chris Richardson Date: Fri, 16 Sep 2016 18:30:24 -0700 Subject: [PATCH 8/8] Improved Eventuate Local support --- _build-and-test-all.sh | 2 +- .../build-and-test-all-eventuate-local.sh | 4 + java-spring/docker-compose-common.yml | 48 ++++ .../docker-compose-eventuate-local.yml | 229 +++++++++++------- java-spring/docker-compose.yml | 82 +++---- java-spring/gradle.properties | 5 +- java-spring/set-env.sh | 21 ++ 7 files changed, 253 insertions(+), 138 deletions(-) create mode 100755 java-spring/build-and-test-all-eventuate-local.sh create mode 100644 java-spring/docker-compose-common.yml create mode 100644 java-spring/set-env.sh diff --git a/_build-and-test-all.sh b/_build-and-test-all.sh index e981415..d42d286 100755 --- a/_build-and-test-all.sh +++ b/_build-and-test-all.sh @@ -26,7 +26,7 @@ if [ "$1" = "--no-rm" ] ; then shift fi -${DOCKER_COMPOSE?} up -d mongodb +${DOCKER_COMPOSE?} up -d mongodb $EXTRA_INFRASTRUCTURE_SERVICES if [ -z "$DOCKER_HOST_IP" ] ; then if which docker-machine >/dev/null; then diff --git a/java-spring/build-and-test-all-eventuate-local.sh b/java-spring/build-and-test-all-eventuate-local.sh new file mode 100755 index 0000000..5f7caca --- /dev/null +++ b/java-spring/build-and-test-all-eventuate-local.sh @@ -0,0 +1,4 @@ +#! /bin/bash + +export EXTRA_INFRASTRUCTURE_SERVICES=cdcservice +../_build-and-test-all.sh -f docker-compose-eventuate-local.yml -P eventuateLocal=1 $* diff --git a/java-spring/docker-compose-common.yml b/java-spring/docker-compose-common.yml new file mode 100644 index 0000000..c8633cf --- /dev/null +++ b/java-spring/docker-compose-common.yml @@ -0,0 +1,48 @@ +apigateway: + image: java:openjdk-8u91-jdk + command: java -jar /app/api-gateway-service.jar --accounts.commandside.service.host=accountscommandside --transfers.commandside.service.host=transactionscommandside --accounts.queryside.service.host=accountsqueryside --customers.commandside.service.host=customerscommandside --customers.queryside.service.host=customersqueryside + environment: + SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + ports: + - "8080:8080" + +accountscommandside: + image: java:openjdk-8u91-jdk + command: java -jar /app/accounts-command-side-service.jar + ports: + - "8085:8080" + +transactionscommandside: + image: java:openjdk-8u91-jdk + command: java -jar /app/transactions-command-side-service.jar + ports: + - "8082:8080" + +accountsqueryside: + image: java:openjdk-8u91-jdk + command: java -jar /app/accounts-query-side-service.jar + environment: + SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + ports: + - "8081:8080" + +customerscommandside: + image: java:openjdk-8u91-jdk + command: java -jar /app/customers-command-side-service.jar + ports: + - "8083:8080" + +customersqueryside: + image: java:openjdk-8u91-jdk + command: java -jar /app/customers-query-side-service.jar + ports: + - "8084:8080" + environment: + SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + +mongodb: + image: mongo:3.0.4 + hostname: mongodb + command: mongod --smallfiles + ports: + - "27017:27017" diff --git a/java-spring/docker-compose-eventuate-local.yml b/java-spring/docker-compose-eventuate-local.yml index cd542c7..8a4eddc 100644 --- a/java-spring/docker-compose-eventuate-local.yml +++ b/java-spring/docker-compose-eventuate-local.yml @@ -1,11 +1,61 @@ +zookeeper: + image: eventuateio/eventuateio-local-zookeeper:0.6.0 + ports: + - 2181:2181 + - 2888:2888 + - 3888:3888 + + +kafka: + image: eventuateio/eventuateio-local-kafka:0.6.0 + ports: + - 9092:9092 + links: + - zookeeper + environment: + - ADVERTISED_HOST_NAME=${DOCKER_HOST_IP} + - KAFKA_HEAP_OPTS=-Xmx320m -Xms320m + - ZOOKEEPER_SERVERS=zookeeper:2181 + +mysql: + image: eventuateio/eventuateio-local-mysql:0.6.0 + ports: + - 3306:3306 + environment: + - MYSQL_ROOT_PASSWORD=rootpassword + - MYSQL_USER=mysqluser + - MYSQL_PASSWORD=mysqlpw + + +cdcservice: + image: eventuateio/eventuateio-local-cdc-service:0.6.0 + ports: + - "8099:8080" + links: + - mysql + - kafka + - zookeeper + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword + +mongodb: + extends: + file: docker-compose-common.yml + service: mongodb + apigateway: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: apigateway volumes: - ./api-gateway-service/build/libs:/app - command: java -jar /app/api-gateway-service.jar --accounts.commandside.service.host=accountscommandside --transfers.commandside.service.host=transactionscommandside --accounts.queryside.service.host=accountsqueryside --customers.commandside.service.host=customerscommandside --customers.queryside.service.host=customersqueryside - ports: - - "8080:8080" links: - accountscommandside - transactionscommandside @@ -13,117 +63,126 @@ apigateway: - customerscommandside - customersqueryside - mongodb + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword accountscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: accountscommandside volumes: - ./accounts-command-side-service/build/libs:/app - command: java -jar /app/accounts-command-side-service.jar - ports: - - "8085:8080" + links: + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword + transactionscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: transactionscommandside volumes: - ./transactions-command-side-service/build/libs:/app - command: java -jar /app/transactions-command-side-service.jar - ports: - - "8082:8080" + links: + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword + accountsqueryside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: accountsqueryside volumes: - ./accounts-query-side-service/build/libs:/app - command: java -jar /app/accounts-query-side-service.jar - ports: - - "8081:8080" links: - mongodb + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword + customerscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: customerscommandside volumes: - ./customers-command-side-service/build/libs:/app - command: java -jar /app/customers-command-side-service.jar - ports: - - "8083:8080" + links: + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword customersqueryside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: customersqueryside volumes: - ./customers-query-side-service/build/libs:/app - command: java -jar /app/customers-query-side-service.jar - ports: - - "8084:8080" links: - mongodb + - mysql + - kafka + - zookeeper environment: - SPRING_DATASOURCE_URL: - SPRING_DATASOURCE_USERNAME: - SPRING_DATASOURCE_PASSWORD: - SPRING_DATASOURCE_DRIVER_CLASS_NAME: - EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: - EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb - EVENTUATELOCAL_EMBEDDED_CDC_DB_USER_NAME: - EVENTUATELOCAL_EMBEDDED_CDC_DB_PASSWORD: - -mongodb: - image: mongo:3.0.4 - hostname: mongodb - command: mongod --smallfiles - ports: - - "27017:27017" + environment: + SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + SPRING_DATASOURCE_URL: jdbc:mysql://mysql/eventuate + SPRING_DATASOURCE_USERNAME: mysqluser + SPRING_DATASOURCE_PASSWORD: mysqlpw + SPRING_DATASOURCE_DRIVER_CLASS_NAME: com.mysql.jdbc.Driver + EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS: kafka:9092 + EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING: zookeeper:2181 + EVENTUATELOCAL_CDC_DB_USER_NAME: root + EVENTUATELOCAL_CDC_DB_PASSWORD: rootpassword diff --git a/java-spring/docker-compose.yml b/java-spring/docker-compose.yml index 1c5f0cb..5268023 100644 --- a/java-spring/docker-compose.yml +++ b/java-spring/docker-compose.yml @@ -1,11 +1,9 @@ apigateway: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: apigateway volumes: - ./api-gateway-service/build/libs:/app - command: java -jar /app/api-gateway-service.jar --accounts.commandside.service.host=accountscommandside --transfers.commandside.service.host=transactionscommandside --accounts.queryside.service.host=accountsqueryside --customers.commandside.service.host=customerscommandside --customers.queryside.service.host=customersqueryside - ports: - - "8080:8080" links: - accountscommandside - transactionscommandside @@ -14,80 +12,66 @@ apigateway: - customersqueryside - mongodb environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: - SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} accountscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: accountscommandside volumes: - ./accounts-command-side-service/build/libs:/app - command: java -jar /app/accounts-command-side-service.jar - ports: - - "8085:8080" environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} transactionscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: transactionscommandside volumes: - ./transactions-command-side-service/build/libs:/app - command: java -jar /app/transactions-command-side-service.jar - ports: - - "8082:8080" environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} accountsqueryside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: accountsqueryside volumes: - ./accounts-query-side-service/build/libs:/app - command: java -jar /app/accounts-query-side-service.jar - ports: - - "8081:8080" links: - mongodb environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: - SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} customerscommandside: - image: java:openjdk-8u91-jdk - working_dir: /app + extends: + file: docker-compose-common.yml + service: customerscommandside volumes: - ./customers-command-side-service/build/libs:/app - command: java -jar /app/customers-command-side-service.jar - ports: - - "8083:8080" environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} customersqueryside: + extends: + file: docker-compose-common.yml + service: customersqueryside image: java:openjdk-8u91-jdk - working_dir: /app volumes: - ./customers-query-side-service/build/libs:/app - command: java -jar /app/customers-query-side-service.jar - ports: - - "8084:8080" links: - mongodb environment: - EVENTUATE_API_KEY_ID: - EVENTUATE_API_KEY_SECRET: - SPRING_DATA_MONGODB_URI: mongodb://mongodb/mydb + EVENTUATE_API_KEY_ID: ${EVENTUATE_API_KEY_ID} + EVENTUATE_API_KEY_SECRET: ${EVENTUATE_API_KEY_SECRET} mongodb: - image: mongo:3.0.4 - hostname: mongodb - command: mongod --smallfiles - ports: - - "27017:27017" + extends: + file: docker-compose-common.yml + service: mongodb diff --git a/java-spring/gradle.properties b/java-spring/gradle.properties index 8c03167..e93b4ed 100644 --- a/java-spring/gradle.properties +++ b/java-spring/gradle.properties @@ -5,6 +5,5 @@ eventuateMavenRepoUrl=http://mavenrepo.eventuate.io/release springBootVersion=1.3.5.RELEASE -eventuateClientVersion=0.8.0.RELEASE -eventuateLocalVersion=0.2.0.RELEASE - +eventuateClientVersion=0.10.0.RELEASE +eventuateLocalVersion=0.4.0.RELEASE diff --git a/java-spring/set-env.sh b/java-spring/set-env.sh new file mode 100644 index 0000000..f84392f --- /dev/null +++ b/java-spring/set-env.sh @@ -0,0 +1,21 @@ +if [ -z "$DOCKER_HOST_IP" ] ; then + if [ -z "$DOCKER_HOST" ] ; then + export DOCKER_HOST_IP=`hostname` + else + echo using ${DOCKER_HOST?} + XX=${DOCKER_HOST%\:*} + export DOCKER_HOST_IP=${XX#tcp\:\/\/} + fi +fi + +echo DOCKER_HOST_IP is $DOCKER_HOST_IP + +export SPRING_DATASOURCE_URL=jdbc:mysql://${DOCKER_HOST_IP}/eventuate +export SPRING_DATASOURCE_USERNAME=mysqluser +export SPRING_DATASOURCE_PASSWORD=mysqlpw +export SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.jdbc.Driver +export EVENTUATELOCAL_KAFKA_BOOTSTRAP_SERVERS=$DOCKER_HOST_IP:9092 +export EVENTUATELOCAL_CDC_DB_USER_NAME=root +export EVENTUATELOCAL_CDC_DB_PASSWORD=rootpassword +export EVENTUATELOCAL_ZOOKEEPER_CONNECTION_STRING=$DOCKER_HOST_IP:2181 +