状态更新:当前仓库已退出主路径。
sidecar-agent已从service-mesh方案中独立出来,成为当前裸机治理与代理主线;本仓库保留为历史实现与代码参考,不再建议继续投入新功能。
service-mesh 是 firefly 体系中面向非 K8s 阶段的轻量服务网格项目,用于承接:
go-micro/invocation的统一业务调用语义agent优先的数据面治理模型- 外挂
Authz对齐Envoy ext_authz consul / etcd这类目录来源的统一适配
- 当前定位已降级为历史仓库与能力参考
- 默认运行模式与 sidecar/control plane 设计不再作为现行主路径推进
- 现行裸机主路径为
go-consul/agent -> sidecar-agent -> consul / envoy - 进入
K8s + Istio阶段后,由平台侧主数据面替换
第一阶段重点不是一次性做完整 service mesh,而是先跑通这条主链路:
service
-> go-micro/invocation
-> local service-mesh
-> authz(ext_authz)
-> source(consul / etcd)
-> remote service
- 第一版:
- 完成仓库骨架、CLI、配置模型
- 第二版:
- 跑通
Buf CLI - 跑通本地
InvokegRPC 服务
- 跑通
- 第三版当前范围已完成:
- 接入真实
consul source - 接入真实 gRPC transport
method统一使用完整 gRPC method path
- 接入真实
- 第四版当前范围已完成:
- 接入真实
ext_authz client - 实现
fail-close / fail-open - 实现 Authz timeout 与错误处理
- 接入真实
- 第五版当前范围已完成:
- 接入真实
etcd source - 输出统一
ServiceSnapshot - 与
consul source保持一致的内部快照语义
- 接入真实
- 第七版当前范围已完成:
- 接入 OTel trace provider
- 接入 OTel metric provider
- 为 Invoke 调用链补充基础埋点与 gRPC instrumentation
- 第八版当前范围已完成:
- 最小
MeshControlPlaneService - dataplane register / heartbeat
- 基础
ServiceSnapshot / RoutePolicy下发
- 最小
- 第九版当前范围已完成:
- 让 controlplane 下发
ServiceSnapshot真正进入 dataplane 生效链 - 让 controlplane 下发
RoutePolicy真正影响 timeout / retry - 保持 controlplane 优先、本地配置与目录回退
- 让 controlplane 下发
- 第十版当前范围已完成:
- 让
sidecar运行时复用同一套 dataplane 主链 - 让
sidecar具备 invoke / controlplane / telemetry 基础能力 - 验证 agent / sidecar 只保留运行时身份与监听差异
- 让
- 第十一版当前范围已完成:
- sidecar 具备更明确的
service / namespace / env / instance_id本地身份 - controlplane register 使用 sidecar 精确身份
- sidecar 更容易命中按服务维度下发的 snapshot / route policy
- sidecar 具备更明确的
- 第十二版当前范围已完成:
- sidecar 自动补齐 caller identity
- sidecar 自动补齐默认
namespace / env - sidecar 拒绝与本地绑定身份冲突的调用上下文
- 第十三版当前范围已完成:
- agent / sidecar 本地监听当前明确收敛为
tcp - 运行时本地入口配置统一收敛为
runtime.<mode>.address - sidecar 不再接受指向本地绑定服务身份的目标
- sidecar 更明确地只承担“本地服务 -> 上游服务”的代理边界
- sidecar 通过
target_mode显式声明目标策略,默认upstream_only - sidecar 可通过
allow_cross_scope_same_service放宽“同名但跨 namespace / env”的目标
- agent / sidecar 本地监听当前明确收敛为
- 第十四版当前范围已完成:
- control plane 成为 dataplane 默认主路径
- control plane 开启时默认不再回退本地 source
- register 后 dataplane 默认消费控制面当前已知的全量快照与策略
- 第十五版当前范围已完成首轮:
- control plane 具备最小 source cache loader
- source 快照进入 control plane store 后可生成递增 revision
- dataplane 可通过 control stream 自动订阅目标服务
pull + cache刷新结果可主动推送给已连接 dataplane- control plane 已支持按已知目标做周期 refresh
- 为后续 watch / 增量更新保留基础广播链路
- 第十六版当前范围已完成首轮:
- dataplane identity 在 runtime 内按进程级稳定生成
- agent / sidecar 统一复用同一套 register identity 构造逻辑
- 启动日志与 OTel resource 已挂上 dataplane identity 关键字段
- control plane 对订阅目标的推送已按目标粒度收敛,而不是默认广播给所有 dataplane
- register 阶段的 snapshot / route policy 回放已按 dataplane identity 的 namespace / env 收敛
- subscribe 阶段的 route policy 同步也已按目标订阅与 dataplane identity 收敛
- route policy 主动变更已支持按目标订阅与 dataplane identity 定向推送
- snapshot / route policy 下发判定已收敛到统一匹配层,减少后续规则漂移
- snapshot / route policy / subscriber 的 selector 模型已显式化,后续下发规则更易扩展
- matcher / selector 组件已从 server 主文件中拆出,便于后续继续扩规则而不堆积在 server.go
- matcher 已显式区分 exact / fallback 优先级,为后续更复杂命中顺序保留清晰语义
- register 回放等多候选资源选择已优先取 exact 命中,必要时才回退 fallback
- 主动推送路径也开始复用 exact / fallback 裁决,避免 fallback 资源覆盖 exact 订阅者
- resource arbitration 入口已统一化,register / subscribe / 主动推送开始复用同一套候选裁决模型
- arbitration cache 已引入,减少同一轮 register / subscribe / push 中的重复裁决构造成本
- delivery cycle 上下文已承接 target 级裁决,subscribe / push 进一步从 server 主流程下沉
- changed snapshot / already-sent policy 等本轮局部状态也已下沉到 delivery cycle,减少 server 主流程分支噪音
- push 路径的目标投递判定也开始收敛为统一 delivery plan,broadcast 逻辑进一步瘦身
- register / subscribe / push 三条路径开始复用统一 delivery batch 模型,stream 回放与异步推送的输出形态继续收敛
- route policy 主动推送也已并入通用 response / batch 路径,减少独立 push 分支
- delivery batch 已开始内聚 response / delivery 追加逻辑,为后续 builder / planner 继续演进打底
- subscribe response 与 target broadcast plan 已直接由 batch builder 构造,
server.go进一步退回调度职责 - batch builder 已补齐集合追加与 push response 入口,旧的零散 helper 继续收口
- source watch 抽象已落地,memory provider 与 controlplane loader 已具备最小 watch bridge
- controlplane server 已可消费 watch update,并把 source 变更主动推送给已连接 dataplane
- consul / etcd 的 polling watch 已收敛为通用 watch runner,减少双份 watcher 骨架
- controlplane 内部已引入 watch manager,开始统一 tracked target 的 watch 生命周期管理
- snapshot delete 已有显式 control 消息,watch delete 现在能真正从 controlplane 推到 dataplane 并删除本地状态
- snapshot status 已支持
current / stale / degraded,为 source 不可达时的降级语义打底 - dataplane 已显式消费
stale / degraded:stale 可继续路由,degraded 会拒绝调用或回退原始 source - polling watch 已支持
stale -> degraded升级,watch manager 也开始具备自动重建能力 - source watch 的 degraded 阈值已支持按 provider 配置,watch 错误原因也开始带上统一分类
- controlplane 已开始为 watch restart 与 snapshot status / reason class 输出最小观测出口
consul / etcd的“空健康实例”错误已开始收敛为统一empty类,便于后续做 provider-specific 错误策略- M16 也已开始补 explain:register / subscribe / target push 会输出 identity 与投递决策摘要
- push explain 现在已细化到 subscription / identity 的 exact / fallback 命中统计
- register / subscribe replay 也开始输出 snapshot / route policy 的 exact / fallback 命中统计
- explain 统计已开始进入 controlplane telemetry,给后续指标化排障打底
- target push 已开始输出 subscriber 级 decision trace 摘要,便于直接排查投递命中路径
- decision trace 已按 subscriber 稳定排序,并输出 trace_total / trace_shown,避免排障结果漂移
- decision trace 已开始具备正式结构化导出视图,便于后续做 trace/export 而不依赖字符串拼接
- controlplane server 已开始提供可调用的 replay / push explain 导出方法,便于后续接调试接口
- subscribe replay explain 导出已补齐,register / subscribe / push 三类调试视图开始对齐
- controlplane 当前 subscriber / tracked target 状态也已可结构化导出,开始具备最小 debug state 视图
- debug state 现在也已覆盖 store 内 snapshot / route policy 当前状态,调试视图开始包含“连接态 + 资源态”
- M17 也已开始起步:original end-user identity 已有标准 metadata key、invoke span 属性与 ext_authz context_extensions 透传
- original end-user identity 当前已显式标记为
metadata / unverified,并与 caller identity 分离保留 - effective principal 也已开始显式收敛:优先 original user,其次 caller service
- issuer-only original metadata 不会单独升级为 effective principal,避免仅凭来源说明字段切换主体
- trusted injector 已有最小边界:仅 sidecar 显式配置后才会把 original identity trust 升为
local - 仓库现在已补一版最小可运行 MVP:可直接启动静态 controlplane 与示例 sidecar,见 MVP_QUICKSTART.md
- MVP 现在也已补 demo upstream 与 demo client,可直接做一次真实端到端调用
- consul / etcd / ext_authz / telemetry 初始化等外部交互已补齐默认超时保护,避免缺环境时长时间挂起
- 业务服务不直接调 Authz
- 业务服务不直接做节点发现
- Invoke / Control 使用自定义 Proto
- Authz 直接复用
Envoy ext_authz - Observe 优先复用 OpenTelemetry
- Proto 源文件放在:
proto/acme/invoke/v1proto/acme/control/v1
- 使用
proto/buf.yaml管理模块、lint 与 breaking - 使用仓库根
buf.gen.yaml管理生成规则 - 生成代码输出到:
.gen/proto
常用命令:
buf lint proto
buf generate参考:
- 第一版先手写构造与装配
- 当前不引入
Wire - 当 controlplane / dataplane / source / integration 的装配复杂度明显上升后,再评估是否引入
当前设计文档位于:
推荐先看当前重构版:
- v2/README.md
- service-mesh-minimal-architecture.md
- service-mesh-module-split.md
- service-mesh-runtime-modes.md
- service-mesh-data-plane.md
- service-mesh-control-plane.md
- service-mesh-source-watch.md
- service-mesh-proto-boundary.md
- service-mesh-config-boundary.md
- service-mesh-observability-boundary.md
- service-mesh-identity-boundary.md
- service-mesh-delivery-boundary.md
- service-mesh-source-provider-matrix.md
- service-mesh-state-model.md
- service-mesh-migration-playbook.md
- service-mesh-runtime-assembly.md
- service-mesh-code-refactor-checklist.md
- service-mesh-v2-roadmap.md
- MODULES.md
历史方案与实现演进可继续参考: