附录 C 按问题查源码¶
不要把读源码理解为从目录第一行逐个打开文件。带着一个可观察的问题,从入口追到状态变化,再读附近测试,通常更容易建立模型。固定 tag 与 commit 见版本说明。
go-control-plane v0.14.0¶
以下链接都指向同一固定版本。
| 我的问题 | 入口 | 阅读任务 |
|---|---|---|
| 库到底负责什么 | README | 标出 API server/cache 与业务翻译的责任边界 |
| 根与子模块依赖怎么选 | go.mod | 区分 require 和上游本地 replace |
| NewSnapshot 构造了什么 | snapshot.go | 比较 NewSnapshot、Consistent、GetVersion |
| 引用集合怎么提取 | resource.go | 找 EDS 与 RDS 引用,列出未检查关系 |
| SetSnapshot 是否自动校验 | simple.go | 看写缓存与通知 watch 的顺序、错误路径 |
| Node.ID 怎样变成缓存键 | status.go | 找 IDHash,再追 simple.go 调用点 |
| 每类型资源和版本怎么存 | resources.go | 看 NewResources 和 Items,理解名字索引 |
| server.NewServer 怎么组合协议 | server/v3/server.go | 找 SotW/Delta 组合、Callbacks 接口 |
| SotW 请求与 nonce 怎么处理 | sotw/v3/xds.go | 从 DiscoveryRequest 追到 watch 变更 |
| 响应何时发出 | sotw/v3/server.go | 区分准备响应回调与实际网络 Send |
| Delta 与 SotW 有何不同 | delta/v3/server.go | 对照新增、删除和资源级版本状态 |
| ADS gRPC 注册是什么 | ads.pb.go | 找 RegisterAggregatedDiscoveryServiceServer |
建议先把实验二的 buildSnapshot 一类资源构造函数与这些接口对上,再挑一个测试文件复现自己的问题。不要复制缓存内部私有类型来扩展业务,它们的实现细节不构成稳定产品接口。
Envoy Gateway v1.9.2¶
| 我的问题 | 固定版本入口 | 阅读任务 |
|---|---|---|
| 支持哪些版本 | matrix.md | 记录 EG、Gateway API、K8s、Envoy 四维关系 |
| 程序怎么启动 | cmd/envoy-gateway | 追运行配置与 server 组装 |
| Kubernetes 对象从哪里来 | internal/provider/kubernetes | 找 watch、对象选择与状态更新 |
| HTTPRoute 如何翻译 | internal/gatewayapi | 找 parent/引用校验与规则处理 |
| 中间表示有哪些字段 | internal/ir | 把外部 API 与 IR 做一对多映射 |
| IR 如何变成 Envoy 资源 | internal/xds/translator | 追 Listener、Route、Cluster 和 EDS 构造 |
| xDS 如何运行 | internal/xds/server | 看 cache/server、节点与资源发布 |
| 谁创建数据平面资源 | internal/infrastructure | 区分配置翻译与 Deployment/Service 管理 |
| 策略字段是否真实存在 | api/v1alpha1 | 查字段、校验与生成 CRD,别只看旧教程 |
| 当前输入应生成什么结果 | gatewayapi/testdata | 选最小 fixture,比较输入、IR 与状态 |
| 安装资源怎么打包 | charts/gateway-helm | 核对 CRD、RBAC、镜像与值配置 |
这些目录展示架构边界,不表示请求会逐个经过这些 Go 包。业务数据由生成配置后的 Envoy 处理;这些包主要参与配置与基础设施管理。
一页源码笔记模板¶
问题:我在实验里观察到什么?
版本:tag / commit / 工具版本
入口:包、函数、输入对象
转换:调用哪些函数,改变什么状态
输出:资源、事件、响应或错误
边界:源码保证什么,什么仍要由调用者负责
证据:对应测试/命令/真实请求
未解问题:下一步需要沿哪条调用关系继续查
写出这七项,通常比粘贴大段代码更能帮助下一次阅读。