/gobeer

App demo

Primary LanguageGo

gobeer

Test and coverage codecov

Projeto de demonstração utilizado na talk sobre estrutura de projetos Go, onde utilizamos princípios de design baseados no DDD (Domain Driven Design) e Arquitetura Hexagonal para o desenvolvimento de um pequeno backend.

Conteúdo

Motivação

Um dos principais motivos para a não adoção da linguagem Go em novos projetos é a dúvida relacionada a como devemos estruturar os projetos. A linguagem não nos dá nenhuma dica a respeito disso, é como se fosse tudo por nossa conta. O que é ótimo na verdade, porque podemos nos divertir com a estrutura e podemos deixá-la do nosso jeito. Mas ao mesmo tempo isso pode ser um problema, especialmente para quem vem de linguagens Orientadas a Objetos como Java ou C#, e esperam ver classes e objetos. Mas quando se deparam com os idiomas da linguagem não sabem bem por onde começar, ou começam escrevendo código Go com os idiomas que estão acostumados.

Projeto

Como demontração vamos fazer um serviço para review de cervejas, com os seguintes requisitos:

  • O usuário pode criar uma cerveja.
  • O usuário pode listar todas as cervejas.
  • O usuário pode fazer um review de uma cerveja.
  • O usuário pode listar os reviews de uma determinada cerveja.
  • Os dados devem ser armazenados em banco de dados.

Tradução dos requisitos para uma linguagem oblíqua:

  • Context: Beer tasting (degustação de cervejas)
  • Language: Beer, Review
  • Entity: Beer, Review
  • Service: Beer adder, Beer lister, Review adder, Review lister
  • Events: Beer added, Review added
  • Repository: Beer repository, Review Repository

Tecnologias

Além de Go como linguagem, utilizamos também:

  • PostgreSQL: Banco de dados.
  • docker/docker-compose: Para nos ajudar com o ambiente de desenvolvimento.

Organização

O projeto utiliza uma filosofia de design baseada em DDD (Domain Driven Design) e Arquitetura Hexagonal. Tento como principais caracteristicas:

  • Consistente
  • Fácil de entender e de navegar
  • Fácil de mudar (loosely-coupled/acoplamento fraco)
  • Fácil de testar
  • O mais simples possível, mas não simples demais
  • O design reflete exatamente como o software funciona
  • A estrutura reflete exatamente o design

Desenvolvimento

Para desenvolver para este projeto você deve ter em seu computador:

Rodando o ambiente local

Se você nunca desenvolveu neste repositório antes:

Clonando o repositório

Com HTTPS

$ git clone https://github.com/phbpx/gobeer.git

Com SSH

$ git clone git@github.com:phbpx/gobeer.git

Comandos makefile

Para ajudar com o fluxo de trabalho o projeto possui um Makefile com alguns comandos úteis, para conhecê-lo, rode o comando:

$ make help

Output:

Usage:
  make <target>

Targets:
  help                 Show help
  setup                Install go tools
  test                 Execute tests
  cover                Execute tests with coverage visualization
  lint                 Execute static check
  dev                  Run local environment
  stop                 Stop local environment

Setup

Alguns comandos make utilizam ferramentas de linha de comando do Go, e para instalar é necessário rodar o comando:

$ make setup

Executando testes

O projeto possui uma suite de testes de unidade (em use cases) e testes de integração (nas portas/adapters). Para executar, rode o comando:

$ make test

Para executar os testes e vizualisar o relatório de cobertura de código, rode o comando:

$ make cover

Executando o ambiente local

O projeto possui um docker-compose com o necessário para rodar localmente a api:

$ make dev

E para desligar o ambiente:

$ make stop

Endereços:

  • gobeer-api: http://localhost:3000
    • Adding beer: POST http://localhost:3000/beers
    • Listing beers: GET http://localhost:3000/beers
    • Adding beer review: POST http://localhost:3000/beers/:beer_id/reviews
    • Listing beer reviews: GET http://localhost:3000/beers/:beer_id/reviews
    • Helthcheck: GET http://localhost:3000/debug/health

Postman

Para facilitar a utilização da api, o repositótio possui uma collection postman (link para o arquivo).

Banco de dados

Para acessar o banco de dados com o adminer:

  1. Acesse: http://localhost:8080
  2. No campo System, selecione a opção: PostgreSQL
  3. No campo Server, preencha com: db
  4. No campo Username, preencha com: postgres
  5. No campo Password, preencha com: postgres
  6. No campo Database, preencha com: testdb

Caso queira acessar o banco com um client de sua preferência:

  • Host: localhost:5432
  • Username: postgres
  • Password: postgres
  • Database: testdb

Monitoria

A infra local utiliza o OpenTelemetry em conjunto com o Jaeger para monitoria.