这是我参与「第五届青训营」伴学笔记创作活动的第 10 天
前言
Hertz是一个Golang的微服务HTTP框架,具有高易用、高性能、高扩展等特点,本文将对Hertz相关知识进行简要介绍。
框架特点
-
高易用性:积极采纳用户意见,持续优化框架,提高使用体验。
-
高性能:默认使用自研的高性能网络库Netpoll,在一些特殊场景相较于go net,Hertz在QPS、时延上均有一定优势。
-
高扩展性:采用分层设计,提供较多的接口以及默认的扩展实现。
-
网络层切换能力:Hertz实现了Netpoll和Golang原生网络库间的按需切换能力,用户可以针对不同的场景选择合适的网络库,同时也支持以插件的方式为Hertz扩展网络库的实现。
架构设计
-
应用层
主要包括与应用直接交互的API,如Server、Client等。
-
路由层
路由层主要负责提供路由注册、路由查找等与路由相关的服务,Hertz在路由层的设计上为用户提供了极高的自由度,主要支持的路由服务有:
-
静态路由、参数路由的注册。
-
按优先级匹配:/a/b和/:c/b,同时满足时,优先匹配/a/b。
-
路由回溯:注册/a/b和/:c/d,当匹配/a/d时仍然能够匹配上/:c/d。
-
尾斜线重定向:注册/a/b,当匹配/a/b/时重定向到/a/b上。
-
-
协议层
协议层负责不同协议的实现和扩展,用户只需要实现下面的接口便可以按照自己的需求在引擎上扩展协议,同时也支持通过ALPN协议协商的方式注册。
-
传输层
传输层负责底层的网络库抽象和实现,主要支持两大类:
-
基于连接的网络库:CloudWeGo开源的Netpoll、Golang原生网络库net。
-
基于流的网络库:quic-go网络库。
Hertz支持底层网络库的扩展,完美匹配Netpoll,在时延方面有很多深度优化,且支持网络库的一键切换。
-
使用入门
-
安装Golang开发环境,可以参考 Golang 安装。
-
安装命令行工具hz:
go install github.com/cloudwego/hertz/cmd/hz@latest。 -
代码构建
-
自动生成:在指定目录下使用
hz new命令生成代码。 -
手动编写:创建
main.go文件,并添加以下代码。package main import ( "context" "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" ) func main() { h := server.Default() h.GET("/ping", func(c context.Context, ctx *app.RequestContext) { ctx.JSON(consts.StatusOK, utils.H{"message": "pong"}) }) h.Spin() }
-
-
生成
go.mod文件$ go mod init hertz_demo -
整理 & 拉取依赖
$ go mod tidy -
运行
$ go build -o hertz_demo && ./hertz_demo -
运行效果
2022/05/17 21:47:09.626332 engine.go:567: [Debug] HERTZ: Method=GET absolutePath=/ping --> handlerName=main.main.func1 (num=2 handlers) 2022/05/17 21:47:09.629874 transport.go:84: [Info] HERTZ: HTTP server listening on address=[::]:8888```
总结
Hertz作为一个高性能的微服务HTTP框架,适用于对微服务存在性能需求和可定制化需求的系统开发。本文主要分享了Hertz的架构设计、特点以及基础入门使用,若对具体功能的使用方式有兴趣可以参考官方文档。