这是我参与「第五届青训营」伴学笔记创作活动的第7天
Hertz
Hertz是一个超大企业级微服务HTTP框架,具有高可用性、易扩展性、低延迟等特点。
Hertz默认使用自己开发的高性能网络库Netpoll。在一些特殊的场景下,赫兹在QPS和时延方面比围棋网有一定的优势。
在内部实践中,与Gin框架相比,迁移Hertz后,一些典型的服务(如框架密集型服务、网关等)的资源使用量显著减少,CPU使用量根据流量减少了30%至60%。
服务发现拓展
Hertz支持自定义发现模块,允许用户扩展和集成pkg/app/client/discovery下定义的其他寄存器。
拓展接口
服务发现接口的定义和实现 服务发现接口有三个方法。
Resolve是Resolve的核心方法,从目标键检索所需的服务发现结果。 Target从Hertz提供的对等TargetInfo中解析Resolve需要使用的唯一目标,该目标将作为缓存的唯一键。 名称用于指定唯一的解析器名称,Hertz使用该名称缓存和重用解析器。
type Resolver interface {
// Target should return a description for the given target that is suitable for being a key for cache.
Target(ctx context.Context, target *TargetInfo) string
// Resolve returns a list of instances for the given description of a target.
Resolve(ctx context.Context, desc string) (Result, error)
// Name returns the name of the resolver.
Name() string
}
这三个方法在 discovery.go 的后续代码中进行了实现。
// SynthesizedResolver synthesizes a Resolver using a resolve function.
type SynthesizedResolver struct {
TargetFunc func(ctx context.Context, target *TargetInfo) string
ResolveFunc func(ctx context.Context, key string) (Result, error)
NameFunc func() string
}
func (sr SynthesizedResolver) Target(ctx context.Context, target *TargetInfo) string {
if sr.TargetFunc == nil {
return ""
}
return sr.TargetFunc(ctx, target)
}
func (sr SynthesizedResolver) Resolve(ctx context.Context, key string) (Result, error) {
return sr.ResolveFunc(ctx, key)
}
// Name implements the Resolver interface
func (sr SynthesizedResolver) Name() string {
if sr.NameFunc == nil {
return ""
}
return sr.NameFunc()
}
总结
Hertz是一个Golang微服务HTTP框架。Hertz在设计之初,参考了其他开源框架fastttp、gin和echo的优点,并结合字节跳动的内部需求,使其具有高可用性、高性能和高可扩展性的特点,在字节跳动得到了广泛的应用。越来越多的微服务正在使用Golang,如果对微服务性能有需求,并且需要一个能够完全满足内部可定制需求的框架,Hertz是一个不错的选择。