这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
GORM
GORM 是一款面向 Go 开发的,对开发人员友好的,“梦幻般的” ORM 库。
什么是ORM
ORM(Object–relational mapping),即对象关系映射,是一种用于在关系数据库和面向对象的编程语言堆之间转换数据的编程技术。通过 ORM 技术,我们可以将关系数据库中某个数据表的结构关联到某个类/结构体上,并通过修改类/结构体实例的方式轻易的完成数据库增删改查(CRUD)的任务。通过 ORM 技术,我们得以以一种更加友好且高效的方式,在尽量不接触 SQL 语句的情况下操作数据库,但实际上,ORM分为半自动和全自动,在Java 中我们熟知的Mybatis 即为半自动,那么我们也无可避免地去编写一些特定的SQL,而这种半自动更加受现代IT界欢迎,因为它是如此的灵活却不失优雅。
如何使用GORM
GORM 并不包含在 Go 标准库中,因此,我们需要先安装 GORM 及需要连接对应数据库的驱动。Gorm 官方支持的数据库类型有:MySQL, PostgreSQL, SQlite, SQL Server。以下命令通过 Go Module 拉取并添加 Gorm 及 MySQL 数据库驱动:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
示例代码(相关操作演示及讲解):
package main
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
) //导入mysql和gorm
type Product struct {
gorm.Model
Code string
Price uint
} //声明一个数据库模型,即一个标准的结构体,其中属性名首字母大写便于转为josn格式
func main() {
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
//使用gorm开启了一个数据库连接,并处理了相关异常
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 迁移 schema
db.AutoMigrate(&Product{})
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // 根据整型主键查找
db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录
// Update - 将 product 的 price 更新为 200
db.Model(&product).Update("Price", 200)
// Update - 更新多个字段
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - 删除 product
db.Delete(&product, 1)
}
Kitex
Kitex 是字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用
什么是RPC
RPC(Remote procedure call,远程过程调用),是指计算机程序导致过程(子例程)在不同的地址空间(通常在共享网络上的另一台计算机上)中执行,其编码就像普通(本地)过程调用一样,程序员没有显式编码远程交互的详细信息。也就是说,程序员编写的代码基本相同,无论子例程是执行程序的本地还是远程的。 简单来说,通过使用 RPC,我们可以像调用方法一样快捷的与远程服务进行交互。
如何使用Kitex
简单来说就是安装并配置GOPATH具体操作待复习时补充。
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
go install github.com/cloudwego/thriftgo@latest
Kitex分为客户端和服务端,详细使用待以后补充。
Hertz
Hertz 是一个 Golang 微服务 HTTP 框架,具有高易用性、高性能、高扩展性等特点
什么是Hertz
Hertz 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势,并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。
如何使用Hertz
示例代码:
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
) //导入hertz相关依赖
//hertz主要提供了GET,POST,PUT,DELETE,ANY等方法
func main(){
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
h.StaticFS("/", &app.FS{Root: "./", GenerateIndexPages: true})
h.GET("/get", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "get")
})
h.POST("/post", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "post")
})
h.PUT("/put", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "put")
})
h.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "delete")
})
h.PATCH("/patch", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "patch")
})
h.HEAD("/head", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "head")
})
h.OPTIONS("/options", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "options")
})
h.Any("/ping_any", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "any")
})
h.Handle("LOAD","/load", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "load")
})
h.Spin()
}
路由分组
Hertz 提供了路由组( Group )的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上:
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
//创建了如下路由:/v1/get,/v1/post,/v2/put,/v2/delete。
func main(){
h := server.Default(server.WithHostPorts("127.0.0.1:8080"))
v1 := h.Group("/v1")
v1.GET("/get", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "get")
})
v1.POST("/post", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "post")
})
v2 := h.Group("/v2")
v2.PUT("/put", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "put")
})
v2.DELETE("/delete", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "delete")
})
h.Spin()
}
今天的内容主要参考了同期贺兰的笔记,后续复习整理时会整体更新