golang微服务开发框架插件GoFr的使用

GoFr: 一个面向微服务开发的Golang框架

GoFr是一个专为简化微服务开发而设计的Golang框架,专注于Kubernetes部署和开箱即用的可观测性。

GoFr Logo

主要特性

  1. 简单的API语法
  2. 默认遵循REST标准
  3. 配置管理
  4. 可观测性(日志、追踪、指标)
  5. 内置认证中间件和自定义中间件支持
  6. gRPC支持
  7. 带有熔断器支持的HTTP服务
  8. 发布/订阅模式
  9. 所有数据源的健康检查
  10. 数据库迁移
  11. 定时任务
  12. 无需重启即可更改日志级别
  13. Swagger文档生成
  14. 抽象文件系统
  15. WebSocket支持

快速开始

安装

首先确保你安装了Go 1.24或更高版本。

导入GoFr包:

import "gofr.dev/pkg/gofr"

或者使用命令安装:

go get -u gofr.dev/pkg/gofr

基本示例

下面是一个简单的GoFr应用示例:

package main

import "gofr.dev/pkg/gofr"

func main() {
    // 创建一个新的GoFr应用
    app := gofr.New()

    // 定义GET路由
    app.GET("/greet", func(ctx *gofr.Context) (any, error) {
        return "Hello World!", nil
    })

    // 启动服务,默认监听localhost:8000
    app.Run()
}

运行应用:

go run main.go

访问localhost:8000/greet即可看到"Hello World!"响应。

更复杂的示例

下面是一个包含数据库操作和中间件的完整示例:

package main

import (
    "gofr.dev/pkg/gofr"
    "gofr.dev/pkg/gofr/datasource/sql"
)

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func main() {
    app := gofr.New()

    // 添加MySQL数据库配置(通常来自环境变量或配置文件)
    app.AddDatabase(sql.New("mysql", app.Config))

    // 使用中间件
    app.Use(func(ctx *gofr.Context) {
        // 记录请求信息
        ctx.Logger.Info("Request received: ", ctx.Path)
        ctx.Next()
    })

    // 用户路由组
    userRoutes := app.Group("/users")
    {
        userRoutes.GET("/", getUsers)
        userRoutes.POST("/", createUser)
        userRoutes.GET("/:id", getUserByID)
    }

    app.Run()
}

func getUsers(ctx *gofr.Context) (any, error) {
    var users []User
    
    // 使用GoFr的SQL抽象层查询数据库
    err := ctx.DB().Query(ctx, "SELECT id, name FROM users", &users)
    if err != nil {
        return nil, err
    }
    
    return users, nil
}

func createUser(ctx *gofr.Context) (any, error) {
    var user User
    if err := ctx.Bind(&user); err != nil {
        return nil, err
    }

    // 插入新用户
    _, err := ctx.DB().Exec(ctx, "INSERT INTO users(name) VALUES(?)", user.Name)
    if err != nil {
        return nil, err
    }

    return "User created successfully", nil
}

func getUserByID(ctx *gofr.Context) (any, error) {
    id := ctx.PathParam("id")
    var user User
    
    err := ctx.DB().QueryRow(ctx, "SELECT id, name FROM users WHERE id = ?", id).Scan(&user.ID, &user.Name)
    if err != nil {
        return nil, err
    }
    
    return user, nil
}

贡献

欢迎为GoFr项目做出贡献!你可以:

  1. 在GitHub上给项目加星
  2. 撰写教程或文章
  3. 提交Pull Request帮助改进项目

GoFr已被列入CNCF Landscape,是一个值得关注的微服务开发框架。


更多关于golang微服务开发框架插件GoFr的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang微服务开发框架插件GoFr的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoFr框架使用指南

GoFr是一个轻量级的Go语言微服务开发框架,由Gojek团队开发并开源。它提供了构建微服务所需的核心功能,同时保持简单和高效。下面我将介绍GoFr的主要特性及其使用方法。

主要特性

  1. 内置HTTP服务器:基于标准库net/http的增强实现
  2. 依赖注入:简化服务间依赖管理
  3. 配置管理:支持多种配置源
  4. 健康检查:内置健康检查端点
  5. 日志系统:结构化日志输出
  6. 中间件支持:灵活的中间件机制
  7. 数据库支持:内置MySQL、PostgreSQL等数据库客户端

基础使用

安装

go get github.com/gofr-dev/gofr

简单HTTP服务示例

package main

import (
	"github.com/gofr-dev/gofr"
)

func main() {
	// 创建GoFr应用实例
	app := gofr.New()
	
	// 添加GET路由
	app.GET("/hello", func(c *gofr.Context) (interface{}, error) {
		return "Hello, World!", nil
	})
	
	// 启动服务,默认监听8000端口
	app.Run()
}

核心功能详解

1. 配置管理

GoFr支持多种配置源,包括环境变量、YAML文件和命令行参数。

app := gofr.New()

// 获取配置值
dbHost := app.Config.Get("DB_HOST")
dbPort := app.Config.Get("DB_PORT")

2. 依赖注入

type Service struct {
	Logger *gofr.Logger
}

func (s *Service) GetData() string {
	s.Logger.Info("Fetching data")
	return "sample data"
}

func main() {
	app := gofr.New()
	
	// 注册服务
	app.Dependency(&Service{Logger: app.Logger})
	
	app.GET("/data", func(c *gofr.Context) (interface{}, error) {
		var service *Service
		if err := c.GetService(&service); err != nil {
			return nil, err
		}
		
		return service.GetData(), nil
	})
	
	app.Run()
}

3. 数据库集成

app := gofr.New()

// 使用MySQL
db, err := app.MySQL()
if err != nil {
	app.Logger.Error("Failed to connect to MySQL:", err)
	return
}

app.GET("/users", func(c *gofr.Context) (interface{}, error) {
	var users []User
	err := db.SelectContext(c.Context, &users, "SELECT * FROM users")
	if err != nil {
		return nil, err
	}
	
	return users, nil
})

4. 中间件

func loggingMiddleware(next gofr.Handler) gofr.Handler {
	return func(c *gofr.Context) (interface{}, error) {
		c.Logger.Info("Request received: ", c.Request.Method, " ", c.Request.URL.Path)
		return next(c)
	}
}

func main() {
	app := gofr.New()
	
	// 全局中间件
	app.Use(loggingMiddleware)
	
	// 路由级别中间件
	app.GET("/secure", authMiddleware, func(c *gofr.Context) (interface{}, error) {
		return "Secure content", nil
	})
	
	app.Run()
}

5. 健康检查

GoFr自动提供以下健康检查端点:

  • /health - 应用健康状态
  • /health/ready - 就绪检查
  • /health/live - 存活检查

高级功能

自定义健康检查

app := gofr.New()

// 添加自定义健康检查
app.AddHealthCheck("database", func() bool {
	// 检查数据库连接
	return true
})

app.AddHealthCheck("cache", func() bool {
	// 检查缓存连接
	return true
})

事件发布/订阅

app := gofr.New()

// 发布事件
app.PublishEvent("order.created", map[string]interface{}{
	"order_id": "123",
	"amount":   100.50,
})

// 订阅事件
app.Subscribe("order.created", func(event *gofr.Event) {
	app.Logger.Infof("Received order created event: %v", event.Payload)
})

最佳实践

  1. 项目结构

    /project
      ├── cmd/
      │   └── server/
      │       └── main.go
      ├── pkg/
      │   ├── handlers/
      │   ├── services/
      │   └── models/
      ├── configs/
      └── go.mod
    
  2. 错误处理

    app.GET("/user/:id", func(c *gofr.Context) (interface{}, error) {
        id := c.Param("id")
        if id == "" {
            return nil, gofr.Error("ID is required", gofr.ErrMissingParam)
        }
        
        user, err := getUser(id)
        if err != nil {
            return nil, gofr.Error("Failed to get user", err)
        }
        
        return user, nil
    })
    
  3. 日志记录

    app.Logger.Info("Application started")
    app.Logger.Debug("Debug information")
    app.Logger.Error("Error occurred", err)
    

总结

GoFr是一个功能齐全但保持简洁的微服务框架,特别适合需要快速开发但又不失灵活性的项目。它的设计哲学是"约定优于配置",提供了合理的默认值,同时允许开发者在需要时进行自定义。

通过内置的健康检查、配置管理、依赖注入等功能,GoFr可以帮助开发者专注于业务逻辑而非基础设施代码。对于中小型微服务项目,GoFr是一个值得考虑的选择。

回到顶部