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.
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.
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
Além de Go como linguagem, utilizamos também:
- PostgreSQL: Banco de dados.
- docker/docker-compose: Para nos ajudar com o ambiente de desenvolvimento.
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
Para desenvolver para este projeto você deve ter em seu computador:
- golang (veja como instalar).
- docker (veja como instalar).
- docker-compose (veja como instalar).
Se você nunca desenvolveu neste repositório antes:
Com HTTPS
$ git clone https://github.com/phbpx/gobeer.git
Com SSH
$ git clone git@github.com:phbpx/gobeer.git
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
Alguns comandos make utilizam ferramentas de linha de comando do Go, e para instalar é necessário rodar o comando:
$ make setup
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
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
- Adding beer:
Para facilitar a utilização da api, o repositótio possui uma collection postman (link para o arquivo).
Para acessar o banco de dados com o adminer:
- Acesse:
http://localhost:8080
- No campo
System
, selecione a opção:PostgreSQL
- No campo
Server
, preencha com:db
- No campo
Username
, preencha com:postgres
- No campo
Password
, preencha com:postgres
- 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
A infra local utiliza o OpenTelemetry em conjunto com o Jaeger para monitoria.