Projeto Nudemo (Aplicativo e microserviços)

Olá comunidade

Fiquei um tempo off da comunidade, pois meu tempo anda muito corrido, mas agora as coisas vão se acalmar. Gostaria de compartilhar com todos e principalmente com os membros que gostam de tecnologia e já trocaram umas ideias sobre isso aqui na comunidade, uma demo (demonstração) que criei nos últimos meses baseada no Aplicativo do Nubank.

O objetivo principal foi estudar a Stack de engenharia do Nubank, “O que fazem, o que comem, por onde andam… hoje no Globo reporter…” bricandeira kkk, mas foi bem isso. Brincadeiras a parte, a ideia foi analisar o que estavam usando e replicar em pequena escala, de forma simples e rápida.

Não foi fácil, pois as coisas evoluem rápidos lá dentro, enquanto uma apresentação técnica mostra algum, em outra 6 meses depois alguma coisa da apresentação anterios já havia mudado. O ecossistema de linguagens e ferramentas é grande, e torna impossível de abordar tudo de uma vez.

Sendo assim elaborei um projeto simples e didático, que resume em 3 microserviços escritos na linguagem Clojure que rodam em respectivos 3 containers disponíveis no Docker Hub que fornece a API para um Aplicativo escrito em Linguagem Dart através da framework Flutter.

Segue os repositórios do GitHub:

  • Aplicativo

    • O APP foi escrito em Dart na plataforma Flutter, utilizando o recomendado suporte androidX, é linguagens base Kotlin e Swift (se precisar escrever algum nativo, é nessas duas linguagens), possui a funcionalidade de exibir o saldo do cartão de crédito e o histórico de transações, até o momento somente despesas (compras) e receitas (pagamento da fatura) foram implementas, fique a vontade para contribuir com as demais funcionalidades do cartão :wink:.
    • Pensando em implementar uma Feature (Característica) nova que ainda não exista no App, mas que ao mesmo tempo seja útil e simples para implementar, eu escolhi o “Modo dark”, sendo ativado pelo sistema operacional do dispositivo, em resumo o aparelho precisa dá suporte ao “Modo dark” para conseguir usar o App com o tema escuro.
    • Todas as outras páginas (rotas) foram implementadas sem conteúdo (somente um texto de construção), está meio caminho andado para implementar mais funcionalidades.
  • Microserviço “customer” (Cliente)

    • Esse microserviço foi escrito em Clojure através de um template do Leiningen e utiliza algumas das bibliotecas (ring, cheshire, midje…) utilizadas pelo microserviço de exemplo (basic-microservice-example) disponibilizado no repositório oficial do Nubank, ele tem única funcionalidade de gerir o cadastro de clientes: cadastra; busca e lista clientes.
    • Até o momento a persistência é feita somente em memória (Átomo), a ideia era que seja efeita em um banco de dados Datomic, fique a vontade para contribuir implementando esse recurso :wink:.
    • Até o momento a API é REST, a ideia era utilizar o GraphQL, fique a vontade para contribuir implementando esse recurso :wink:.
    • Está disponível em container no Docker Hub (customer-service).
  • Microserviço “account” (Conta)

    • Mesmas características do “customer”, porém esse é exclusivamente responsável por gerir a conta do cliente (agência, número da conta e limite da conta). Esse serviço somente busca a conta por ID da conta ou ID do cliente, além de cadastrar novas contas e listar todas.
    • Está disponível em container no Docker Hub (account-service).
  • Microserviço “purchase” (Compra)

    • Mesmas características do “customer”, porém esse é exclusivamente responsável por gerir as transações de compras feitas com o cartão e pagamentos das faturas, no momento só registra receitas e despesas, mas pode receber outro tipo de registro que seria as mensagens de sistemas (“Dispositivo autorizado”, “Fatura fechada” e etc…) através do código de origem.
    • Está disponível em container no Docker Hub (purchase-service).
  • Nudemo services

    • Repositório do arquivo do Docker-compose, cada um dos repositório dos microserviços possue seu arquivo Dockerfile para construção do seu próprio container, com o Docker-composer você sobe os 3 microserviços ao mesmo tempo com portas e rede configurada, útil para testes locais, eu não tive tempo de terminar o tutorial de configuração do Amazon ECS e AWS Fargate, porém o repositório possui as 3 definições de “Task” (Tarefa) no diretório ’ AmazonECS/taskDefinitions’ para o ECS + Fargate, assim que possível finalizo o tutorial, não tem muito segredo não, no ECS escolha sempre o gerenciamento via Fargate, isso vai simplificar as coisas pois o mesmo gerencia e aloca instâncias EC2 para você, bastando você se preocupar somente com os container, depois crie as 3 “Task” com as definições do repositório, depois crie um Cluster, com o Cluster criado, crie 3 Services (Serviços) para cada uma das 3 “Task”, no final você vai ter 1 Cluster, 3 Serviços e 3 Task, pegue o IP público em cada Task e insira no arquivo de Config.dart do App, com isso você vai conseguir efetuar as transações e visualiza-las no App.

Os repositórios estão bem documentados com exemplos para fazer quase tudo no projeto, configurar, modificar, rodar testes automatizados, criar os instaláveis, criar e subir container localmente.

