Herz 学习笔记 | 豆包MarsCode AI刷题

196 阅读6分钟

字节跳动 Herz 框架学习笔记

Herz 是字节跳动公司开源的一个高性能、轻量级的微服务框架,旨在帮助开发者快速构建高效、可扩展的服务化系统。Herz 架构在设计时考虑到了高并发、高可用性、分布式微服务等场景,采用了许多现代化技术(如 gRPC、protobuf、去中心化服务发现等),并且具有丰富的中间件生态。通过它可以实现服务的自动化注册与发现、负载均衡、熔断、限流等微服务基础功能。

本笔记将介绍 Herz 框架的基本概念、如何使用 Herz 框架以及常见的开发模式,帮助你快速上手 Herz,并理解其在字节跳动内部服务化架构中的作用。


1. Herz 框架概述

Herz 框架的核心目标是让开发者可以更加专注于业务逻辑的开发,而无需过多关注底层的基础设施。它通过集成多种基础设施服务(如服务治理、服务通信、限流熔断等)以及灵活的扩展机制,让微服务的开发更加高效、简洁。

核心特性

  1. 高性能:Herz 采用了高效的 gRPC 和 protobuf 作为通信协议,具有非常好的性能和高并发处理能力。
  2. 服务治理:内置了服务注册与发现机制,支持服务健康检查、自动负载均衡等功能。
  3. 易用性:框架提供了简洁的 API,配置简单,开发者可以快速上手。
  4. 分布式支持:具备完善的分布式架构支持,如分布式事务、分布式链路追踪等。
  5. 中间件支持:框架内置了大量的中间件支持(如日志、认证、限流、熔断、监控等),可大幅提升开发效率。

Herz 的设计哲学主要体现在:

  • 去中心化:服务间通信和治理以去中心化的方式进行,不依赖中心化的注册中心。
  • 模块化:框架内部各功能模块相互独立,可以灵活替换和扩展。

2. 安装与环境配置

2.1 安装 Herz 框架

Herz 框架本身是一个开源框架,通常可以通过 GitHub 获取和安装:

# 克隆 Herz 项目
git clone https://github.com/bytedance/herz.git

# 进入项目目录
cd herz

# 安装依赖
make install

或者直接通过 go get 获取相关的包和工具:

go get github.com/bytedance/herz

2.2 配置文件

Herz 通常使用 YAML 或 TOML 格式的配置文件来配置服务的行为,包括服务端口、负载均衡策略、服务发现地址等。

例如,在 config.yaml 文件中配置:

server:
  grpc:
    port: 9000
  http:
    port: 8000

# 服务发现配置
registry:
  type: consul
  address: 127.0.0.1:8500

log:
  level: info
  output: stdout

middleware:
  - name: logger
  - name: auth

配置文件中主要有以下几个部分:

  • server: 配置服务的 HTTP 和 gRPC 端口。
  • registry: 配置服务发现类型和地址(如 Consul)。
  • log: 配置日志输出级别。
  • middleware: 配置启用的中间件(如日志、认证等)。

3. Herz 框架核心组件

Herz 框架的核心组件包含以下几个部分:

3.1 服务注册与发现

Herz 支持多种服务发现机制,包括 Consul、etcd、Zookeeper 等。通过服务注册和发现,Herz 实现了服务的动态扩展、自动化负载均衡和高可用性。

服务注册: Herz 会在启动时将当前服务信息(如 IP、端口、健康检查等)注册到服务发现系统中。

import (
	"github.com/bytedance/herz/pkg/registry"
	"github.com/bytedance/herz/pkg/server/grpc"
)

func main() {
	// 创建一个 gRPC 服务
	srv := grpc.NewServer()
	
	// 注册到服务发现系统(例如 Consul)
	reg := registry.NewConsul("localhost:8500")
	err := reg.RegisterService("greeter", "localhost:9000")
	if err != nil {
		log.Fatalf("failed to register service: %v", err)
	}

	// 启动服务
	if err := srv.Start(); err != nil {
		log.Fatalf("failed to start server: %v", err)
	}
}

