Hertz入门 | 青训营

86 阅读2分钟

这是我参与青训营伴学笔记创作活动的第2篇笔记

前言

Hertz是Golang微服务器HTTP框架,具有高易用性、高性能、高扩展性、多协议支持和网络层切换等特点,默认集成了字节跳动自研的Netpoll高性能网络库。

基础功能

简单实用

使用Hertz需要确保Golang开发环境已经搭建完成,为了保障兼容性和稳定性,要求Golang版本不低于1.15 以课程demo为例:

package main

import(
    "context"

    "github.com/cloudwego/hertz/pkg/app"
    "github.com/cloudwego/hertz/pkg/app/server"
)

func main(){
    h := server.New()

    // 将对应的路由注册到server上,POST是方法,"/sis"是url,
    h.POST("/sis", func(c context.Context, ctx *app.RequestContext) {
        ctx.Data(200, "text/plain; charset=utf-8", []byte("OK"))		// 业务逻辑
    })

    h.Spin()
}

需要注意这里替换成了"github.com/cloudwego/hertz/pkg/app"、"github.com/cloudwego/hertz/pkg/app/server",用老师上课讲的那串报错。 然后执行go mod init hertz_demo用于生成go.mod文件,执行go mod tidy用于整理并拉取依赖。
然后执行go run main.go开启端口,在Postman软件上如下配置,点击send即可 Alt text转存失败,建议直接上传图片文件

使用hz自动生成代码

hz是Hertz框架提供的用于生成代码的命令行工具,用于生成Hertz项目的脚手架

  • 安装hz
go install github.com/cloudwego/hertz/cmd/hz@latest
  • 生成/编写示例代码 在当前目录下创建hertz文件夹,cd hertz进入该文件夹 执行hz new -module hertz_demo生成代码, 整理&拉取依赖
go mod init //由于前面已经生成了mod.go,这里不需要init了
go mod tidy

然后使用go build main.go router_gen.go router.go命令编译,需要注意的是这里3个go文件都有main函数,所以需要一起编译。 然后使用./hertz_demo.exe运行该程序

2023/08/10 20:36:16.871308 engine.go:617: [Debug] HERTZ: Method=GET    absolutePath=/ping                     --> handlerName=hertz_demo/biz/handler.Ping (num=2 handlers)
2023/08/10 20:36:16.882486 engine.go:389: [Info] HERTZ: Using network library=standard
2023/08/10 20:36:16.885040 transport.go:65: [Info] HERTZ: HTTP server listening on address=[::]:8888

请求方式

  • 基础路由: Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。路由的优先级为静态路由 > 命名路由 > 通配路由

    • 静态路由
    r.GET("/getName")
    r.GET("/getAge")
    
    • 参数路由:Hertz 支持使用 :name 这样的命名参数设置路由,并且命名参数只匹配单个路径段。 r.GET("/user/:name/:age")
    • 通配路由(用的比较少):Hertz 支持使用 *path 这样的通配参数设置路由,并且通配参数会匹配所有内容。如果我们设置/src/*path路由,匹配情况如下 r.GET("/src/*")
  • 路由组

v1 := r.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")
   })
}

  • 中间件:
    自定义中间件:
    中间件可以在指定路由组组时声明,或使用Use声明使用。
v1 := r.Group("/v1", middleware.Jwt())
v1.Use(middleware.Jwt())

创建中间件:

func Jwt() app.HandlerFunc {
    return func(ctx context.Context, c *app.RequestContext) {
        // pre-handle
        // ...
        c.Next(ctx)
    }
}

终止中间件: c.Abort
c.AbortWithMsg
c.AbortWlthStats