Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

简介

Go语言是一个既快速又性能卓越的开源编程语言。Gorm、Kitex和Hertz是三个基于Go语言的框架,都在不同的领域内有着广泛的应用。下面我们将从基本用法和常见API的讲解来介绍这三个框架。

Gorm

Gorm是一个简单而强大的ORM框架,可以处理从MySQL到PostgreSQL的关系数据库操作。以下是Gorm的基本用法。

安装

使用Gorm的第一步是安装它。可以使用以下命令安装最新版本的Gorm。

go get -u gorm.io/gorm

连接数据库

下面是一个示例,演示如何使用Gorm连接MySQL数据库。

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    db, err := gorm.Open(mysql.Open("user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
    if err != nil {
        panic(err)
    }
    defer db.Close()
}

定义模型

接下来,我们为Gorm定义一个模型。一个模型在Gorm中表示一个数据库表。

type User struct {
    gorm.Model
    Name         string
    Email        string
    Age          uint8
    Birthday     time.Time
    MemberNumber sql.NullString
    ActivatedAt  sql.NullTime
    CreatedAt    time.Time
    UpdatedAt    time.Time
}

CRUD操作

下面是一些Gorm的CRUD操作的基本用法:

创建一条记录

db.Create(&User{Name: "张三", Email: "zhangsan@xxx.com"})

更新一条记录

db.Model(&User{}).Where("name = ?", "张三").Update("name", "李四")

删除一条记录

db.Where("name = ?", "李四").Delete(&User{})

查询一条记录

var user User
db.First(&user, "name = ?", "张三")

查询多条记录

var users []User
db.Where("name like ?", "%三%").Find(&users)

Kitex

Kitex是一种高性能、易于使用的微服务框架,具有协程管理、协议照抄、泛化调用、任务显式/隐藏等特性。以下是Kitex的基本用法。

安装

Kitex可以使用以下命令来安装:

go get -u github.com/cloudwego/kitex

客户端

定义接口

首先,我们需要定义一个Kitex接口,例如:

type Greeter interface {
    Hello(context.Context, *HelloRequest) (*HelloReply, error)
}

type HelloRequest struct {
    Name string
}

type HelloReply struct {
    Message string
}

实现服务

然后,我们需要实现Kitex服务,例如:

type GreeterHandler struct {}

func (h *GreeterHandler) Hello(ctx context.Context, req *HelloRequest) (*HelloReply, error) {
    return &HelloReply{Message: fmt.Sprintf("Hello, %s!", req.Name)}, nil
}

创建服务器

最后,我们需要创建一个Kitex服务器,例如:

import (
    "context"
    "github.com/cloudwego/kitex/pkg/klog"
    "github.com/cloudwego/kitex/pkg/rpcinfo"
    "github.com/cloudwego/kitex/server"
    "github.com/cloudwego/kitex/server/http"
)

func main() {
    cfg := server.SvrConfig{
        Proto:      kitex_proto.ProtoSerilizerType(kitex_proto.SerializeType(1)),
        ListenOn:   "0.0.0.0:8080",
        ServerType: "http",
    }
    svr := http.NewServer(&cfg)
    kitex.RegisterGreetorServer(svr, &GreeterHandler{})
    if err := svr.Run(); err != nil {
        klog.Errorf("run server failed, err:%+v.", err)
    }  
}

客户端

创建客户端

在Kitex中,创建客户端非常简单。只需实例化一个客户端实现。

import (
    "context"
    "github.com/cloudwego/kitex/client"
    "github.com/cloudwego/kitex/pkg/klog"
)

func main() {
    cfg := client.NewClientConfig(client.WithRemote("localhost:8080"), client.WithClientThreshold(500))
    client := client.NewClient(cfg)
    if err := client.Init(); err != nil {
        klog.Errorf("init client failed, err=%+v.", err)
        return
    }
    defer client.Close()
}

调用服务

使用Kitex客户端调用服务也很简单。只需要使用生成的客户端接口调用函数。

func CallGreeterService(ctx context.Context, name string) (string, error) {
    req := &HelloRequest{Name: name}
    reply := &HelloReply{}
    greeterClient := kitex.NewGreeterClient(client)
    if err := greeterClient.Hello(ctx, req, reply); err != nil {
        return "", err
    }   
    return reply.Message, nil
}

Hertz

Hertz是一个轻量级的WEB框架,提供了快速构建中小型项目的能力。以下是Hertz的基本用法。

安装

可以使用以下命令安装最新版本的Hertz。

go get -u github.com/cosiner/hertz

创建路由

在Hertz中,我们可以使用Router函数创建路由。

func main() {
    router := hertz.Router()
    router.GET("/", func(ctx *hertz.Context) {
        ctx.String("Hello World!")
    })
    router.Run(":8080")
}

获取参数

从URL中获取参数在Hertz中非常简单。

func main() {
    router := hertz.Router()
    router.GET("/users/:name", func(ctx *hertz.Context) string {
        return "Hello, " + ctx.Param("name")
    })
    router.Run(":8080")
}

使用中间件

Hertz中的中间件可用于添加对请求和响应的处理。

func main() {
    router := hertz.Router()
    router.Use(func(ctx *hertz.Context) {
        fmt.Println("开始处理请求")
        ctx.Next()
        fmt.Println("请求处理结束")
    })
    router.GET("/", func(ctx *hertz.Context) {
        ctx.String("Hello World!")
    })
    router.Run(":8080")
}

示例说明

示例一:德州扑克牌库存管理

某个德州扑克牌小卖家需要一个库存管理平台,平台应该支持对库存的添加、销售和查询,以及低库存提醒。针对这个场景,我们可以使用Gorm和Hertz框架来实现此功能。

首先,我们需要定义一个牌类表的Gorm模型,用于存储牌类信息。

type Card struct {
    gorm.Model
    Name         string
    Count        uint8
    Price        float32
}

然后,我们需要创建一个Hertz应用程序,并使用Hertz的路由和Gorm的模型添加,查询和销售牌。

func main() {
    router := hertz.Router()
    router.POST("/cards", func(ctx *hertz.Context) {
        var card Card
        if err := ctx.Bind(&card); err != nil {
            ctx.String(http.StatusBadRequest, "绑定失败!")
            return
        }
        if err := db.Create(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "创建失败!")
            return
        }
        ctx.String(http.StatusCreated, "创建成功!")
    })
    router.GET("/cards", func(ctx *hertz.Context) {
        var cards []Card
        if err := db.Find(&cards).Error; err != nil {
            ctx.String(http.StatusBadRequest, "查询失败!")
            return
        }
        ctx.JSON(http.StatusOK, cards)
    })
    router.POST("/sale", func(ctx *hertz.Context) {
        var saleRequest SaleRequest
        if err := ctx.Bind(&saleRequest); err != nil {
            ctx.String(http.StatusBadRequest, "绑定失败!")
            return
        }
        var card Card
        if err := db.Where("name = ?", saleRequest.Card).First(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "找不到牌!")
            return
        }
        if card.Count < saleRequest.Count {
            ctx.String(http.StatusBadRequest, "库存不足!")
            return
        }
        card.Count -= saleRequest.Count
        if err := db.Save(&card).Error; err != nil {
            ctx.String(http.StatusBadRequest, "销售失败!")
            return
        }
        ctx.String(http.StatusOK, "销售成功!")
    })
    router.Run(":8080")
}

