Microserviço referente ao backend das assinaturas do Codeflix
Utilizando Clean Architecture, DDD, TDD e as boas práticas atuais de mercado
- JDK 21
- IDE de sua preferência
- Docker
flowchart TD
A[Sign up] -->|input data| B(SignUp mediator)
B -->|input data| C(IAM SignUp - Keycloak)
B -->|input data with iam id| D(UserAccount SignUp)
flowchart TD
A[Create Subscription] --> B(Trial)
B -- Charge Subscription --> C{charge succeeded?}
C -->|YES| D[Active]
C -->|CANCEL| F[Canceled]
C -->|NO| E[Incomplete]
E --> |Retry charging| B
Creating the debezium mysql user:
CREATE USER IF NOT EXISTS 'debezium'@'%' IDENTIFIED WITH mysql_native_password BY 'debezium';
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%';
FLUSH PRIVILEGES;
Creating the kafka connect connector for the Debezium:
curl --location --request PUT 'http://localhost:8083/connectors/admin-mysql-cdc/config' \
--header 'Content-Type: application/json' \
--data '{
"topic.creation.default.replication.factor": 1,
"topic.creation.default.partitions": 1,
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"tasks.max": "1",
"key.converter": "org.apache.kafka.connect.json.JsonConverter",
"key.converter.schemas.enable": "true",
"value.converter": "org.apache.kafka.connect.json.JsonConverter",
"value.converter.schemas.enable": "true",
"database.hostname": "mysql",
"database.port": "3306",
"database.user": "debezium",
"database.password": "debezium",
"database.server.id": "10000",
"database.server.name": "adm_videos_mysql",
"database.allowPublicKeyRetrieval": "true",
"database.include.list": "adm_videos",
"table.include.list": "adm_videos.categories,adm_videos.cast_members,adm_videos.genres,adm_videos.videos",
"database.history.kafka.bootstrap.servers": "kafka:9092",
"database.history.kafka.topic": "adm_videos.dbhistory",
"include.schema.changes": "false",
"schema.enable": "false",
"topic.creation.adm_videos.include": "adm_videos_mysql\\.adm_videos\\.*",
"topic.creation.adm_videos.partitions": 1
}'
O banco de dados principal é um MySQL e para subir localmente vamos utilizar o Docker. Execute o comando a seguir para subir o MySQL:
docker-compose up -d
Pronto! Aguarde que em instantes o MySQL irá estar pronto para ser consumido na porta 3306.
Caso seja a primeira vez que esteja subindo o banco de dados, é necessário
executar as migrações SQL com a ferramenta flyway
.
Execute o comando a seguir para executar as migrações:
./gradlew flywayMigrate
Pronto! Agora sim o banco de dados MySQL está pronto para ser utilizado.
É possível limpar (deletar todas as tabelas) seu banco de dados, basta executar o seguinte comando:
./gradlew flywayClean
MAS lembre-se: "Grandes poderes, vem grandes responsabilidades".
Existe duas maneiras de gerar uma inconsistência no Flyway deixando ele no estado de reparação:
- Algum arquivo SQL de migração com erro;
- Algum arquivo de migração já aplicado foi alterado (modificando o
checksum
).
Quando isso acontecer o flyway ficará em um estado de reparação
com um registro na tabela flyway_schema_history
com erro (sucesso = 0
).
Para executar a reparação, corrija os arquivos e execute:
./gradlew flywayRepair
Com o comando acima o Flyway limpará os registros com erro da tabela flyway_schema_history
,
na sequência execute o comando FlywayMigrate para tentar migrar-los novamente.
Além dos comandos já exibidos, temos alguns outros muito úteis como o info e o validate:
./gradlew flywayInfo
./gradlew flywayValidate
Para saber todos os comandos disponíveis: Flyway Gradle Plugin
Lá no build.gradle
configuramos o Flyway para lêr primeiro as variáveis de
ambiente FLYWAY_DB
, FLYWAY_USER
e FLYWAY_PASS
e depois usar um valor padrão
caso não as encontre. Com isso, para apontar para outro ambiente basta sobrescrever
essas variáveis na hora de executar os comandos, exemplo:
FLYWAY_DB=jdbc:mysql://prod:3306/adm_videos FLYWAY_USER=root FLYWAY_PASS=123h1hu ./gradlew flywayValidate