Hertz介绍| 青训营笔记

208 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第7天

Hertz

Hertz是一个超大企业级微服务HTTP框架,具有高可用性、易扩展性、低延迟等特点。

Hertz默认使用自己开发的高性能网络库Netpoll。在一些特殊的场景下,赫兹在QPS和时延方面比围棋网有一定的优势。

在内部实践中,与Gin框架相比,迁移Hertz后,一些典型的服务(如框架密集型服务、网关等)的资源使用量显著减少,CPU使用量根据流量减少了30%至60%。

服务发现拓展

Hertz支持自定义发现模块,允许用户扩展和集成pkg/app/client/discovery下定义的其他寄存器。

2eb4a594f4634798b2342dce7f1e128b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

拓展接口

服务发现接口的定义和实现 服务发现接口有三个方法。

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是一个不错的选择。