Easegress 源码阅读指南

Categories: Easegress

Read in English

Easegress 源码阅读指南

目录


1. 项目概览

Easegress 是一个云原生流量编排(Traffic Orchestration)网关,由 Go 语言编写,采用声明式配置 + 控制器模式管理所有组件。项目使用 etcd 做分布式配置存储,支持 HTTP/gRPC/MQTT 等多协议代理。

  • 仓库地址github.com/megaease/easegress/v2
  • Go 版本:1.26
  • 当前版本:v2.11.0
  • 许可证:Apache License 2.0

目录总览

easegress/
├── cmd/                    # 三个二进制的入口
│   ├── server/main.go      # easegress-server 入口
│   ├── client/main.go      # egctl 命令行工具入口
│   └── builder/main.go     # egbuilder 自定义构建工具入口
├── cmd/server.go           # RunServer() 编排函数
├── pkg/                    # 所有核心库代码(22 个包)
├── build/                  # Dockerfile 和集成测试
├── docs/                   # 文档站点
├── example/                # 集群示例配置
├── helm-charts/            # Helm Chart
├── scripts/                # 辅助脚本
├── Makefile                # 构建系统
└── go.mod                  # 单 module 定义

三个二进制产物

二进制 入口 用途
easegress-server cmd/server/main.go:26 核心网关服务进程
egctl cmd/client/main.go:53 管理命令行工具(基于 Cobra)
egbuilder cmd/builder/main.go:36 自定义模块构建工具

2. 构建与运行

构建命令

# 构建全部三个二进制
make build

# 仅构建 server
make build_server

# 构建 Docker 镜像
make build_docker

# 运行测试
make test

# 代码格式化与检查
make fmt
make vet

Makefile 关键变量(Makefile:20

  • RELEASE = v2.11.0
  • Server 构建包含 wasmhost build tag,需开启 CGO
  • GoReleaser 配置见 .goreleaser.yml,支持 linux/darwin + amd64/arm64 交叉编译

3. 启动流程

服务器启动的完整流程位于 cmd/server.go:40-147RunServer() 函数。按顺序:

1. option.New().Parse()           — 解析启动选项和配置文件
2. env.InitServerDir()            — 初始化服务端目录结构
3. logger.Init(opt)               — 初始化结构化日志(基于 zap)
4. cluster.New(opt)               — 启动嵌入式 etcd 或连接外部集群
5. supervisor.MustNew(opt, cls)   — 创建 Supervisor,初始化 SystemController
6. api.MustNewServer(...)         — 启动 Admin API HTTP 服务
7. 注册 Graceful Upgrade 信号处理
8. 阻塞等待 SIGINT/SIGTERM,优雅关闭

关键点

  • 步骤 4-6 之间存在严格的顺序依赖:集群必须先就绪,Supervisor 才能监听配置变更,API Server 才能对外暴露管理接口。
  • 步骤 5 中 Supervisor 内部会初始化所有 SystemController(按依赖顺序),然后启动 go s.run() 协程监听配置变更。

4. 核心架构

4.1 Object 体系(对象注册与生命周期)

Easegress 中所有被管理的组件都实现 Object 接口,这是理解整个项目最重要的抽象。

核心定义位于 pkg/supervisor/registry.go:30-47

type Object interface {
    Category() ObjectCategory   // 对象类别(决定启动/销毁顺序)
    Kind() string               // 唯一类型标识
    DefaultSpec() interface{}   // 返回默认配置(必须是指针指向结构体)
    Status() *Status            // 运行时状态
    Close()                     // 销毁时调用
}

对象类别pkg/supervisor/registry.go:102-113)按照启动优先级排序:

类别 说明 实例
SystemController 系统内置控制器,最先启动 TrafficController, MeshController, AutoCertManager
BusinessController 用户创建的控制器 IngressController, GatewayController, WAFController
Pipeline 流量处理管线 Pipeline
TrafficGate 协议监听入口 HTTPServer, gRPCServer, MQTTProxy

