在学习抖音商城项目时用到了Hertz框架做为可客户端,记录一下所学到的Hertz基本知识。
1 Hertz
Hertz 是由字节跳动开源的高性能 Go 语言 HTTP 框架,专为微服务场景设计,具有高性能、易用性和扩展性等特点。它支持 HTTP1.1 和 HTTP/2 协议,并提供丰富的工具链和中间件生态。
1.1 创建第一个 HTTP 服务
从cloudewego官网上复制下来的简单http服务,实现一个简单的 Hello, World 响应。
使用h.GET()方法注册路由,并返回一个hello,world字符串。
package main
import (
"context"
"fmt"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
h := server.Default()
h.GET("/hello", func(c context.Context, ctx *app.RequestContext) {
ctx.Data(consts.StatusOK, consts.MIMETextPlain, []byte("hello world"))
})
fmt.Println("Starting server on :8888")
h.Spin()
}
1.2 配置路由
在 router/register.go 中,注册一个路由来响应 /ping:
在Hertz中支持路由组、带中间件的路由、带参数的路由
h.GET("/hello", func(c context.Context, ctx *app.RequestContext) {
ctx.Data(consts.StatusOK, consts.MIMETextPlain, []byte("hello world"))
})
// 设置了中间件的路由组,test:test为用户名和密码
example1 := h.Group("/example1", basic_auth.BasicAuth(map[string]string{"test": "test"}))
example1.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.String(consts.StatusOK, "ping")
})
example1.POST("/post", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "post")
})
1.3 启动服务
运行 main.go,启动服务:
go run main.go
并且用浏览器来访问 http://localhost:8888/ping,会看到以下响应:
{
"message": "Hello, World!"
}
1.4 添加中间件
中间件可以在请求进入处理器之前或响应返回客户端之前执行一些逻辑。
在Hertz中定制自己的中间件,返回值为app.HandlerFunc类型,在Hertz当中请求处理函数和中间件都是。调用Next()函数告诉Hertz当前中间件已经使用完毕,执行下一个中间件
func MyMiddleware1() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
// pre-handle
// 定义了一个简单的功能,在进入处理函数之前输出一个pre-handle
fmt.Println("pre-handle")
c.Next(ctx)
return
}
}
1.5应用中间件
在 main.go 中应用中间件,使用h.Use()方法便可以很简便的应用中间件
func main() {
h := server.Default()
// 使用中间件
h.Use(middleware.Logger())
// 注册路由
router.Register(h)
h.Spin()
}
启动服务后,每次请求响应前都会在控制台打印出pre-handle字符串
2 相关知识
2.1 路由注册:
在网络应用开发中,将特定的URL路径与相应的处理函数或控制器方法相关联的过程。当客户端(如浏览器)发起请求访问某个URL时,路由系统会根据预先注册的路由规则,找到对应的处理逻辑并执行,从而返回相应的响应。
2.1 流式处理:
在传统的非流式处理模式下,服务器会将请求体一次性读取到内存,处理完毕后才开始业务逻辑。但对于大型数据请求,比如上传文件或长文本请求,一次性加载到内存中可能导致高内存消耗甚至内存不足。流式处理(Streaming)是一种逐步读取数据的处理方式,分片处理数据而非一次性加载全部内容。
总结
学到现在感觉HTTP框架大体上都十分类型,Hertz框架和我之前学习过的Django框架在代码编写思路和中间件使用上比较类似,上手起来还是比较快速的。不过最近在实验室工作和学校课程的双重压力下变得比较浮躁,学习效率低下,希望能保持住对学习的热情,稳扎稳打的学下去吧。