Este é um template de projeto Go que implementa os princípios da Clean Architecture, oferecendo uma base sólida para o desenvolvimento de APIs RESTful. O template inclui funcionalidades essenciais como autenticação JWT, integração com banco de dados PostgreSQL, mensageria com Kafka, e uma estrutura de testes robusta.
O projeto segue os princípios da Clean Architecture com separação clara de responsabilidades:
- Entidades (entity/): Contém as regras de negócio fundamentais e estruturas de dados
- Casos de Uso (usecase/): Implementa a lógica de negócio específica da aplicação
- Infraestrutura (infrastructure/): Implementações de repositórios e integrações externas
- Interface (api/): Camada de apresentação com handlers HTTP e middlewares
- Injeção de Dependências: Configurada no
main.gopara baixo acoplamento
- Linguagem: Go 1.21+
- Framework Web: Gin
- Banco de Dados: PostgreSQL com GORM
- Mensageria: Apache Kafka
- Autenticação: JWT (JSON Web Tokens)
- Criptografia: bcrypt para senhas
- Documentação: Swagger/OpenAPI
- Testes: Go testing + Testify + GoConvey
- Containerização: Docker e Docker Compose
- Monitoramento: Elastic APM
Antes de começar, certifique-se de ter instalado:
- Go 1.21+
- Docker
- Docker Compose
- Make (opcional, mas recomendado)
git clone <seu-repositorio>
cd template_golangCopie o arquivo de exemplo de variáveis de ambiente:
make initOu manualmente:
cp src/.env.sample src/.envEdite o arquivo src/.env com suas configurações:
# Configuração de Logging
LOG_LEVEL=DEBUG
GIN_MODE=debug
GORM_LOG_LEVEL=DEBUG
# Banco de Dados
POSTGRES_DB=gotemplate
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=db
POSTGRES_PORT=5432
# Kafka
KAFKA_BOOTSTRAP_SERVER=kafka:9092
KAFKA_CLIENT_ID=gotemplate
KAFKA_GROUP_ID=gotemplate
# JWT
JWT_SECRET_KEY=your-jwt-secret-key-here
# Email (opcional)
EMAIL_HOST=mail
EMAIL_PORT=1025
EMAIL_FROM=noreply@example.com
# Admin padrão
DEFAULT_ADMIN_MAIL=admin@example.com
DEFAULT_ADMIN_PASSWORD=admin123Construa e execute os containers:
make upA aplicação estará disponível em:
# Ver logs da aplicação
make log
# Ver logs de todos os serviços
make logs
# Parar os serviços
make stop
# Executar testes
make test
# Executar testes com cobertura
make coverage
# Executar shell no container
make sh app
# Gerar documentação Swagger
make swaggertemplate_golang/
├── src/ # Código fonte da aplicação
│ ├── api/ # Camada de apresentação
│ │ ├── handlers/ # Handlers HTTP
│ │ └── middleware/ # Middlewares
│ ├── entity/ # Entidades de domínio
│ ├── usecase/ # Casos de uso (lógica de negócio)
│ │ └── user/ # Exemplo: casos de uso de usuário
│ ├── infrastructure/ # Infraestrutura
│ │ ├── postgres/ # Configuração do banco
│ │ └── repository/ # Implementação de repositórios
│ ├── kafka/ # Integração com Kafka
│ ├── pkg/ # Pacotes utilitários
│ │ ├── auth/ # Autenticação e autorização
│ │ ├── logger/ # Sistema de logs
│ │ └── utils/ # Utilitários gerais
│ ├── mocks/ # Mocks para testes
│ └── main.go # Ponto de entrada da aplicação
├── docs/ # Documentação do projeto
├── docker-compose.yml # Configuração do Docker Compose
├── Makefile # Comandos automatizados
└── README.md # Este arquivo
make testmake coveragemake test-watchmake test-watch-web- Defina a entidade em
src/entity/:
// src/entity/entity_produto.go
package entity
import "time"
type Produto struct {
ID uint `json:"id" gorm:"primaryKey"`
Nome string `json:"nome" gorm:"size:100;not null"`
Preco float64 `json:"preco" gorm:"not null"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}- Crie os testes da entidade em
src/entity/entity_produto_test.go
- Defina a interface em
src/usecase/produto/:
// src/usecase/produto/usecase_produto_interface.go
package produto
import "app/entity"
type ProdutoUseCaseInterface interface {
CreateProduto(produto *entity.Produto) (*entity.Produto, error)
GetProduto(id uint) (*entity.Produto, error)
// ... outros métodos
}-
Implemente o serviço em
src/usecase/produto/usecase_produto_service.go -
Crie os testes em
src/usecase/produto/usecase_produto_service_test.go
- Implemente o repositório em
src/infrastructure/repository/:
// src/infrastructure/repository/repository_produto.go
package repository
import (
"app/entity"
"gorm.io/gorm"
)
type ProdutoRepository struct {
db *gorm.DB
}
func NewProdutoRepository(db *gorm.DB) *ProdutoRepository {
return &ProdutoRepository{db: db}
}
func (r *ProdutoRepository) Create(produto *entity.Produto) (*entity.Produto, error) {
if err := r.db.Create(produto).Error; err != nil {
return nil, err
}
return produto, nil
}- Implemente os handlers em
src/api/handlers/:
// src/api/handlers/handlers_produto.go
package handlers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func (h *Handlers) CreateProduto(c *gin.Context) {
// Implementação do handler
}- Registre as rotas em
src/api/api.go
O template inclui um gerador automático de CRUD. Para usá-lo:
# Instalar o gerador
make install_generator
# Gerar novo CRUD
make generator_crudmake dep_install github.com/nova/dependenciamake auto_installmake mod_tidy# Logs mínimos para produção
LOG_LEVEL=WARN
GIN_MODE=release
GORM_LOG_LEVEL=ERROR
# Configurações de segurança
JWT_SECRET_KEY=sua-chave-secreta-super-forte
ISRELEASE=true
# Configurações de banco específicas
POSTGRES_HOST=seu-host-producao
POSTGRES_DB=seu-banco-producao
# ... outras configuraçõesdocker-compose -f docker-compose.yml build --no-cache- Faça um fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Crie um Pull Request
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.
Se você encontrar problemas ou tiver dúvidas:
- Verifique a documentação em
docs/ - Consulte os logs com
make log - Verifique os testes com
make test - Abra uma issue no repositório