对象注册机制:通过在 init() 函数中调用 supervisor.Register(&MyObject{}) 实现自注册。pkg/registry/registry.go 使用空白导入(blank-import)触发所有 filter 和 object 包的 init()

// pkg/registry/registry.go
import (
    _ "github.com/megaease/easegress/v2/pkg/filters/httpproxy"
    _ "github.com/megaease/easegress/v2/pkg/object/httpserver"
    // ... 所有 filter 和 object 包
)

cmd/server/main.go 通过导入 pkg/registry 完成所有模块的自动注册。

4.2 Spec 系统(声明式配置)

定义位于 pkg/supervisor/spec.go

// Spec (pkg/supervisor/spec.go:34) — 通用对象配置
type Spec struct {
    super       *Supervisor
    category    ObjectCategory
    jsonConfig  string            // 原始 JSON 配置
    meta        *MetaSpec         // 元数据
    rawSpec     map[string]interface{}  // 未反序列化的原始 map
    objectSpec  interface{}       // 反序列化后的 Go 结构体
}

// MetaSpec (pkg/supervisor/spec.go:45) — 公共元数据
type MetaSpec struct {
    Name      string            `json:"name" jsonschema:"required,format=urlname"`
    Kind      string            `json:"kind" jsonschema:"required"`
    Version   string            `json:"version,omitempty"`
    Labels    map[string]string `json:"labels,omitempty"`
    CreatedAt string            `json:"createdAt,omitempty"`
}

设计要点

  • 所有对象配置在 etcd 中存储为 JSON/YAML,通过 MetaSpec.Kind 路由到对应的 Object 实现。
  • Spec 同时持有原始数据(rawSpec)和反序列化后的 Go 结构体(objectSpec),便于验证和透传。
  • jsonschema struct tag 驱动自动校验,详见 4.10 校验系统

4.3 Supervisor(生命周期管理)

定义位于 pkg/supervisor/supervisor.go:36

Supervisor 是对象生命周期的管理者,核心职责:

  1. 持有 ObjectRegistrypkg/supervisor/object.go:39-45)—— 一个保存在 etcd 中配置的本地缓存
  2. 持有 ObjectEntityWatcherpkg/supervisor/object.go)—— 监听 etcd 中配置的增/删/改事件
  3. 初始化和启动 SystemControllersupervisor.go:103
  4. 运行事件循环go s.run() at line 105)—— 收到配置变更事件后,创建/更新/删除 ObjectEntity
// ObjectEntity (pkg/supervisor/object.go:39-45) — Object 的运行时包装
type ObjectEntity struct {
    instance   Object      // 实际的 Object 实现
    spec       *Spec       // 关联的配置
    generation int64       // 代数(每次更新递增,用于 CAS 检测)
}

4.4 Cluster(集群与存储)

定义位于 pkg/cluster/cluster_interface.go:33

type Cluster interface {
    IsLeader() bool
    Layout() *Layout

    // KV 操作
    Get(key string) (*string, error)
    GetPrefix(prefix string) (map[string]string, error)
    Put(key, value string) error
    Delete(key string) error
    DeletePrefix(prefix string) error

    // 原子操作(基于 etcd STM)
    STM(apply func(concurrency.STM) error) error

    // 配置变更监听
    Watcher() (Watcher, error)
    Syncer(pullInterval time.Duration) (Syncer, error)

    // Leader 选举
    Mutex(name string, ttl time.Duration) concurrency.Locker
}

关键子接口

  • Watcher (pkg/cluster/cluster_interface.go:76):实时监听 etcd 中指定 key/prefix 的变更事件
  • Syncer (pkg/cluster/cluster_interface.go:91):维护本地缓存,通过周期性全量拉取保持与 etcd 同步

4.5 Traffic Pipeline(流量管线)

pkg/context/context.go 定义了流量处理的上下文载体。