Uma informação importante é que até a Release v1.0.0 do App, não há necessidade de subir os microserviços, pois os dados do App são simulados a parti dos dados do arquivo Config.dart.
Após essa Release (lançamento) o App só inicia se os microserviços estiverem online, caso contrário será exibido uma página informando a necessidade dos microserviços no ar.

Uma vez que os microserviços estejam online (todo os 3), ao abrir o App, ele cria um cadastro de cliente e uma conta automaticamente (com os dados do arquivo Config.dart, pensa num limite generoso de 15 pilas :rofl: :rofl: :rofl:), depois disso você até consegue mexer no App sem os microserviços no Online, pois os dados do Cliente (customer) e Conta (account) estão sendo persistidos na memória do disposivo (SharedPreferences), já os registros de transações ainda dependem do microserviço “purchase” no ar. A ideia era implantar uma persistência de dados mais robusta para a listagem de transações em banco de dados SQLite, que no Flutter se chama SQFlite, está ai mais uma coisa para vocês contribuirem kkk :wink:.

O projeto do App implementa a biblioteca Sylph, que dá suporte a integração dos ‘testes de integração (Drive Test)’ com a gigante DeviceFarm da AWS, permitindo testar o App em centenas de dispositivos Android ou iOS ao mesmo tempo, os primeiros 1000 minutos são grátis.

Por qual motivo eu usei Dart e Flutter para construir o App?

Em um podcast de maio de 2019 do Hipsters.Tech, o CTO Ed Wible fala sobre a utilização do Flutter, além também do Post Porquê nós achamos que Flutter vai nos ajudar a escalar o desenvolvimento mobile no Nubank do Nubanker Alexandre Freire no Medium do Nubank.

Por que eu decidi implementar o “Modo dark” (tema escuro) como nova feature com tantas outras coisas úteis para implementar?

Smartphones modernos que possuem tela OLED, consegue ‘desligar’ o pixel escuro/preto, isso gera economia no consumo da bateria, que acarreta em menos carregamento da bateria do dispositivo, que acarreta em economia de enegia elétrica nas residências. Agora pensem comigo, o Nubank tem mais de 15 milhões de clientes, se pelo menos a metade possuir dispositivos com tal tecnologia, e carregarem por menos tempo ou quantidade de vezes menor, é menos energia que o País precisa gerar, talvez evite de acionar a Termelétrica de Angra dos Reis, energia mais barata para todos e menos poluição… E caso os clientes não tenha um dispositivo com OLED, mas tenha suporte ao modo escuro ele terá mais conforto em ambientes escuros ao mexer no App. Em resumo foi o que eu pensei de mais útil e rápido para implementar.

É isso aí, se precisarem de ajuda, abram as issues nos repositórios ou comente aqui mesmo, não promento ser rápido na resposta mas vou fazer o possível para ajudar.

Abraços…

Links:
http://github.com/chinnonsantos/nudemo
https://github.com/chinnonsantos/customer-service
https://github.com/chinnonsantos/account-service
https://github.com/chinnonsantos/purchase-service
https://github.com/chinnonsantos/nudemo-services
https://hub.docker.com/r/chinnonsantos/customer-service
https://hub.docker.com/r/chinnonsantos/account-service
https://hub.docker.com/r/chinnonsantos/purchase-service

28 Likes

Muito legal seu projeto! :wink:

Vou ver o código com calma assim que tiver um tempinho.

4 Likes

Interessante demais, vou começar a estudar Flutter, e utilizarei como aprendizado.

4 Likes

Muito bacana o seu projeto, parabéns! :clap:

Vou tentar dar uma olhada assim que der.

3 Likes

Amei
Seria ótimo esse projeto
:clap::clap::clap:

3 Likes

Entendi nada rs

5 Likes

Achei lindo, mas estou na mesma também. :joy:

6 Likes

Então, @anon2189516 @FelipeMoraes pensei que só eu quem não tinha entendido rsrs

3 Likes

@anon2189516 @FelipeMoraes @Jose_Garcia

Algumas pessoas na comunidade trabalham ou tem interesse em trabalhar com tecnologia (desenvolvimento, criação de sistemas e aplicativos), projetos open-source (código fonte aberto) como esse permite que desenvolvedores e design analisem, alterem e executem o código para estudos.

Eu particularmente aprendo mais - fazendo - e acredito que com outras pessoas seja igual, eu iniciei o projeto e há mais coisas a se fazer, essa é uma ótima oportunidade para aprender.

Gosto de compartilhar conhecimento, já ministrei cursos de programação e compartilho da idéia do Steve Jobs, em que:

"Todos neste país deveriam aprender a programar um computador, pois isto ensina a pensar."

Como todos nós aqui amamos o roxinho, porque não aprender fazendo aquilo que gostamos. É uma motivação que torna o aprendizado mais prazeroso.

7 Likes

Muito legal, cara. Parabéns!

2 Likes

Sinta se a vontade cara, a casa é nossa.
Sucesso no seu projeto.
:clap::clap::clap:

1 Like

Curti muito, e sempre bom aprender coisas novas !

2 Likes

Está faltando o App do Nubank no modo dark… será que estão trabalhando nisso?

1 Like

Espero que sim, pois vai ser muito legal no modo dark.