这是我在青训营的第三篇笔记。在这篇笔记中,我会讲述自己对Go框架三件套的理解和使用情况。
近些年来,Go语言作为一门简洁高效的编程语言,受到了越来越多开发者的喜爱。在Go生态系统中,有三个备受关注且被广泛应用的框架,它们分别是Web、RPC和ORM。这三者被称为“Go框架三件套”,包括ORM框架 Gorm,RPC框架 Kitex, Web框架 Hertz。
首先是Gorm,Gorm是一款强大的Go语言ORM(对象关系映射)库,它旨在简化数据库操作并提供高度的灵活性。Gorm支持多种关系型数据库,如MySQL、PostgreSQL和SQLite等。此外,Gorm还可以通过定义Go结构体来映射数据库表,开发者可以使用Gorm提供的API执行各种数据库操作,包括创建、查询、更新和删除数据。Gorm还提供了事务、预加载、复杂查询等高级特性,使得数据库操作更加便捷。
以下是一个使用Gorm的简单例子:
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
}
func main() {
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
defer db.Close()
db.AutoMigrate(&User{})
user := User{Name: "Alice"}
db.Create(&user)
var result User
db.First(&result, 1)
println(result.Name) // Output: Alice
}
接下来是RPC 框架 Kitex。Kitex是一款高性能RPC框架,旨在提供高性能的RPC通信解决方案,其设计目标是在性能、易用性和灵活性方面达到最佳平衡。它基于Netpoll、Service Mesh等基础设施,支持TCP、HTTP/1、HTTP/2等多种协议,同时提供了丰富的功能,如流控、限流、熔断、认证、监控等,以满足复杂的分布式应用场景。
以下是一个简单的示例,演示了如何使用Kitex,进而构建一个分布式计算应用:
定义接口
package example
type Calculator interface {
Add(a, b int) (int, error)
}
服务器端实现
package main
import (
"context"
"fmt"
"kitex-example/example"
"net"
"github.com/cloudwego/kitex/pkg/klog"
"github.com/cloudwego/kitex/pkg/registry"
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
)
type CalculatorImpl struct{}
func (c *CalculatorImpl) Add(ctx context.Context, p struct{ A, B int }) (int, error) {
return p.A + p.B, nil
}
func main() {
calc := new(CalculatorImpl)
serverOption := server.WithRPCHandler(calc)
serverOption = serverOption.
WithServiceAddr(":8888").
WithMetricRegistry(registry.Default())
server := server.NewServer(serverOption)
server.Run()
}
客户端调用
package main
import (
"context"
"fmt"
"kitex-example/example"
"time"
"github.com/cloudwego/kitex/client"
)
func main() {
caller, err := client.NewCaller(":8888", client.WithInvokeTimeout(time.Second*5))
if err != nil {
panic(err)
}
defer caller.Close()
client := example.NewCalculatorServiceClient(caller)
result, err := client.Add(context.Background(), example.Request{A: 10, B: 20})
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result.Result)
}
最后,我们再来说一说web。Web部分由Gin框架负责,Gin是一个轻量级的Web框架,可以提供高性能的路由和中间件支持。另外,Gin提供了简单而强大的路由和中间件机制,可以更好的处理函数。
以下是一个使用范例:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的Gin引擎
router := gin.Default()
// 定义一个切片来存储任务
var tasks []string
// 添加任务的路由处理函数
router.POST("/add", func(c *gin.Context) {
task := c.PostForm("task")
tasks = append(tasks, task)
c.JSON(200, gin.H{"message": "Task added successfully"})
})
// 查看任务的路由处理函数
router.GET("/tasks", func(c *gin.Context) {
c.JSON(200, tasks)
})
// 启动服务器
router.Run(":8080")
}
以上便是我对Go语言框架三件套的简要理解和学习感悟。我认为,如果想要更好的学好这三个框架,大量的练习是必不可少的。因为我们以后不止会接触Go语言,也要学更多的框架和语言,只有多练习,才能触类旁通。