// Handler (pkg/context/context.go:35) — 所有流量处理器的接口
type Handler interface {
    Handle(ctx *Context) string   // 返回结果字符串(空串表示成功继续)
}

// MuxMapper (pkg/context/context.go:40) — 按名称查找 Handler
type MuxMapper interface {
    GetHandler(name string) (Handler, bool)
}

Pipeline 结构pkg/object/pipeline/pipeline.go:63):

type Pipeline struct {
    filters map[string]filters.Filter  // 所有 Filter 实例(按 name 索引)
    flow    []FlowNode                  // 处理流程定义(顺序执行 + 条件跳转)
}

流量处理流程

TrafficGate (e.g. HTTPServer)
    → 路由匹配
        → Pipeline
            → FlowNode[0] → Filter A → 根据结果跳转
                → FlowNode[1] → Filter B
                    → ...
                        → 返回响应

Context 在整条链路上传递 RequestResponse,每个 Filter 可以读写 Context。

4.6 Filter 体系(过滤器)

核心接口 位于 pkg/filters/filters.go

// Kind (pkg/filters/filters.go:33) — 描述一种 Filter 类型的元信息
type Kind struct {
    Name           string
    Description    string
    Results        []string                             // 除空串外的所有可能结果
    CreateInstance func(spec Spec) Filter               // 工厂函数
    DefaultSpec    func() Spec                          // 返回默认配置副本
}

// Filter (pkg/filters/filters.go:54) — 过滤器基础接口
type Filter interface {
    Name() string
    Kind() *Kind
    Handle(*context.Context) string
}

Filter 插件注册表位于 pkg/filters/registry.go,通过 filters.Register(k *Kind) 注册。

内置 Filter 列表(27 种):

分类 Filter 功能
代理 httpproxy HTTP 反向代理
代理 grpcproxy gRPC 代理
代理 aigatewayproxy AI 网关代理
安全 validator 请求校验
安全 waf Web 应用防火墙(基于 Coraza)
安全 oidcadaptor OIDC 认证适配
安全 corsadaptor CORS 处理
流量控制 ratelimiter 限流
流量控制 circuitbreaker 熔断(resilience 模块)
路由 redirector / redirectorv2 重定向
路由 headerlookup Header 路由匹配
路由 headertojson Header 转 JSON
消息 kafka / kafkabackend Kafka 消息处理
消息 mqttclientauth MQTT 客户端认证
消息 topicmapper MQTT 主题映射
服务网格 meshadaptor 网格适配
扩展 wasmhost WebAssembly 沙箱
扩展 remotefilter 远程过滤器调用
扩展 builder 构建期动态 Filter
策略 opafilter OPA 策略引擎
工具 fileserver 静态文件服务
工具 mock Mock 响应
工具 fallback 降级兜底
工具 certextractor 证书提取
工具 connectcontrol 连接控制

4.7 Protocol 抽象(协议层)

定义位于 pkg/protocols/protocols.go

// Request (pkg/protocols/protocols.go:39) — 协议无关的请求接口
type Request interface {
    Header() Header
    RealIP() string
    IsStream() bool
    SetPayload(payload interface{})
    // ...
}

// Response (pkg/protocols/protocols.go:84) — 协议无关的响应接口
type Response interface {
    Header() Header
    SetPayload(payload interface{})
    // ...
}

// Protocol (pkg/protocols/protocols.go:143) — 协议实现
type Protocol interface {
    CreateRequest(r io.Reader) (Request, error)
    CreateResponse(body io.Reader) (Response, error)
    // ...
}

已实现的协议

协议 包路径
HTTP pkg/protocols/httpprot/
gRPC pkg/protocols/grpcprot/
MQTT pkg/protocols/mqttprot/

协议通过 protocols.Register(name, p) 注册到全局注册表。

4.8 Resilience(弹性策略)

定义位于 pkg/resilience/resilience.go

// Wrapper (pkg/resilience/resilience.go:46) — 包装 HandlerFunc
type Wrapper interface {
    Wrap(HandlerFunc) HandlerFunc
}

