- WalletCore
Este projeto é um sistema de gerenciamento de carteiras e saldos financeiros desenvolvido no contexto do curso Event Driven Architecture oferecido pela FullCycle. O objetivo é aplicar os conceitos de arquitetura orientada a eventos em uma aplicação prática, utilizando tecnologias modernas e boas práticas de desenvolvimento.
O sistema é composto por dois serviços principais:
- wallet-core: Implementado em Go durante as aulas do curso, este serviço é responsável pelo gerenciamento de contas e transações financeiras da carteira digital. Ele lida com as operações fundamentais que garantem a integridade e a segurança das transações dos usuários.
- balance-app: Desenvolvido em Java como parte do desafio proposto, este serviço é dedicado ao cálculo e atualização dos saldos. Ele assegura que todas as movimentações financeiras refletem corretamente nos balanços, mantendo a consistência dos dados.
A arquitetura do projeto foi concebida seguindo o paradigma de microserviços, o que promove escalabilidade, flexibilidade e facilidade de manutenção. A utilização de contêineres Docker permite que os serviços sejam implantados de maneira consistente em qualquer ambiente, facilitando o processo de desenvolvimento e implantação contínua.
Para comunicação assíncrona entre os serviços, o projeto emprega o Apache Kafka junto com o Zookeeper, implementando os princípios da arquitetura orientada a eventos. Essa abordagem garante que os serviços possam interagir de forma desacoplada, aumentando a robustez e a resiliência do sistema como um todo.
O projeto é composto por dois serviços principais:
- Descrição: Serviço desenvolvido em Go responsável pelo gerenciamento de contas e transações da carteira digital. Ele lida com as operações fundamentais que garantem a integridade e a segurança das transações dos usuários.
- Descrição: Aplicação desenvolvida em Java responsável pelo gerenciamento de balanços financeiros. Ela assegura que todas as movimentações financeiras sejam refletidas corretamente nos balanços, mantendo a consistência e integridade dos dados.
- Descrição: Instância do MySQL utilizada pelo serviço
wallet-core
para armazenamento de dados relacionados a clientes, contas e transações. - Dados Persistentes: Armazenados no diretório
mysql-wallet
. - Configuração: Detalhes de configuração podem ser encontrados no arquivo
docker-compose.yaml
.
- Descrição: Instância do MySQL utilizada pelo serviço
balance-app
para armazenamento de dados relacionados aos balanços das contas. - Dados Persistentes: Armazenados no diretório
mysql-balance
. - Configuração: Detalhes de configuração podem ser encontrados no arquivo
docker-compose.yaml
.
- Descrição: Utilizados para comunicação assíncrona entre os serviços, implementando uma arquitetura orientada a eventos que permite o desacoplamento e escalabilidade dos componentes.
- Configuração: As configurações dos serviços Kafka e Zookeeper estão definidas no arquivo
docker-compose.yaml
.
- Descrição: Ferramenta de monitoramento e gerenciamento para plataformas baseadas em Kafka. Permite visualizar em tempo real o fluxo de dados, tópicos, consumidores, produtores e outras métricas relevantes.
- Características:
- Facilita o monitoramento das operações de mensageria entre os serviços.
- Acessível através de uma interface web intuitiva.
- Configuração: Detalhes sobre a integração com o Confluent Control Center estão disponíveis no arquivo
docker-compose.yaml
.
O projeto utiliza as seguintes tecnologias e ferramentas:
- Go: Linguagem de programação utilizada no
wallet-core
para desenvolvimento de serviços e aplicações.
- Confluent Kafka Go: Cliente Go para Apache Kafka, utilizado no
wallet-core
para comunicação assíncrona. - Go-Chi: Framework leve para criação de APIs em Go, utilizado no
wallet-core
para roteamento e manipulação de requisições HTTP. - Go-SQL-Driver: Driver MySQL para Go, utilizado no
wallet-core
para persistência de dados em ambiente de produção. - Godotenv: Carrega variáveis de ambiente a partir de arquivos
.env
nowallet-core
. - Go-SQLite3: Driver SQLite para Go, utilizado no
wallet-core
para persistência de dados em ambiente de desenvolvimento. - Ulid: Biblioteca Go para geração de identificadores únicos lexicograficamente ordenados, utilizada no
wallet-core
. - Testify: Pacote de utilidades para testes em Go, utilizado no
wallet-core
para asserções e mocks.
- Migrate: Ferramenta de migração de banco de dados utilizada no
wallet-core
para gerenciar mudanças na estrutura do banco de dados de forma controlada.
- Go Modules: Sistema oficial de gerenciamento de dependências em Go.
- Makefile: Utilizado para automação de tarefas comuns, como build, execução e testes.
- Java: Linguagem de programação utilizada no
balance-app
para desenvolvimento de serviços e aplicações.
- Lombok: Biblioteca Java que reduz o código boilerplate, fornecendo anotações para geração automática de getters, setters e outros métodos comuns.
- Spring Boot: Framework Java utilizado no
balance-app
para facilitar o desenvolvimento de aplicações web ao fornecer configurações padrão e integração com outros serviços. - Spring Web: Projeto Spring para desenvolvimento de aplicações web, utilizado no
balance-app
para criação de APIs RESTful. - Spring Data JPA: Projeto Spring para integração com JPA, utilizado no
balance-app
para persistência de dados. - Spring Kafka: Projeto Spring para integração com Apache Kafka, utilizado no
balance-app
para comunicação assíncrona.
- Liquibase: Ferramenta de migração de banco de dados utilizada no
balance-app
para gerenciar mudanças na estrutura do banco de dados de forma controlada.
- Gradle: Ferramenta de automação de build e gerenciamento de dependências Java, utilizada no
balance-app
.
- MySQL: Sistema de gerenciamento de banco de dados relacional utilizado pelos serviços
wallet-core
e `balance-app
- Apache Kafka: Plataforma de streaming de eventos utilizada para comunicação assíncrona entre os serviços.
- Confluent Control Center: Ferramenta de monitoramento e gerenciamento para plataformas baseadas em Kafka.
- Docker: Utilizado para containerização dos serviços e dependências.
- Docker Compose: Utilizado para orquestração dos contêineres e serviços.
- Docker: Instalado e configurado na máquina local.
- Docker Compose: Instalado e configurado na máquina local.
- Git: Instalado e configurado na máquina local.
- Make: Opcional, mas recomendado para facilitar a execução de tarefas comuns.
Caso queira desenvolver localmente, é necessário ter as seguintes ferramentas instaladas:
- Go: Versão 1.23 ou superior.
- Java: Versão 23 ou superior.
- VS Code: Editor de código recomendado.
- IntelliJ IDEA: IDE recomendada para desenvolvimento Java.
As outras dependências são gerenciadas pelos contêineres Docker e Docker Compose, ou pelas ferramentas de gerenciamento de dependências específicas de cada linguagem.
Após clonar o repositório, siga as instruções abaixo para executar o projeto localmente.
-
Construir e iniciar os contêineres:
Execute o comando abaixo na raiz do projeto para construir e iniciar todos os serviços em segundo plano:
make up
Ou, se preferir iniciar diretamente com o Docker Compose:
docker-compose up -d --build
-
Parar e remover os contêineres:
Para parar todos os serviços e remover os contêineres e volumes associados, execute:
make down
Ou, se preferir parar diretamente com o Docker Compose:
docker-compose down sudo rm -rf ./.docker/mysql*
-
Para visualizar os logs de um serviço específico, utilize:
docker compose logs -f balanceapp
ou
docker compose logs -f goapp
Para verificar o status e os logs dos contêineres de maneira mais fácil, recomendo o uso do lazydocker, uma interface de terminal interativa para gerenciamento de contêineres Docker.
- wallet-core: http://localhost:8080
- balance-app: http://localhost:8081
- Confluent Control Center: http://localhost:9021
- MySQL Wallet: Porta 3306
- MySQL Balance: Porta 3307
- Zookeeper: Porta 2181
- Kafka: Porta 9092
Mais detalhes sobre as portas e configurações de rede podem ser encontrados no arquivo docker-compose.yaml
e nos arquivos de configuração de cada serviço.
- Certifique-se de que as portas definidas nos arquivos docker-compose.yaml não estejam em uso por outros serviços em sua máquina.
- Os volumes persistentes são armazenados na pasta .docker. Se necessário, você pode remover dados antigos excluindo os diretórios correspondentes.
A API do projeto é composta por dois serviços principais: wallet-core
e balance-app
. Cada serviço fornece endpoints específicos para a criação de clientes, contas e transações, bem como a consulta dos saldos das contas.
Para facilitar o uso da API, o projeto contem dois arquivos .http que podem ser utilizados com a extensão REST Client do VS Code. Basta clicar no botão "Send Request" para executar as requisições e visualizar as respostas.
- [[requests/wallet-core.http]]: Contém as requisições para criação de clientes, contas e transações.
- [[requests/balance-app.http]]: Contém as requisições para consulta dos saldos das contas.
A documentação abaixo descreve os endpoints disponíveis, os parâmetros necessários e as respostas esperadas.
A API do wallet-core fornece endpoints para a criação de clientes, contas e transações em uma carteira digital.
Essa rota permite criar um novo cliente na carteira digital, fornecendo o nome e o e-mail do cliente.
POST http://localhost:8080/clients HTTP/1.1
Content-Type: application/json
{
"name": "Zé Galinha",
"email": "ze@galinha.com"
}
Parâmetro | Tipo | Descrição |
---|---|---|
name |
string |
Obrigatório. O nome do cliente |
email |
string |
Obrigatório. O e-mail do cliente |
A resposta contém os dados do cliente criado:
{
"ID": "01JCMDQ6W0RCBZ4ZHCVQG0SAZ8",
"CreatedAt": "2024-11-14T04:08:21.120816294Z",
"UpdateAt": "2024-11-14T04:08:21.120816334Z",
"Name": "Zé Galinha",
"Email": "ze@galinha.com"
}
Essa rota permite criar uma nova conta para um cliente existente, fornecendo o ID do cliente.
POST http://localhost:8080/accounts HTTP/1.1'
Content-Type: application/json
{
"client_id": "01JCBJNZFP2G6QHBX9MJHDAGR3"
}
Parâmetro | Tipo | Descrição |
---|---|---|
client_id |
string |
Obrigatório. O ID do cliente |
A resposta contém o ID da conta ecém criada.
{
"ID": "01JCMDZN7V1QHKPK45NMXGYTN7"
}
Essa rota permite realizar uma transação financeira entre duas contas, fornecendo os IDs das contas de origem e destino, bem como o valor da transação.
POST http://localhost:8080/transactions HTTP/1.1
Content-Type: application/json
{
"from_account_id": "01JCBJMXSSV0EGRRJ69ND23NEV",
"to_account_id": "01JCBJPGHCQA0DJRFAXWE32C68",
"amount": 1
}
Parâmetro | Tipo | Descrição |
---|---|---|
from_account_id |
string |
Obrigatório. O ID da conta de origem |
to_account_id |
string |
Obrigatório. O ID da conta de destino |
amount |
float |
Obrigatório. O valor da transação |
A resposta contém o id da trasnsação, a conta de origem, a conta de destino e o valor da transação.
{
"id": "01JCME4624TBSM22901YHMCR7K",
"from_account_id": "01JCBJMXSSV0EGRRJ69ND23NEV",
"to_account_id": "01JCBJPGHCQA0DJRFAXWE32C68",
"amount": 1
}
A API do balance-app fornece endpoints para consulta dos saldos das contas.
Essa rota permite consultar o saldo de uma conta específica, fornecendo o ID da conta.
GET http://localhost:3003/balances/01JCBJMXSSV0EGRRJ69ND23NEV HTTP/1.1
Parâmetro | Tipo | Descrição |
---|---|---|
id |
string |
Obrigatório. O ID da conta |
A resposta contém o saldo atual da conta consultada, assim como o ID da conta.
{
"id": "01JCBJMXSSV0EGRRJ69ND23NEV",
"createdAt": "2024-11-11T00:00:00",
"updatedAt": "2024-11-14T04:15:26",
"clientId": "01JCBJNZFP2G6QHBX9MJHDAGR3",
"balance": 998.00
}
Essa rota permite consultar a lista de contas cadastradas no sistema.
GET http://localhost:3003/balances HTTP/1.1
A resposta contém uma lista de contas, cada uma com seu ID e saldo atual.
[
{
"id": "01JCBJMXSSV0EGRRJ69ND23NEV",
"createdAt": "2024-11-11T00:00:00",
"updatedAt": "2024-11-14T04:15:26",
"clientId": "01JCBJNZFP2G6QHBX9MJHDAGR3",
"balance": 998.00
},
{
"id": "01JCBJPGHCQA0DJRFAXWE32C68",
"createdAt": "2024-11-11T00:00:00",
"updatedAt": "2024-11-14T04:15:26",
"clientId": "01JCBJPMXY1H52YGGG5FD328MT",
"balance": 1002.00
}
]
Distribuído sob a licença MIT.
Este projeto foi desenvolvido com base no curso Event Driven Architecture, da FullCycle, que foi ministrado por Wesley Willians. Agradeço a toda a equipe da FullCycle por disponibilizar conteúdos de qualidade e por promover a disseminação de conhecimento na comunidade de desenvolvimento de software.