简述Go框架三件套(Web/RPC/ORM)使用 | 青训营

87 阅读3分钟

       ~~~~~~~这是我在青训营的第三篇笔记。在这篇笔记中,我会讲述自己对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语言,也要学更多的框架和语言,只有多练习,才能触类旁通。