服务发现: 服务发现可以通过查询注册中心获取服务列表,从而实现负载均衡。Herz 内置了多种负载均衡策略,如轮询、加权轮询等。

// 从 Consul 中获取服务实例
service, err := reg.GetService("greeter")
if err != nil {
	log.Fatalf("failed to get service: %v", err)
}

3.2 gRPC 服务通信

Herz 框架通过 gRPC 实现服务间的高效通信。使用 Protobuf 来定义服务接口,并通过自动代码生成来实现服务调用。

  1. 定义 Proto 文件
syntax = "proto3";

package greeter;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
  1. 生成代码: Herz 会自动通过 protoc 工具来生成对应的 Go 代码。
# 生成 Protobuf 代码
protoc --go_out=. --go-grpc_out=. greeter.proto
  1. 实现服务
package greeter

import (
	"context"
	"log"

	"github.com/bytedance/herz/pkg/server/grpc"
	"github.com/bytedance/herz/pkg/middleware"
)

type GreeterService struct{}

func (s *GreeterService) SayHello(ctx context.Context, req *greeter.HelloRequest) (*greeter.HelloReply, error) {
	return &greeter.HelloReply{Message: "Hello, " + req.Name}, nil
}

func main() {
	// 创建 gRPC 服务
	srv := grpc.NewServer()

	// 注册 Greeter 服务
	greeter.RegisterGreeterServer(srv, &GreeterService{})

	// 启动服务
	if err := srv.Start(); err != nil {
		log.Fatalf("failed to start server: %v", err)
	}
}

3.3 中间件与扩展

Herz 支持中间件的自定义,框架内置了一些常用的中间件,如日志、认证、限流、熔断等。通过中间件机制,开发者可以灵活地为服务增加额外的功能。

import (
	"github.com/bytedance/herz/pkg/middleware"
	"github.com/bytedance/herz/pkg/server/grpc"
)

func main() {
	srv := grpc.NewServer(
		grpc.Middleware(
			middleware.Logging(), // 日志中间件
			middleware.Authentication(), // 认证中间件
		),
	)

	// 注册服务
	greeter.RegisterGreeterServer(srv, &GreeterService{})

	// 启动服务
	if err := srv.Start(); err != nil {
		log.Fatalf("failed to start server: %v", err)
	}
}

常见的中间件功能包括:

  • 日志中间件:用于记录请求的日志信息。
  • 认证中间件:用于服务的身份验证和授权控制。
  • 限流与熔断:基于请求频率限制访问,避免系统崩溃。

3.4 链路追踪与监控

Herz 支持与分布式追踪系统(如 Jaeger、Zipkin)集成,帮助开发者追踪服务间调用的过程,识别性能瓶颈。

trace:
  provider: jaeger
  endpoint: http://localhost:5775

通过链路追踪,可以可视化地展示服务调用链,帮助开发者在生产环境中及时发现问题。


4. Herz 框架的最佳实践

  1. 模块化设计:将业务逻辑和基础设施解耦,利用 Herz 的中间件和插件机制,尽量保持服务的独立性。
  2. 服务健康检查:在服务注册时配置健康检查,保证服务的高可用性。
  3. 合理配置负载均衡:根据实际需求选择合适的负载均衡策略,如轮询、加权轮询等。
  4. 监控与报警:结合链路追踪与监控系统(如

Prometheus、Grafana)实时监控服务的性能指标,并设置报警机制。


5. 总结

Herz 是一个高性能、轻量级的 Go 微服务框架,适用于构建高并发、高可用的分布式应用。它内置了服务发现、gRPC 通信、负载均衡、链路追踪、限流熔断等功能,同时提供了丰富的中间件支持,使得微服务开发变得更加简单高效。

Herz 的优势:

  • 强大的服务治理能力,自动化的服务注册与发现。
  • 高效的 gRPC 和 protobuf 支持,提升服务通信性能。
  • 丰富的中间件生态,易于扩展和定制。
  • 支持分布式追踪、日志、监控等功能,助力服务的可观察性。

如果你希望构建高效、稳定的分布式系统,Herz 是一个非常不错的选择。