赫兹
Hertz是一种超大规模的企业级微服务HTTP框架,具有高易用性,易于扩展和低延迟等。
赫兹默认情况下使用自我开发的高性能网络库NetPoll。在某些特殊情况下,赫兹(Hertz)在QP和延迟中具有一定的优势,而不是进行净。有关性能数据,请参阅下面的回声数据。
在内部实践中,对于某些典型服务,例如与杜松子酒框架相比,在迁移赫兹之后的框架,网关和其他服务的服务中,资源使用率大大减少。有关更多信息,请参见hertz-benchmark。
Hz
赫兹提供了易于使用的命令行工具Hz。用户只需要提供IDL即可。根据定义的接口信息,HZ可以一键单击生成项目脚手架,然后将Hertz从开箱即用。 HZ还提供更新功能。如果更改,HZ的IDL可以更新脚手架。当前,HZ支持节俭和Protobuf IDL定义。命令行工具具有可根据您的需求使用的内置丰富选项。同时,它依赖于Protobuf的官方编译器和底部的自开发的Thriftgo编译器,两者都支持自定义生成的代码插件。如果您觉得默认模板无法满足需求,则可以自定义生成的模板。
有关更多信息,see。
核心结构的实施
赫兹
要学习一个框架,您必须首先学习其核心结构,而Hertz框架的核心结构和输入是具有与其本身相同名称的File hertz.go
。该文件并不冗长,可以说是简短而简洁的。
核心结构是在文件的开头,有一个突出的评论行。
// Hertz is the core struct of hertz.
type Hertz struct {
*route.Engine
}
评论意味着这里的赫兹结构是整个框架的核心结构。该结构将Engine
封装在route
下,并且发动机包含所有方法。如果要使用此框架,则必须依靠此引擎。
新的
// New creates a hertz instance without any default config.
func New(opts ...config.Option) *Hertz {
options := config.NewOptions(opts)
h := &Hertz{
Engine: route.NewEngine(options),
}
return h
}
新的是引擎的构造函数。您可以创建一个新的Engine
实例,它将不包含默认配置,但是您可以自己自定义相关配置,并且该实例将在构造后返回。
默认
通常,我们在开发中直接使用Default
而不是New
,因为Default
将使用默认的中间件Recovery
,而杜松子酒框架也将具有日志中间件。
// Default creates a hertz instance with default middlewares.
func Default(opts ...config.Option) *Hertz {
h := New(opts...)
h.Use(recovery.Recovery())
return h
}
调用Default
函数时,将首先创建Engine
实例,并将使用Recovery
中间件。 Recovery
的实现非常简单。使用defer
将错误恢复函数挂载,然后在此函数()中调用recover
,catch panic ,然后在日志中打印堆栈信息,返回内部服务器错误用户。可以避免由于恐慌。
此外,Default
还支持自定义配置信息。
在代码实施中,我们将首先制作一个频道并运行goroutine等待接收信息。收到关闭信号时,我们将优雅关闭程序。关于 waitsignal ,我们将继续在下面解释它。
setCustomSignalWaiter
SetCustomSignalWaiter
设置了信号服务员功能。如果默认一个不满足要求,请设置此功能以自定义。赫兹如果返回错误,将立即退出,否则它将优雅地退出。
func (h *Hertz) SetCustomSignalWaiter(f func(err chan error) error) {
h.signalWaiter = f
}
等待信号
在此功能中,我们将等待信号,并有一个选择与下一个操作相对应,包括强制退出和优雅的出口,如果有错误,将返回ERR。
func waitSignal(errCh chan error) error {
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM)
select {
case sig := <-signals:
switch sig {
case syscall.SIGTERM:
// force exit
return errors.New(sig.String()) // nolint
case syscall.SIGHUP, syscall.SIGINT:
// graceful shutdown
return nil
}
case err := <-errCh:
return err
}
return nil
}
概括
之后,我们已经读取了hertz.go
的源代码,但是如果您只看到源代码,您仍然可能不了解一些事情。接下来,我们将以CloudWego的示例来进一步查看它的使用方式。
例子
让我们直接看一下hertz-examples/hello/main.go
。
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
// server.Default() creates a Hertz with recovery middleware.
// If you need a pure hertz, you can use server.New()
h := server.Default()
h.GET("/hello", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "Hello hertz!")
})
h.Spin()
}
输入 main 函数的第一行告诉使用Default
具有自己的错误恢复中间件。如果您想要一个纯实例,请使用New
。接下来,他称为server.Default()
,其次是 Get 请求的路线,该请求打印为“ Hello Hertz!”。最终称为Spin()
,等待信号。
概括
您可以查看cloudwego/hertz以获取更多信息。我确定文档对您所有问题都有答案。