Golang HTTP API 骨架实现指南

Golang HTTP API 骨架实现指南 大家好!

我花了一些时间编写了一个用于HTTP API服务的骨架代码库,地址在这里:GitHub - jonmol/http-skeleton。这个项目源于我自身希望简化开发流程并避免重复编写样板代码的需求。它使用了gorilla/mux进行路由,viper/cobra进行配置,并附带了一个简单的Prometheus中间件用于监控、优雅关闭、代码检查配置以及其他一些功能。

我希望它能对更多人有用,但我面临一个困境——代码已经准备好了,但我不确定是否值得投入大量时间编写文档和教程,因为我不知道它是否对他人有用。

因此,我的解决方案是进行一些有针对性的“喊话”,比如在这里。

目前它缺少的一点是代码审查,任何意见都将不胜感激。无论是为了改进这个骨架项目,还是为了学习。


更多关于Golang HTTP API 骨架实现指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang HTTP API 骨架实现指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常实用的HTTP API骨架项目,结构清晰且包含了生产级服务所需的核心组件。以下是一些技术层面的观察和改进建议,附带示例代码说明:

1. 路由组注册优化 当前路由注册分散在多个地方,建议集中管理路由组,提高可维护性:

// internal/api/v1/router.go
func RegisterRoutes(r *mux.Router, deps *Dependencies) {
    api := r.PathPrefix("/api/v1").Subrouter()
    api.Use(middleware.Auth) // 统一中间件
    
    api.HandleFunc("/users", deps.UserHandler.List).Methods("GET")
    api.HandleFunc("/users/{id}", deps.UserHandler.Get).Methods("GET")
}

2. 配置验证增强 添加配置结构体验证,避免运行时错误:

// config/config.go
type Config struct {
    Server struct {
        Port int `mapstructure:"port" validate:"required,min=1024,max=65535"`
        ShutdownTimeout time.Duration `mapstructure:"shutdown_timeout" validate:"required"`
    }
}

func (c *Config) Validate() error {
    if c.Server.Port == 0 {
        return errors.New("server port is required")
    }
    return nil
}

3. 依赖注入改进 使用wire或fx实现编译期依赖注入,减少手动初始化代码:

// internal/di/wire.go
var ProviderSet = wire.NewSet(
    provideConfig,
    provideDatabase,
    provideRepositories,
    provideHandlers,
)

func InitializeApp() (*App, error) {
    wire.Build(ProviderSet, NewApp)
    return &App{}, nil
}

4. 健康检查端点扩展 添加数据库连接状态检查:

// internal/api/health/handler.go
func (h *Handler) Check(w http.ResponseWriter, r *http.Request) {
    status := map[string]string{
        "server": "ok",
        "database": h.checkDatabase(),
        "cache": h.checkCache(),
    }
    
    json.NewEncoder(w).Encode(status)
}

func (h *Handler) checkDatabase() string {
    if err := h.db.Ping(); err != nil {
        return "unhealthy"
    }
    return "healthy"
}

5. 错误处理统一化 实现标准错误响应格式:

// internal/api/errors.go
type ErrorResponse struct {
    Code    int    `json:"code"`
    Message string `json:"message"`
    Details any    `json:"details,omitempty"`
}

func WriteError(w http.ResponseWriter, code int, err error) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(code)
    
    json.NewEncoder(w).Encode(ErrorResponse{
        Code:    code,
        Message: err.Error(),
    })
}

6. 中间件链优化 使用alice简化中间件组合:

// cmd/server/main.go
import "github.com/justinas/alice"

middlewareChain := alice.New(
    middleware.Logging,
    middleware.Recovery,
    middleware.Prometheus,
    middleware.CORS,
)

router := mux.NewRouter()
middlewareChain.Then(router)

7. 数据库迁移集成 添加迁移命令到cobra:

// cmd/migrate/migrate.go
var migrateCmd = &cobra.Command{
    Use:   "migrate",
    Short: "Run database migrations",
    RunE: func(cmd *cobra.Command, args []string) error {
        db, _ := sql.Open("postgres", config.DatabaseURL)
        return goose.Up(db, "./migrations")
    },
}

8. 请求ID追踪 增强请求追踪能力:

// internal/middleware/request_id.go
func RequestID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        id := r.Header.Get("X-Request-ID")
        if id == "" {
            id = uuid.New().String()
        }
        
        ctx := context.WithValue(r.Context(), "request_id", id)
        w.Header().Set("X-Request-ID", id)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

这个骨架项目已经具备了良好的基础架构,上述建议主要围绕可维护性、可观测性和生产就绪性进行增强。项目结构符合Go最佳实践,gorilla/mux和viper/cobra的选择也很合适。

回到顶部