Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

seakee/go-api

Repository files navigation

Go-API Framework

Languages: English | 中文


Overview

go-api is a powerful, high-performance Go framework designed for building enterprise-grade web APIs. It provides a complete solution with layered architecture, dependency injection, comprehensive middleware support, and automatic code generation capabilities.

Key Features

  • 🚀 High Performance: Built on Gin framework with optimized logging and database connections
  • 🏗️ Layered Architecture: Strict Model → Repository → Service → Controller pattern
  • 🔧 Dependency Injection: Clean architecture with proper separation of concerns
  • ⚙️ Configuration Management: Multi-environment support with JSON-based configuration
  • 📝 Advanced Logging: Structured logging with Zap for high performance
  • 🗄️ Multi-Database Support: MySQL, PostgreSQL, SQLite, SQL Server, ClickHouse (via xdb/GORM) and MongoDB (qmgo)
  • 🔐 JWT Authentication: Built-in app authentication with JWT tokens
  • 🌐 Internationalization: Multi-language support (zh-CN, en-US)
  • 📊 Middleware System: CORS, authentication, request logging, and custom middleware
  • Code Generation: Automatic model and repository generation from SQL files
  • 🔄 Task Scheduling: Built-in job scheduling system
  • 📨 Message Queue: Kafka producer/consumer support
  • 🚨 Monitoring: Panic recovery with notification integration
  • 🐳 Docker Ready: Complete Docker support with optimized images

Quick Start

Method 1: Using Project Generator Script

# Download the project generator
curl -O https://raw.githubusercontent.com/seakee/go-api/main/scripts/generate.sh
chmod +x generate.sh
# Generate a new project
./generate.sh my-api-project v1.0.0
cd my-api-project
# Install dependencies and run
go mod tidy
make run

Method 2: Clone and Customize

# Clone the repository
git clone https://github.com/seakee/go-api.git
cd go-api
# Install dependencies
go mod download
# Copy and configure local settings
cp bin/configs/local.json.default bin/configs/local.json
# Edit bin/configs/local.json with your database settings
# Run the application
make run

Architecture Overview

go-api/
├── app/ # Application layer
│ ├── config/ # Configuration management
│ │ └── config.go # Config loader and structures
│ ├── http/ # HTTP layer
│ │ ├── controller/ # HTTP controllers
│ │ │ ├── auth/ # Authentication controllers
│ │ │ │ ├── app.go # App CRUD operations
│ │ │ │ ├── handler.go # Auth handler interface
│ │ │ │ └── jwt.go # JWT token operations
│ │ │ └── base.go # Base controller
│ │ ├── middleware/ # HTTP middleware
│ │ │ ├── check_app_auth.go # JWT authentication
│ │ │ ├── cors.go # CORS handling
│ │ │ ├── handler.go # Middleware interface
│ │ │ ├── request_logger.go # Request logging
│ │ │ └── set_trace_id.go # Trace ID injection
│ │ ├── router/ # Route definitions
│ │ │ ├── external/ # External API routes
│ │ │ │ └── service/ # External service routes
│ │ │ │ └── auth/ # Auth endpoints
│ │ │ ├── internal/ # Internal API routes
│ │ │ │ └── service/ # Internal service routes
│ │ │ │ └── auth/ # Auth endpoints
│ │ │ └── handler.go # Main router
│ │ └── context.go # HTTP context wrapper
│ ├── model/ # Data models
│ │ └── auth/ # Authentication models
│ │ ├── app.go # App model (MySQL)
│ │ └── app_mgo.go # App model (MongoDB)
│ ├── pkg/ # Utility packages
│ │ ├── e/ # Error codes
│ │ │ └── code.go # Error code definitions
│ │ ├── jwt/ # JWT utilities
│ │ │ └── jwt.go # JWT generation/parsing
│ │ ├── schedule/ # Task scheduling
│ │ │ └── schedule.go # Job scheduler
│ │ └── trace/ # Distributed tracing
│ │ └── trace.go # Trace ID generation
│ ├── repository/ # Data access layer
│ │ └── auth/ # Auth repository
│ │ └── app.go # App repository
│ ├── service/ # Business logic layer
│ │ └── auth/ # Auth services
│ │ └── app.go # App service
│ └── worker/ # Background workers
│ └── handler.go # Worker handler
├── bin/ # Runtime resources
│ ├── configs/ # Configuration files
│ │ ├── dev.json # Development config
│ │ ├── local.json # Local config
│ │ └── prod.json # Production config
│ ├── data/ # Data files
│ │ └── sql/ # SQL scripts
│ │ └── auth_app.sql # App table schema
│ └── lang/ # Language files
│ ├── en-US.json # English messages
│ └── zh-CN.json # Chinese messages
├── bootstrap/ # Application bootstrap
│ ├── app.go # Main app initialization
│ ├── database.go # Database setup
│ ├── http.go # HTTP server setup
│ ├── kafka.go # Kafka setup
│ └── schedule.go # Scheduler setup
├── command/ # CLI commands
│ └── codegen/ # Code generator
│ ├── codegen/ # Generator logic
│ ├── handler.go # CLI handler
│ └── README.md # Generator docs
├── scripts/ # Utility scripts
│ └── generate.sh # Project generator
├── docs/ # Project documentation
│ ├── Home.md # Wiki homepage (English)
│ ├── Home-zh.md # Wiki homepage (Chinese)
│ ├── Architecture-Design.md # Architecture documentation
│ ├── Development-Guide.md # Development workflow guide
│ ├── API-Documentation.md # Complete API reference
│ ├── Code-Generator-Guide.md # Code generation tool guide
│ └── Deployment-Guide.md # Production deployment guide
├── Dockerfile # Docker configuration
├── Makefile # Build automation
├── docker-compose.yml # Docker Compose
├── go.mod # Go module
├── go.sum # Dependencies
└── main.go # Application entry point