// HandlerFunc (pkg/resilience/resilience.go:43)
type HandlerFunc func(ctx context.Context) error

弹性和容错策略以 装饰器模式 包裹 Filter 的 Handle 调用:

Wrapper(Filter.Handle) → 执行 Filter 逻辑,按策略容错

内置策略

策略 文件
CircuitBreaker(熔断) pkg/resilience/circuitbreaker.go
Retry(重试) pkg/resilience/retry.go

4.9 Admin API

定义位于 pkg/api/api.gopkg/api/server.go

Admin API 使用 go-chi/chi 作为 HTTP 路由框架,提供动态路由注册能力(pkg/api/dynamicmux.go 支持热更新路由表)。

// Entry (pkg/api/server.go:59)
type Entry struct {
    Path    string           // API 路径
    Method  string           // HTTP 方法
    Handler http.HandlerFunc // 处理函数
}

API 通过 api.RegisterAPIs(group) 注册,按功能分组(如 v2 API、健康检查、Profile 等),最终挂载到 API Server。

4.10 校验系统

定义位于 pkg/v/v.go

Easegress 使用 JSON Schema 做配置校验。通过读取 Go struct 上的 jsonschema tag,自动生成 JSON Schema,在校验环节使用。

自定义格式校验器pkg/v/format.go:31):

