为初学者实施高性能的核心结构HTTP框架Hertz
#网络开发人员 #初学者 #go #cloudnative

赫兹

Hertz是一种超大规模的企业级微服务HTTP框架,具有高易用性,易于扩展和低延迟等。

赫兹默认情况下使用自我开发的高性能网络库NetPoll。在某些特殊情况下,赫兹(Hertz)在QP和延迟中具有一定的优势,而不是进行净。有关性能数据,请参阅下面的回声数据。

performance

在内部实践中,对于某些典型服务,例如与杜松子酒框架相比,在迁移赫兹之后的框架,网关和其他服务的服务中,资源使用率大大减少。有关更多信息,请参见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以获取更多信息。我确定文档对您所有问题都有答案。

参考文献列表