Architecture Overview
Goose follows a modular, layered architecture that promotes separation of concerns and maintainability.
High-Level Architecture
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Application β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Platform Layer β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β API β β Web β β CLI β β
β β Platform β β Platform β β Platform β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Module Layer β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Users β β Products β β Orders β β
β β Module β β Module β β Module β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Core Layer β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Kernel β β Router β βContainer β βTraverser β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Infrastructure Layer β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β SQL β β Cache β β Queue β β Cron β β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Core Components
Kernel
The kernel is the heart of Goose. It orchestrates:
- Application bootstrapping
- Module traversal
- Route registration
- Request handling
// The kernel starts your application
stop, err := goose.Start(goose.API(platform, module, initializers))
Container (IoC)
The dependency injection container:
- Registers services
- Resolves dependencies
- Manages singletons
// Services are automatically injected
type UserController struct {
service *UserService `inject:""`
log types.Log `inject:""`
cache *cache.Cache `inject:""`
}
Router
The router matches incoming requests to handlers:
- Method-based routing (GET, POST, etc.)
- Parameter extraction (
:id) - Middleware aggregation
- Route caching for performance
Traverser
The traverser walks the module tree:
- Discovers modules
- Registers declarations
- Handles imports/exports
- Executes lifecycle hooks
Request Flow
Request
β
βΌ
βββββββββββββββββββ
β Platform β β Receives HTTP/CLI request
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Router β β Finds matching route
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Middleware β β Executes middleware chain
β Stack β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Controller β β Handles the request
β Handler β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Service β β Business logic
β Layer β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Response β β Sends response
β Serializer β
βββββββββββββββββββ
Module System
Modules are the building blocks of Goose applications:
type Module interface {
Imports() []Module // Dependencies
Exports() []any // Public services
Declarations() []any // Local components
}
Module Lifecycle
- Import Resolution - Resolve module dependencies
- Declaration Registration - Register controllers, services
- Export Publishing - Make services available
- Hook Execution - Run lifecycle hooks
Platform Abstraction
Goose supports multiple platforms through a unified interface:
type Platform interface {
Type() PlatformType
Name() string
Boot(container Container) (App, error)
}
API Platform
Handles HTTP requests, returns JSON responses.
Web Platform
Handles HTTP requests, renders HTML templates.
CLI Platform
Handles command-line arguments, outputs to console.
Design Patterns
Dependency Injection
All dependencies are injected automatically:
type OrderService struct {
userService *UserService `inject:""`
productService *ProductService `inject:""`
db *sql.Db `inject:""`
}
Repository Pattern
Data access through repositories:
type UserRepository struct {
db *sql.Db `inject:""`
}
func (r *UserRepository) FindByID(id string) (*User, error) {
// Database query
}
Service Layer
Business logic in services:
type OrderService struct {
repo *OrderRepository `inject:""`
}
func (s *OrderService) CreateOrder(data CreateOrderDTO) (*Order, error) {
// Business logic
}
Controller Layer
Request handling in controllers:
type OrderController struct {
service *OrderService `inject:""`
}
func (c *OrderController) Create(ctx types.Context) any {
var dto CreateOrderDTO
ctx.Bind(&dto)
return c.service.CreateOrder(dto)
}
Configuration Architecture
Environment Variables (.env)
β
βΌ
βββββββββββββββββββ
β Env Package β β Loads env vars
ββββββββββ¬βββββββββ
β
βΌ
YAML Files (config/*.yaml)
β
βΌ
βββββββββββββββββββ
β Config Package β β Parses YAML
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Container β β Injects config
βββββββββββββββββββ
Next Steps
- Modules - Deep dive into modules
- Dependency Injection - IoC container
- Lifecycle - Application lifecycle