如果 Client 侧发起大量连接而不关闭的话,极端情况下会有较大的资源浪费,随着时间的增长,可能会造成内存使用率高的问题。
解决办法
合理配置 idleTimeout
,超时后 Hertz Server 会把连接关掉保证 Server 侧的稳定性。默认配置为3分钟。
Reader
接口。为了实现流式的能力,Hertz 将 netpoll 封装为 Reader,但其本身数据仍然不可控的进入了内存,所以在超大流式请求的情况下,可能会造成内存压力。解决办法
超大请求的场景下,使用流式 + go net 的组合。
如果框架报以下的错误码,可以按照可能原因进行排查。如果出现非以下错误码,则不是框架打出来的,需要由使用方定位一下是否自行设置或者由某些中间件设置了错误码。
server 在执行完自定义的 ContinueHandler
之后返回 false
(server 主动拒绝掉 100 Continue 后续的 body)。
handlerFunc
中抛 panic/../
,可能出现访问预期之外的文件,server 端 app log 中伴随错误日志:cannot serve path with '/../' at position %d due to security reasons: %q
。Hertz 在 HandlerFunc
设计上,同时提供了一个标准 context.Context
和一个请求上下文作为函数的入参。
handler/middleware
函数签名为:
type HandlerFunc func(c context.Context, ctx *RequestContext)
两个上下文都有储值能力,使用时具体选择哪一个的简单依据:所储存值的生命周期和所选择的上下文要匹配。
具体细节
ctx
主要用来存储请求级别的变量,请求结束就回收了,特点是查询效率高(底层是 map
),协程不安全,且未实现 context.Context
接口。
c
作为上下文在中间件 /handler
之间传递。拥有 context.Context
的所有语义,协程安全。所有需要 context.Context
接口作为入参的地方,直接传递 c
即可。
除此之外,如果面对一定要异步传递 ctx
的场景,hertz 也提供了 ctx.Copy()
接口,方便业务能够获取到一个协程安全的副本。
var s = '{"x":6855337641038665531}';
var obj = JSON.parse(s);
alert (obj.x);
// Output 6855337641038666000
json.Unmarshal
进行 JSON 的反序列化的时候,如果没有指定数据类型,使用 interface{}
作为接收变量,将默认采用 float64
作为其数字的接受类型,当数字的精度超过float能够表示的精度范围时就会造成精度丢失的问题。string
tag。package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
type User struct {
ID int `json:"id,string"`
}
func main() {
h := server.Default()
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
var u User
u.ID = 6855337641038665531
c.JSON(consts.StatusOK, u)
})
h.Spin()
}
json.Number
package main
import (
"context"
"encoding/json"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
type User struct {
ID json.Number `json:"id"`
}
func main() {
h := server.Default()
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
var u User
err := json.Unmarshal([]byte(`{"id":6855337641038665531}`), &u)
if err != nil {
panic(err)
}
c.JSON(consts.StatusOK, u)
})
h.Spin()
}