Core Components

1. Layered Architecture

The framework follows a strict 4-layer architecture:

  • Model Layer: Data structures and database operations
  • Repository Layer: Data access abstraction with interfaces
  • Service Layer: Business logic implementation
  • Controller Layer: HTTP request handling and response formatting

2. Configuration Management

Supports multiple environments with JSON-based configuration:

{
 "system": {
 "name": "go-api",
 "run_mode": "debug",
 "http_port": ":8080",
 "jwt_secret": "your-secret-key"
 },
 "databases": [
 {
 "enable": true,
 "db_type": "mysql",
 "db_name": "go-api",
 "db_host": "localhost",
 "db_port": 3306,
 "charset": "utf8mb4",
 "conn_max_lifetime": 3
 }
 ]
}

3. Middleware System

Built-in middleware for common functionality:

  • Authentication: JWT-based app authentication
  • CORS: Cross-origin resource sharing
  • Logging: Structured request/response logging
  • Trace ID: Distributed tracing support
  • Panic Recovery: Automatic panic recovery with notifications

4. Authentication System

Complete JWT-based authentication:

# Get JWT token
curl -X POST http://localhost:8080/go-api/external/service/auth/token \
 -d "app_id=your_app_id&app_secret=your_app_secret"
# Use token in requests
curl -H "Authorization: your_jwt_token" \
 http://localhost:8080/go-api/external/service/auth/app

Development Guide

Adding a New Controller

  1. Create controller structure:
// app/http/controller/user/handler.go
package user
import (
 "github.com/gin-gonic/gin"
 "github.com/seakee/go-api/app/http"
)
type Handler interface {
 Create() gin.HandlerFunc
 GetByID() gin.HandlerFunc
}
type handler struct {
 controller.BaseController
 service userService.UserService
}
func NewHandler(appCtx *http.Context) Handler {
 return &handler{
 BaseController: controller.BaseController{
 AppCtx: appCtx,
 Logger: appCtx.Logger,
 Redis: appCtx.Redis["go-api"],
 I18n: appCtx.I18n,
 },
 service: userService.NewUserService(appCtx.SqlDB["go-api"], appCtx.Redis["go-api"]),
 }
}
  1. Register routes:
// app/http/router/external/service/user/user.go
func RegisterRoutes(api *gin.RouterGroup, ctx *http.Context) {
 userHandler := user.NewHandler(ctx)
 {
 api.POST("user", ctx.Middleware.CheckAppAuth(), userHandler.Create())
 api.GET("user/:id", userHandler.GetByID())
 }
}

Adding Middleware

  1. Define in interface:
// app/http/middleware/handler.go
type Middleware interface {
 CheckAppAuth() gin.HandlerFunc
 YourNewMiddleware() gin.HandlerFunc // Add this
}
  1. Implement middleware:
// app/http/middleware/your_middleware.go
func (m middleware) YourNewMiddleware() gin.HandlerFunc {
 return func(c *gin.Context) {
 // Your middleware logic
 c.Next()
 }
}

Code Generation

Generate models and repositories from SQL files:

# Generate from SQL file
go run ./command/codegen/handler.go -name user_table
# Generate all SQL files
go run ./command/codegen/handler.go
# Custom paths
go run ./command/codegen/handler.go -sql custom/sql -model custom/model

SQL file format:

CREATE TABLE `users` (
 `id` int NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
 `username` varchar(50) NOT NULL COMMENT 'Username',
 `email` varchar(100) NOT NULL COMMENT 'Email Address',
 `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'Status',
 `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
 `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='User Information';

API Endpoints

External APIs (Public)

Method Endpoint Description Auth Required
POST /go-api/external/service/auth/token Get JWT token No
POST /go-api/external/service/auth/app Create app Yes
GET /go-api/external/service/ping Health check No

Internal APIs (Private)

Method Endpoint Description Auth Required
POST /go-api/internal/service/auth/token Get JWT token No
POST /go-api/internal/service/auth/app Create app Yes
GET /go-api/internal/service/ping Health check No

Docker Deployment

Using Docker Compose

# docker-compose.yml
version: '3.8'
services:
 go-api:
 build: .
 ports:
 - "8080:8080"
 volumes:
 - ./bin/configs:/bin/configs
 - ./bin/logs:/bin/logs
 environment:
 - RUN_ENV=prod
 - APP_NAME=go-api
 depends_on:
 - mysql
 - redis
 mysql:
 image: mysql:8.0
 environment:
 MYSQL_ROOT_PASSWORD: password
 MYSQL_DATABASE: go-api
 ports:
 - "3306:3306"
 redis:
 image: redis:7-alpine
 ports:
 - "6379:6379"

Build and Run

# Build Docker image
make docker-build
# Run with Docker Compose
docker-compose up -d
# Run single container
make docker-run

Build Commands

# Development
make run # Run application
make test # Run tests
make fmt # Format code
make all # fmt + test + build
# Production
make build # Build binary
make docker-build # Build Docker image
make docker-run # Run Docker container

Environment Variables

Variable Description Default
RUN_ENV Runtime environment local
APP_NAME Application name go-api
CONFIG_DIR Configuration directory ./bin/configs

Documentation

Complete project documentation is available in the docs/ directory:

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/new-feature
  3. Commit changes: git commit -am 'Add new feature'
  4. Push to branch: git push origin feature/new-feature
  5. Submit a Pull Request

See Contributing Guide for more details.

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Go-API is a simple, powerful, and high-performance Go framework for building web APIs.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /