Golang包评估与使用指南

Golang包评估与使用指南 我们将为客户开发用于生产环境的 Go REST API 和 gRPC。我们发现了一些库和包。

REST 服务 (HTTPS):

  1. 标准库 - Go 包
  2. Gin 框架
  3. Gorilla/Mux
  4. Go kit

测试用例框架:

  1. testing package - testing - Go Packages
  2. GitHub - stretchr/testify: A toolkit with common assertions and mocks that plays nicely with the standard library

HTTP 负载测试:Jmeter 和 Vegeta。

gRPC:grpc package - google.golang.org/grpc - Go Packages

负载测试工具:GitHub - bojand/ghz: Simple gRPC benchmarking and load testing tool

请推荐最佳的框架和库。

提前感谢!期待您的回复。


更多关于Golang包评估与使用指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好!我会尽量说得更客观一些。通常,对于小型或“中等”规模的项目,我倾向于避免使用Web框架,因为当你引入一个Web框架时,你就在为长期运行的计划引入更多关于维护/错误的风险、更多的依赖(这意味着更重的负担和配置调整),并且,至少在开始使用某个特定Web框架的初期,需要花费一定时间去学习它的使用方法

  • 对于小型/简单的项目,我会选择Go标准库 + 标准库的 http.ServeMux + Go测试工具(你列出的第4、5、6点是有效的)。以及gRPC的官方Go包。
  • 对于更复杂的项目,我或多或少会使用相同的技术栈,只是将 http.ServeMux 替换为 chi router(尤其适合中间件密集型的应用),并且,如果你确实需要,引入 gorm。我只有在应用程序规模很大、使用纯Go代码会导致结构复杂时,或者当你需要Gin的某些特定功能时,才会使用Gin。

那么,为什么不推荐 gorilla/mux 呢?在我看来,gorilla实际上维护得并不好,而 httprouter 则完全无人维护,请记住Gin是构建在 httprouter 之上的。

作为一种替代方案,我会使用Fiber框架,它构建在 fasthttp 之上,性能比Gin和其他框架高得多,非常简洁,但它与 net/http 不兼容。因此,如果你的服务需要一些特定的与 net/http 相关的项目,例如 go-swagger,你就必须考虑到这一点。这是另一种选择,但它非常有趣且易于使用。它或多或少像是Go语言中的Express。slight_smile

更多关于Golang包评估与使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于生产环境的Go REST API和gRPC服务,以下是我的推荐:

REST框架选择:

  1. Gin框架 - 性能优异,中间件生态丰富,适合大多数REST API场景
// Gin示例
package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/api/users", func(c *gin.Context) {
        c.JSON(200, gin.H{"message": "获取用户列表"})
    })
    r.Run(":8080")
}
  1. 标准库net/http - 如果需求简单,无需复杂路由和中间件
// 标准库示例
package main

import (
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello World"))
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

测试框架:

  1. 标准库testing - 基础单元测试
// testing示例
package main

import "testing"

func Add(a, b int) int {
    return a + b
}

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    if result != 5 {
        t.Errorf("期望5, 得到%d", result)
    }
}
  1. testify - 复杂测试场景,提供更好的断言和mock支持
// testify示例
import (
    "testing"
    "github.com/stretchr/testify/assert"
)

func TestAddWithTestify(t *testing.T) {
    result := Add(2, 3)
    assert.Equal(t, 5, result, "它们应该相等")
}

gRPC实现: 使用官方grpc包,这是最稳定和功能完整的选择:

// gRPC服务端示例
package main

import (
    "context"
    "net"
    "google.golang.org/grpc"
)

type server struct {
    pb.UnimplementedYourServiceServer
}

func (s *server) YourMethod(ctx context.Context, req *pb.Request) (*pb.Response, error) {
    return &pb.Response{Message: "处理完成"}, nil
}

func main() {
    lis, _ := net.Listen("tcp", ":50051")
    s := grpc.NewServer()
    pb.RegisterYourServiceServer(s, &server{})
    s.Serve(lis)
}

负载测试工具:

  • REST API: Vegeta - Go编写,易于集成到CI/CD
  • gRPC: ghz - 专门为gRPC设计的性能测试工具

推荐组合:

  • REST API: Gin框架 + 标准库testing/testify
  • gRPC: 官方grpc包 + ghz负载测试
  • 两者都使用标准库的context进行超时和取消控制

这个组合提供了良好的性能、可维护性和生产就绪性。Gin在保持高性能的同时提供了丰富的功能,而官方grpc包确保了协议兼容性和稳定性。测试工具的选择取决于具体需求,testify在需要复杂断言和mock时更有优势。

回到顶部