Hertz框架学习| 青训营笔记

136 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天


Hertz是什么:

Hertz是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttpginecho 的优势,并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。

Hertz框架的特点:

  • 高易用性

在开发过程中,快速写出来正确的代码往往是更重要的。因此,在 Hertz 在迭代过程中,积极听取用户意见,持 续打磨框架,希望为用户提供一个更好的使用体验,帮助用户更快的写出正确的代码

  • 高性能

Hertz 默认使用自研的高性能网络库 Netpoll,在一些特殊场景相较于 go net,Hertz 在 QPS、时延上均具有一 定优势。关于性能数据,可参考下图 Echo 数据。

  • 高扩展性

Hertz 采用了分层设计,提供了较多的接口以及默认的扩展实现,用户也可以自行扩展。同时得益于框架的分层设计,框架的扩展性也会大很多。目前仅将稳定的能力开源给社区,更多的规划参考 RoadMap

  • 多协议支持

Hertz 框架原生提供 HTTP1.1、ALPN 协议支持。除此之外,由于分层设计,Hertz 甚至支持自定义构建协议解析逻辑,以满足协议层扩展的任意需求。

  • 网络层切换能力

Hertz 实现了 Netpoll 和 Golang 原生网络库 间按需切换能力,用户可以针对不同的场景选择合适的网络库,同时也支持以插件的方式为 Hertz 扩展网络库实现


快速入门:

Hertz框架和Gin框架都是HTTP框架,对于学习过Gin框架来说的我,使用起来思路应该十分类似,接下来就开始学习Hertz这个框架(根据官方文档)

参考文档的main,快速入门一个main

效果图:

代码:

package main

import (
   "context"
   "github.com/cloudwego/hertz/pkg/app"
   "github.com/cloudwego/hertz/pkg/app/server"
   "github.com/cloudwego/hertz/pkg/common/utils"
   "net/http"
)

func main() {
   h := server.Default(server.WithHostPorts("127.0.0.1:8085"))
   h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
      ctx.JSON(http.StatusOK, utils.H{"ping": "pong"})
   })
   h.Spin()
}

配置路由:

一般的项目里面都有一个Router,即路由,通过路由,我们将前端的请求分发给控制层中不同的函数进行参数解析等

我们将目录结构设置为这样

然后在router里面写入路由的代码:

package router

import (
   "context"
   "github.com/cloudwego/hertz/pkg/app"
   "github.com/cloudwego/hertz/pkg/app/server"
   "github.com/cloudwego/hertz/pkg/protocol/consts"
)

func InitRouter(h *server.Hertz) {
   v1 := h.Group("/v1")
   {
      // loginEndpoint is a handler func
      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")
      })
   }
}

接着我们再在main里面写入启动路由的代码:

router.InitRouter(h)

我们再去访问路径/v1/get

这样一个路由就成功了

如何去获取参数:

这里我就不去尝试query参数了,我们尝试着去获取json数据,json数据一般是通过参数绑定的方式进行获取

代码如下:

v1.POST("/post", func(ctx context.Context, c *app.RequestContext) {
   var arg Args
   err := c.BindAndValidate(&arg)
   if err != nil {
      panic(err)
   }
   c.JSON(http.StatusOK, arg)

测试效果如下:


总结,基本的Hertz学习是比较容易入门的,如果还要去深度学习这个框架的话,还要跟着官网文档继续走,为什么选择使用Hertz作为HTTP框架呢,原因就是因为他的几个特点,在如今的互联网时代这几个特点让这个框架的优势更加明显!