The evolution of a component-based architecture
See Git tags for step-by-step notes.
git tag -ln
v1 First commit
v2 Functional groups
v3 Feature groups (Bounded Context)
v4 Components
v5 Applications
v6 Services
v7 Databases
v8 Versioning
v9 Service Discovery
v10 Circuit BreakerInstall redis
brew install redis
Modify
/opt/homebrew/etc/redis.conf(/usr/local/etc/redis.confon Intel Macs)requirepass foobared
Install mysql
brew install mysql
Modify
/opt/homebrew/etc/my.cnf(/usr/local/etc/my.cnfon Intel Macs)default-time-zone='+00:00'Database setup
mysql -v -uroot --execute="drop user 'uservices'@'localhost'" mysql -v -uroot --execute="create user 'uservices'@'localhost' identified by 'uservices';"fordatabase_namein'allocations''backlog''registration''timesheets';do mysql -v -uroot --execute="drop database if exists ${database_name}_test" mysql -v -uroot --execute="create database ${database_name}_test" mysql -v -uroot --execute="grant all on ${database_name}_test.* to 'uservices'@'localhost';" mysql -v -uroot --execute="grant select on performance_schema.* to 'uservices'@'localhost';"done mysql -v -uuservices -puservices registration_test --execute="select now();"
Schema Migrations
flyway -reportEnabled=false -cleanDisabled=false -user=uservices -password=uservices -url="jdbc:mysql://localhost:3306/allocations_test" -locations=filesystem:databases/allocations-database clean migrate flyway -reportEnabled=false -cleanDisabled=false -user=uservices -password=uservices -url="jdbc:mysql://localhost:3306/backlog_test" -locations=filesystem:databases/backlog-database clean migrate flyway -reportEnabled=false -cleanDisabled=false -user=uservices -password=uservices -url="jdbc:mysql://localhost:3306/registration_test" -locations=filesystem:databases/registration-database clean migrate flyway -reportEnabled=false -cleanDisabled=false -user=uservices -password=uservices -url="jdbc:mysql://localhost:3306/timesheets_test" -locations=filesystem:databases/timesheets-database clean migrate
Run tests
./gradlew build
Each server is configured through environment variables. Build the runnable jars first:
./gradlew buildStart the discovery server (backed by redis):
PORT=8888 \
REDIS_HOST=localhost \
REDIS_PASSWORD=foobared \
java -jar applications/discovery-server/build/libs/discovery-server.jarThen start each application server (backed by mysql), pointing it at the discovery server:
PORT=8881 \
DATABASE_URL="jdbc:mysql://localhost:3306/allocations_test?user=uservices&password=uservices" \
DISCOVERY_SERVER_ENDPOINT=http://localhost:8888 \
java -jar applications/allocations-server/build/libs/allocations-server.jar
PORT=8882 \
DATABASE_URL="jdbc:mysql://localhost:3306/backlog_test?user=uservices&password=uservices" \
DISCOVERY_SERVER_ENDPOINT=http://localhost:8888 \
java -jar applications/backlog-server/build/libs/backlog-server.jar
PORT=8883 \
DATABASE_URL="jdbc:mysql://localhost:3306/registration_test?user=uservices&password=uservices" \
DISCOVERY_SERVER_ENDPOINT=http://localhost:8888 \
java -jar applications/registration-server/build/libs/registration-server.jar
PORT=8884 \
DATABASE_URL="jdbc:mysql://localhost:3306/timesheets_test?user=uservices&password=uservices" \
DISCOVERY_SERVER_ENDPOINT=http://localhost:8888 \
java -jar applications/timesheets-server/build/libs/timesheets-server.jar| Variable | Used by | Description |
|---|---|---|
PORT | all servers | Port the server listens on |
DATABASE_URL | application servers | JDBC URL for the server's mysql database |
REDIS_HOST / REDIS_PASSWORD | discovery server | Redis connection used for the service registry |
DISCOVERY_SERVER_ENDPOINT | application servers | Base URL of the discovery server for heartbeats and lookups |