最后,我们可以使用Gorm的Hooks机制来实现一个低库存提醒的功能,例如:

func checkLowStock(db *gorm.DB) {
    var cards []Card
    if err := db.Where("count <= ?", 10).Find(&cards).Error; err != nil {
        return
    }
    for _, card := range cards {
        fmt.Println(card.Name + "的库存不足!")
    }
}

func main() {
    db.Callback().Create().After("gorm:create").Register("hertz:checkLowStock", checkLowStock)
    router.Run(":8080")
}

示例二:牌类添加和销售系统

某个扑克牌销售商需要一个库存管理系统,可以添加、销售和查询扑克牌的库存。同时,需要使用Kitex的客户端和服务器来实现多个用户之间的实时库存交流。针对这个场景,我们可以使用Gorm和Kitex框架来实现此功能。

在这个场景中,和前面一样,我们需要首先定义一个牌类表的Gorm模型,用于存储牌类信息。

type Card struct {
    gorm.Model
    Name         string
    Count        uint8
    Price        float32
}

然后,我们需要创建一个Kitex服务来实现库存交流。

type GreeterHandler struct {}

type StockRequest struct {
    Name string
}

type StockReply struct {
    Count uint8
}

func (h *GreeterHandler) Stock(ctx context.Context, req *StockRequest) (*StockReply, error) {
    var card Card
    if err := db.Where("name = ?", req.Name).First(&card).Error; err != nil {
        return nil, err
    }
    return &StockReply{Count: card.Count}, nil
}

func main() {
    cfg := server.SvrConfig{
        ServerType: "http",
        ListenOn:   "0.0.0.0:8081",
    }
    svr := http.NewServer(&cfg)
    kitex.RegisterStockServer(svr, &GreeterHandler{})
    if err := svr.Run(); err != nil {
        klog.Errorf("run stock server failed, err:%+v.", err)
    }
}

最后,我们可以在Hertz应用程序中使用作为客户端的生成的Kitex接口来添加和销售牌。