格式 说明
urlname URL 安全名称
duration 时间间隔(如 10s5m
ipcidr IP CIDR 格式
regexp 正则表达式
base64 Base64 编码
byteurl 字节大小 + URL 格式

5. 对象分类详解

Easegress 中所有管理对象通过 Supervisor 统一生命周期管理,按运行时依赖关系分类如下:

SystemController

系统内置,单体实例,在 Supervisor 启动时最先初始化。

对象 包路径 职责
TrafficController pkg/object/trafficcontroller/ 管理 TrafficGate 和 Pipeline 的创建/销毁
MeshController pkg/object/meshcontroller/ 服务网格控制平面(支持 Eureka/Consul/Nacos 等服务发现)
AutoCertManager pkg/object/autocertmanager/ 自动 TLS 证书管理(ACME)

BusinessController

用户通过 Admin API 或配置文件创建的业务控制器。

对象 包路径 职责
IngressController pkg/object/ingresscontroller/ Kubernetes Ingress 控制器
GatewayController pkg/object/gatewaycontroller/ Kubernetes Gateway API 控制器
WAFController pkg/object/wafcontroller/ Web 应用防火墙控管
GlobalFilter pkg/object/globalfilter/ 全局 Filter 管理
AIGatewayController pkg/object/aigatewaycontroller/ AI 网关(LLM 代理)管理
StatusSyncController pkg/object/statussynccontroller/ 状态同步
Function pkg/object/function/ Serverless Function
RawConfigTrafficController pkg/object/rawconfigtrafficcontroller/ 原始配置方式的流量管理

服务注册中心适配器

服务发现 包路径
Consul pkg/object/consulserviceregistry/
Etcd pkg/object/etcdserviceregistry/
Eureka pkg/object/eurekaserviceregistry/
Nacos pkg/object/nacosserviceregistry/
ZooKeeper pkg/object/zookeeperserviceregistry/

TrafficGate

协议监听入口,负责接收外部流量并按路由规则转发至 Pipeline。

对象 包路径 协议
HTTPServer pkg/object/httpserver/ HTTP/HTTPS
gRPCServer pkg/object/grpcserver/ gRPC
MQTTProxy pkg/object/mqttproxy/ MQTT

Pipeline

位于 pkg/object/pipeline/,将一组 Filter 组装成处理链。一个 Pipeline 可被多个路由引用,一个 TrafficGate 可挂载多个 Pipeline。


6. 阅读路径建议

根据不同学习目标,推荐以下源码阅读顺序:

路径 A:理解整体架构(推荐所有人先读)

  1. cmd/server.go — 启动流程编排,建立全局认知
  2. pkg/supervisor/registry.go — Object 接口定义,理解对象体系
  3. pkg/supervisor/spec.go — Spec/MetaSpec 定义,理解配置模型
  4. pkg/supervisor/supervisor.go — Supervisor 生命周期管理
  5. pkg/cluster/cluster_interface.go — Cluster 接口,理解配置存储
  6. pkg/registry/registry.go — 看全貌:所有注册的 filter 和 object

路径 B:深入流量处理流程

  1. pkg/context/context.go — Context、Handler、MuxMapper
  2. pkg/protocols/protocols.go — Request/Response/Protocol 接口
  3. pkg/object/pipeline/pipeline.go — Pipeline 如何组织 Filter 链
  4. pkg/filters/filters.go — Filter 接口和 Kind 定义
  5. pkg/filters/httpproxy/ — 选一个具体 filter(如 HTTP 代理)深入阅读
  6. pkg/object/httpserver/ — 看入口 Gate 如何创建并路由到 Pipeline

路径 C:研究特定功能

想了解什么 从这里开始
服务网格(Service Mesh) pkg/object/meshcontroller/ + pkg/filters/meshadaptor/
OIDC 认证 pkg/filters/oidcadaptor/
AI Gateway pkg/object/aigatewaycontroller/ + pkg/filters/aigatewayproxy/
WAF 防火墙 pkg/object/wafcontroller/ + pkg/filters/waf/
Kubernetes 集成 pkg/object/ingresscontroller/ + pkg/object/gatewaycontroller/
MQTT 代理 pkg/protocols/mqttprot/ + pkg/object/mqttproxy/
WebAssembly 扩展 pkg/filters/wasmhost/
分布式追踪 pkg/tracing/
OPA 策略引擎 pkg/filters/opafilter/

路径 D:开发新 Filter

  1. pkg/filters/filters.go — 理解 Filter 接口
  2. pkg/filters/registry.go — 了解注册机制
  3. pkg/filters/httpproxy/pkg/filters/ratelimiter/ — 参考现有 Filter 实现
  4. pkg/context/context.go — 理解 Handle(*Context) 的入参

路径 E:开发新 Object(控制器/TrafficGate)

  1. pkg/supervisor/registry.go — Object 接口和注册机制
  2. pkg/object/trafficcontroller/ — SystemController 参考实现
  3. pkg/object/httpserver/ — TrafficGate 参考实现
  4. pkg/object/pipeline/ — Pipeline 参考实现

附录:关键文件索引

文件 核心内容
cmd/server.go:40-147 RunServer() 启动编排
pkg/supervisor/registry.go:30-113 Object/ObjectCategory 接口定义
pkg/supervisor/spec.go:34-53 Spec/MetaSpec 类型
pkg/supervisor/supervisor.go:36 Supervisor 结构体
pkg/supervisor/object.go:39 ObjectEntity/ObjectRegistry
pkg/cluster/cluster_interface.go:33 Cluster 接口
pkg/context/context.go:35-42 Handler/MuxMapper 接口
pkg/context/context.go:70 Context 结构体
pkg/protocols/protocols.go:39-143 Request/Response/Protocol 接口
pkg/filters/filters.go:33-60 Kind/Filter 接口
pkg/filters/registry.go Filter 注册表
pkg/resilience/resilience.go:30-116 Policy/Wrapper 接口
pkg/v/v.go JSON Schema 校验
pkg/v/format.go:31 自定义格式校验器
pkg/api/server.go:37-80 Admin API Server
pkg/registry/registry.go 全局注册表(空白导入)
go.mod:1 Module 定义(v2)
Makefile:20 版本号和构建配置
Read More

APISIX CLI ops.lua 源码分析

【2026-07-29】APISIX CLI ops.lua 源码分析 - 命令路由、init 配置生成、start/stop/reload 进程管理、安全与设计亮点