Easegress 源码阅读指南
Categories: Easegress
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 构建包含
wasmhostbuild tag,需开启 CGO - GoReleaser 配置见
.goreleaser.yml,支持 linux/darwin + amd64/arm64 交叉编译
3. 启动流程
服务器启动的完整流程位于 cmd/server.go:40-147 的 RunServer() 函数。按顺序:
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),便于验证和透传。jsonschemastruct tag 驱动自动校验,详见 4.10 校验系统。
4.3 Supervisor(生命周期管理)
定义位于 pkg/supervisor/supervisor.go:36:
Supervisor 是对象生命周期的管理者,核心职责:
- 持有 ObjectRegistry(
pkg/supervisor/object.go:39-45)—— 一个保存在 etcd 中配置的本地缓存 - 持有 ObjectEntityWatcher(
pkg/supervisor/object.go)—— 监听 etcd 中配置的增/删/改事件 - 初始化和启动 SystemController(
supervisor.go:103) - 运行事件循环(
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 在整条链路上传递 Request 和 Response,每个 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.go 和 pkg/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 |
时间间隔(如 10s、5m) |
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:理解整体架构(推荐所有人先读)
cmd/server.go— 启动流程编排,建立全局认知pkg/supervisor/registry.go— Object 接口定义,理解对象体系pkg/supervisor/spec.go— Spec/MetaSpec 定义,理解配置模型pkg/supervisor/supervisor.go— Supervisor 生命周期管理pkg/cluster/cluster_interface.go— Cluster 接口,理解配置存储pkg/registry/registry.go— 看全貌:所有注册的 filter 和 object
路径 B:深入流量处理流程
pkg/context/context.go— Context、Handler、MuxMapperpkg/protocols/protocols.go— Request/Response/Protocol 接口pkg/object/pipeline/pipeline.go— Pipeline 如何组织 Filter 链pkg/filters/filters.go— Filter 接口和 Kind 定义pkg/filters/httpproxy/— 选一个具体 filter(如 HTTP 代理)深入阅读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
pkg/filters/filters.go— 理解 Filter 接口pkg/filters/registry.go— 了解注册机制pkg/filters/httpproxy/或pkg/filters/ratelimiter/— 参考现有 Filter 实现pkg/context/context.go— 理解Handle(*Context)的入参
路径 E:开发新 Object(控制器/TrafficGate)
pkg/supervisor/registry.go— Object 接口和注册机制pkg/object/trafficcontroller/— SystemController 参考实现pkg/object/httpserver/— TrafficGate 参考实现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 |
版本号和构建配置 |