Pequena arquitetura com o intuito de aplicar/testar conhecimentos em microserviços e Event-Driven.
A aplicação consistem em dois microserviços:
- API de consultas médicas
- Iniciar consulta
- Finalizar consulta
- API financeira
- Verificar cobrança
Sempre que uma consulta é finalizada, um evento é lançado e uma cobrança é gerada a partir daquele evento.
Como as dependencias dos microserviços são basicamente as mesmas, optei por fazer um único build para os dois.
Durante o desenvolvimento foram utilizadas as seguintes tecnologias:
Caso queira montar o ambiente na sua máquina eu recomendo instalar toda a parte python (microserviços) e deixar o restante rodando nos containers docker. Você pode utilizar o pyenv para gerenciar as versões do python e o virtualenvwrapper para gerenciar seus ambientes virtuais, uma combinação dos dois é só alegria.
Após montar o seu ambiente e instalar o poetry, basta um poetry install
e todas as dependencias serão instaladas.
Faça uma cópia do arquivo .env.example
renomeando para .env
, após isso configure o novo arquivo com suas variáveis de ambiente.
- Para executar o serviço de atendimentos médicos:
python appointment/run.py
- Para executar o serviço de financeiro.
python financial/run.py
E claro, voce pode optar por rodar todo o projeto em containers docker, sem a necessidade de muitas instalações e setando as variáveis de ambiente direto no docker-composer, dentro da pasta do projeto basta executar:
docker-compose up --build
Caso queira deixar rodando em background:
docker-compose up --build -d
Os dois serviços possuem documentação com swagger e redoc.
Acessando "/docs"
você tem acesso ao Swagger, onde você também consegue testar os endpoints.
Acessando "/redoc"
você tem acesso ao ReDoc.
Você também pode monitorar os eventos utilizando o Kafdrop que estará rodando em http://localhost:19000.
Também foi adicionado um Nginx com o intuito de ser um "API Gateway", ad requisições enviadas para http://localhost/appointment/ e para http://localhost/financial/ são redirecionadas para os devidos serviços.
- Appointment:
[POST] "/"
// body { "physician_id": "ea959b03-5577-45c9-b9f7-a45d3e77ce82", "patient_id": "86158d46-ce33-4e3d-9822-462bbff5782e", } // response { "id": "84ab6121-c4a8-4684-8cc2-b03024ec0f1d", "start_date": "2020-12-01 13:00:00", "end_date": null, "physician_id": "ea959b03-5577-45c9-b9f7-a45d3e77ce82", "patient_id": "86158d46-ce33-4e3d-9822-462bbff5782e", "price": 200.00 }
[POST] "/{id}/"
// response { "id": "84ab6121-c4a8-4684-8cc2-b03024ec0f1d", "start_date": "2020-12-01 13:00:00", "end_date": "2020-12-01 14:00:00", "physician_id": "ea959b03-5577-45c9-b9f7-a45d3e77ce82", "patient_id": "86158d46-ce33-4e3d-9822-462bbff5782e", "price": 200.00 }
- Financial:
[GET] "/{id}/"
// response { "appointment_id": "84ab6121-c4a8-4684-8cc2-b03024ec0f1d", "total_price": 400.00, }
- Implementar mais testes (testar o kafka).
- Melhorar os mocks (motor, kafka)