ctx := context.Background()
stockClient := kitex.NewStockClient(client)
var card Card
if err := db.Where("name = ?", request.Name).First(&card).Error; err != nil {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "找不到牌类"})
    return
}
if card.Count < request.Count {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "库存不足"})
    return
}
card.Count -= request.Count
if err := db.Save(&card).Error; err != nil {
    ctx.JSON(http.StatusBadRequest, gin.H{"error": "销售失败"})
    return
}
if _, err := stockClient.Stock(context.Background(), &kitex.StockRequest{Name: card.Name}); err != nil {
    fmt.Printf("获取库存失败:%v.\n", err)
}
ctx.String(http.StatusOK, "销售成功!")

结论

这篇文章简要介绍了Gorm、Kitex和Hertz这三个基于Go语言的框架的常用API和基本用法。这些框架都非常适合中小型项目,能够以高效的方式提供卓越的性能和开发体验。如果你是一名Golang开发人员,我们强烈建议你熟悉和尝试这些框架。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Git ssh 配置及使用方法

    Git ssh 配置及使用方法 Git是目前最流行的版本控制工具之一,通过SSH协议能够保证数据传输的安全性。在使用Git进行协作开发时,往往需要配置SSH key并使用SSH协议进行连接。本文将会详细介绍如何配置Git SSH并进行实际使用。 生成SSH密钥 打开终端(Terminal),输入以下代码来生成SSH密钥: ssh-keygen -t rsa …

    GitHub 2023年5月16日
    00
  • go程序员日常开发效率神器汇总

    “go程序员日常开发效率神器汇总”是一篇介绍提高golang程序员开发效率的文章,其中涵盖了多个常用的工具和技巧。以下是该攻略的完整说明: 1. 使用代码格式化工具 代码格式化是一项非常重要的任务,可以大幅提高代码的可读性,使代码风格统一。对于Golang程序员来说,常用的代码格式化工具是gofmt和goimports。 gofmt是一个官方的代码格式化工具…

    GitHub 2023年5月16日
    00
  • RocketMQ源码本地搭建调试方法

    当你需要对RocketMQ这个消息中间件进行二次开发或者调试的时候,我们需要搭建RocketMQ源码环境,从而可以方便地进行代码调试以及定位问题。接下来,我会为你介绍如何在本地搭建RocketMQ源码的开发环境,并且通过两个示例来演示如何进行调试。 环境准备 在开始搭建RocketMQ源码环境之前,需要您本地已经准备好以下环境: JDK1.8及以上 Git …

    GitHub 2023年5月16日
    00
  • 使用pycharm将自己项目代码上传github(小白教程)

    下面我将详细讲解如何使用PyCharm将自己的项目代码上传到GitHub。具体流程分为以下几个步骤: 创建GitHub账号并创建仓库首先需要在GitHub上创建自己的账号,并创建一个新的仓库。在仓库名字和描述的填写完毕后,记得不要选择“Initialize this repository with a README”,否则会和后面在本地初始化时产生冲突。 在…

    GitHub 2023年5月16日
    00
  • 如何使用工具规范前端项目的commits与changelog技巧

    针对“如何使用工具规范前端项目的commits与changelog技巧”,我可以提供以下完整攻略: 1. 使用工具规范commits 在实际开发中,我们需要维护一份清晰的 commit history,为团队成员和其他开发者提供更好的阅读体验。下面介绍两个常用的工具,它们可以帮助我们更好地规范 commits。 1.1 commitlint commitli…

    GitHub 2023年5月16日
    00
  • Docker镜像的制作,上传,拉取和部署操作(利用阿里云)

    下面是关于Docker镜像的制作、上传、拉取和部署的完整攻略。 Docker镜像的制作 Docker镜像的制作分为两种方式:手动创建和自动构建。 手动创建 手动创建Docker镜像需要以下步骤: 创建一个Dockerfile,包含需要安装的软件、配置、文件等信息。 在Dockerfile所在目录下执行docker build命令,生成Docker镜像文件。 …

    GitHub 2023年5月16日
    00
  • Go语言开发代码自测绝佳go fuzzing用法详解

    Go语言开发代码自测绝佳go fuzzing用法详解 前言 在软件开发中,代码的质量非常重要。而代码自测是保证代码质量的重要手段。本文将介绍如何使用Go语言的go fuzzing工具进行代码自测,它是一种绝佳的代码自测方法。 Go Fuzzing是什么? Go Fuzzing是一种基于模糊测试技术的代码自测工具。它能够通过生成随机的输入,使得代码运行在各种情…

    GitHub 2023年5月16日
    00
  • 基于binarywang封装的微信工具包生成二维码

    当你想要在自己的网站或应用中集成微信登录、微信支付等服务时,便需要使用微信提供的开放平台接口。而基于binarywang封装的微信工具包能够帮助我们轻松地完成这些操作,其中生成二维码是最基础的功能之一。下面就是使用这个工具包生成二维码的完整攻略。 步骤一:添加依赖 首先,我们需要在自己的项目中添加weixin-java-toolkit的依赖。如果你使用的是M…

    GitHub 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部