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

29 curtidas

Muito legal seu projeto! :wink:

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

4 curtidas

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

4 curtidas

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

Vou tentar dar uma olhada assim que der.

3 curtidas

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

3 curtidas

Entendi nada rs

5 curtidas

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

6 curtidas

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

3 curtidas

@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 curtidas

Muito legal, cara. Parabéns!

2 curtidas

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

1 curtida

Curti muito, e sempre bom aprender coisas novas !

2 curtidas

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

1 curtida

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

Olá,
Adorei seu projeto. Parabéns!
Eu sou estudante de Flutter e ainda estou no início.
Vi que você usou Clojure e Docker Hub para criar os microserviços e minha dúvida é do porque você optou por este caminho, de usar Clojure e Docjer Hub para criar microserviços? Dart não oferece essa opção de criar os próprios microserviços, não seria mais prático fazer tudo em Dart?
Se você puder clarear minha mente nesse funcionamento, seria muito gratificante pra mim que estou começando.
Um abraço!