A production-ready microservices boilerplate built with Go, implementing Clean Architecture principles with comprehensive testing, security, and documentation.
graph TB
subgraph "External Layer"
UI[Web UI]
API[REST API]
DB[(PostgreSQL)]
end
subgraph "Infrastructure Layer"
Controllers[REST Controllers]
Repositories[Repositories]
Security[JWT Security]
Logger[Structured Logging]
end
subgraph "Application Layer"
AuthUC[Auth Use Cases]
UserUC[User Use Cases]
MedicineUC[Medicine Use Cases]
end
subgraph "Domain Layer"
Entities[Domain Entities]
Rules[Business Rules]
Errors[Domain Errors]
end
UI --> API
API --> Controllers
Controllers --> AuthUC
Controllers --> UserUC
Controllers --> MedicineUC
AuthUC --> Entities
UserUC --> Entities
MedicineUC --> Entities
Repositories --> DB
AuthUC --> Repositories
UserUC --> Repositories
MedicineUC --> Repositories
Security --> AuthUC
Logger --> Controllers
Logger --> Repositories
graph LR
subgraph "Dependencies Point Inward"
A[Infrastructure] --> B[Application]
B --> C[Domain]
A --> C
end
subgraph "Domain is Independent"
C --> D[No External Dependencies]
end
- Go 1.24.2+
- Docker & Docker Compose
- PostgreSQL (via Docker)
# Clone the repository
git clone https://github.com/gbrayhan/microservices-go
cd microservices-go
# Copy environment file
cp .env.example .env
# Start services
docker-compose up --build -d
# Check if services are running
docker-compose ps
# Test the API
curl http://localhost:8080/v1/health
- Clean Architecture: Fully implemented with dependency inversion
- JWT Authentication: Secure token-based authentication
- Structured Logging: Zap logger with correlation IDs
- Comprehensive Testing: Unit, integration, and acceptance tests
- API Documentation: Complete REST API documentation
- Error Handling: Centralized error management
- Validation: Request validation with custom rules
- Search & Pagination: Advanced search capabilities
- Framework: Gin-Gonic (HTTP router)
- Database: PostgreSQL with GORM
- Authentication: JWT with refresh tokens
- Logging: Zap structured logger
- Testing: Go testing + Cucumber integration tests
- Documentation: Comprehensive API documentation
- Containerization: Docker & Docker Compose
- Code Quality: golangci-lint, CodeFactor, Codacy
microservices-go/
βββ src/
β βββ domain/ # π― Domain Layer (Entities & Business Rules)
β βββ application/ # π Application Layer (Use Cases)
β βββ infrastructure/ # π§ Infrastructure Layer
β βββ di/ # Dependency Injection
β βββ repository/ # Data Access Layer
β βββ rest/ # HTTP Controllers
β βββ security/ # JWT & Security
β βββ logger/ # Structured Logging
βββ Test/
β βββ integration/ # Integration Tests
βββ docs/ # Documentation
βββ docker-compose.yml # Development Environment
# Run the application
go run main.go
# Run tests
go test ./...
# Run tests with coverage
./coverage.sh
# Run integration tests
./Test/integration/run-integration-test.bash
# Lint code
golangci-lint run ./...
# Security scan
trivy fs .
sequenceDiagram
participant Client
participant AuthController
participant AuthUseCase
participant UserRepository
participant JWTService
participant Database
Client->>AuthController: POST /auth/login
AuthController->>AuthUseCase: Login(email, password)
AuthUseCase->>UserRepository: GetByEmail(email)
UserRepository->>Database: SELECT * FROM users
Database-->>UserRepository: User data
UserRepository-->>AuthUseCase: User entity
AuthUseCase->>AuthUseCase: Validate password
AuthUseCase->>JWTService: Generate tokens
JWTService-->>AuthUseCase: Access + Refresh tokens
AuthUseCase-->>AuthController: User + Tokens
AuthController-->>Client: 200 OK + Tokens
stateDiagram-v2
[*] --> Authenticated
Authenticated --> TokenExpired: Access token expires
TokenExpired --> Refreshing: Send refresh token
Refreshing --> Authenticated: New tokens received
Refreshing --> Unauthorized: Invalid refresh token
Unauthorized --> [*]: Re-login required
Authenticated --> [*]: Logout
POST /v1/auth/login
- User loginPOST /v1/auth/access-token
- Refresh access token
GET /v1/user
- Get all usersPOST /v1/user
- Create userGET /v1/user/:id
- Get user by IDPUT /v1/user/:id
- Update userDELETE /v1/user/:id
- Delete userGET /v1/user/search
- Search users with paginationGET /v1/user/search-property
- Search by specific property
GET /v1/medicine
- Get all medicinesPOST /v1/medicine
- Create medicineGET /v1/medicine/:id
- Get medicine by IDPUT /v1/medicine/:id
- Update medicineDELETE /v1/medicine/:id
- Delete medicineGET /v1/medicine/search
- Search medicines with paginationGET /v1/medicine/search-property
- Search by specific property
graph TB
subgraph "Test Pyramid"
E2E[End-to-End Tests<br/>Cucumber Integration]
Integration[Integration Tests<br/>API Testing]
Unit[Unit Tests<br/>Use Cases & Controllers]
end
E2E --> Integration
Integration --> Unit
# Run all tests with coverage
./coverage.sh
# Expected coverage: β₯ 80%
- JWT Authentication: Access and refresh tokens
- Password Hashing: bcrypt with salt
- CORS Configuration: Cross-origin resource sharing
- Input Validation: Request sanitization
- Error Handling: No sensitive data exposure
- Security Headers: XSS protection, content security policy
{
"level": "info",
"timestamp": "2024-01-01T00:00:00Z",
"message": "User login successful",
"user_id": 123,
"email": "[email protected]",
"correlation_id": "req-123-456",
"service": "auth-service"
}
# Health endpoint
GET /v1/health
# Response
{
"status": "healthy",
"timestamp": "2024-01-01T00:00:00Z",
"version": "1.0.0"
}
# Build production image
docker build -t microservices-go .
# Run with environment variables
docker run -p 8080:8080 \
-e DB_HOST=postgres \
-e DB_PORT=5432 \
-e JWT_ACCESS_SECRET=your_secret \
microservices-go
# Server Configuration
SERVER_PORT=8080
GO_ENV=production
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=microservices_go
# JWT Configuration
JWT_ACCESS_SECRET=your_access_secret
JWT_REFRESH_SECRET=your_refresh_secret
JWT_ACCESS_TIME_MINUTE=60
JWT_REFRESH_TIME_HOUR=24
- Clean Architecture Guide - Detailed architecture documentation
- API Search Endpoints - Search and pagination features
- Complete API Documentation - Full API reference
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- Follow Clean Architecture principles
- Write tests for new features
- Maintain β₯ 80% test coverage
- Use conventional commit messages
- Update documentation for API changes
This project is licensed under the MIT License - see the LICENSE file for details.
- Issues: GitHub Issues
- Documentation: Wiki
- Discussions: GitHub Discussions
- β Implemented Clean Architecture
- β Added comprehensive search and pagination
- β Enhanced error handling and logging
- β Improved test coverage and quality
- β Added integration tests with Cucumber
- β Updated all documentation to English
- β Added architecture diagrams and flow charts
- β Initial microservices structure
- β Basic CRUD operations
- β JWT authentication
- β PostgreSQL integration