Manba:Go 语言实现的 HTTP API 网关
一、项目简介
Manba 是一个基于 Go 语言开发的 HTTP API 网关(HTTP API Gateway)。项目地址:https://github.com/fagongzi/manba
它主要面向前置流量治理场景,提供了 API 路由、负载均衡、限流、熔断、鉴权等一整套网关所需的核心能力。相比同时期很多重量级网关(如基于 Nginx/OpenResty 的方案),Manba 的最大特点是纯 Go 实现,可单文件编译部署,配合自研的 Dashboard 提供可视化配置管理。
二、核心特性
Manba 的设计目标是在保证高性能的前提下,提供灵活、可动态调整的流量治理能力,其核心特性包括:
- 动态路由:基于
host + path匹配后端服务(upstream),支持前缀、正则、通配等多种匹配方式,路由配置可热更新。 - 负载均衡:内置多种均衡策略,如随机、轮询、一致性哈希(可基于 URI 或 Header)、加权等,支持后端节点健康检查与自动摘除。
- 限流(Rate Limit):按路由或全局维度做 QPS 限制,支持基于客户端 IP 等维度的令牌桶/漏桶限流。
- 熔断(Circuit Breaker):基于路由粒度统计请求成功/失败比例,自动降级以保护后端。
- 插件/中间件机制:内置常用插件(如请求头改写、CORS、鉴权、日志、指标采集等),并支持自定义扩展。
- 可观测性:暴露 Prometheus 指标、提供访问日志,Dashboard 中可视化展示 QPS、延迟、错误率等。
- 可视化配置:通过独立的 manba-dashboard 项目以 Web 界面管理 API、后端节点、限流熔断规则,配置变更实时下发。
三、整体架构
Manba 采用传统网关的经典分层结构,可以概括为「数据面 + 控制面」两部分:
┌──────────────────────────────────────┐
│ Client 请求 │
└──────────────────┬───────────────────┘
│
┌───────▼────────┐
│ Manba Server │ (数据面,Go 进程)
│ ┌────────────┐ │
│ │ Router │ │ 路由匹配 (host+path)
│ ├────────────┤ │
│ │ Plugins │ │ 中间件链 (限流/熔断/鉴权/日志…)
│ ├────────────┤ │
│ │ LoadBalance│ │ 负载均衡 + 健康检查
│ └────────────┘ │
└───────┬────────┘
│ 反向代理
┌───────▼────────┐
│ Upstream(s) │ 后端服务集群
└────────────────┘
▲
│ 配置同步 (etcd / API)
┌───────┴────────┐
│ Manba Dashboard│ (控制面)
└────────────────┘
数据面是真正处理转发请求的 Manba Server 进程,内部依次经过路由、插件链、负载均衡、反向代理几个阶段,最终将请求转发到后端集群。
控制面则是配置的存储与管理入口。Manba 通过 etcd 保存路由、节点、规则等元数据,Server 监听 etcd 中的变更,实时更新本地内存中的路由表与规则;Dashboard 负责将这些配置以可视化方式呈现和编辑。
四、请求处理流程
一次请求在 Manba 中大致经历如下流程:
- 接入与解析:接收 HTTP 请求,解析 Host 与 Path。
- 路由匹配:根据配置的路由规则(host/path 匹配)定位到目标 API。
- 插件链执行:按配置顺序执行路由绑定的插件,如限流检查、熔断判断、鉴权、CORS 处理、请求头改写等;任一插件否决则直接返回。
- 选择后端节点:根据负载均衡策略从该 API 对应的 upstream 中挑选一个可用节点(跳过被健康检查标记为不可用的节点)。
- 反向代理:基于
httputil.ReverseProxy一类机制,将请求转发到目标节点,记录耗时、状态码等指标。 - 响应回写与统计:将后端响应返回给客户端,并更新限流/熔断/监控统计数据。
整个流程在 Go 的 net/http 生态下完成,配合连接池、超时、重试等配置保证稳定性。
五、路由与负载均衡
路由是网关的灵魂。Manba 的路由支持多维匹配:
- Host 匹配:按域名精确匹配,用于多租户/多站点场景。
- Path 匹配:支持前缀匹配
prefix、正则匹配regex、完全匹配等,例如/api/user/*转发到用户服务。 - 动态热更新:路由变更通过 etcd 通知,无需重启进程。
负载均衡方面,Manba 为每个 upstream 维护一份后端节点列表,支持随机、轮询、一致性哈希、加权等策略。一致性哈希在需要「同一用户请求尽量打到同一后端」的场景(如带本地缓存的业务)非常有用,可以选择基于 URI 或特定 Header 做哈希键。
同时,Manba 内置健康检查能力:定期对后端节点发探测请求,标记异常节点并从可用列表中摘除,恢复后再自动加回,从而避免把流量打到故障节点。
六、限流与熔断
限流
Manba 的限流主要按 QPS 维度控制,作用于单个 API(路由)或全局。实现上一般基于 Go 的 golang.org/x/time/rate(令牌桶)或类似机制,配合按客户端 IP 等维度的计数器,达到阈值后直接返回 429 Too Many Requests。限流可有效保护后端,避免突发流量打垮服务。
熔断
熔断面向的是「后端已经不可靠」的场景。Manba 对每个路由统计一段时间窗口内的请求成功率/失败率,当失败比例超过阈值时进入熔断态,直接快速失败(或返回降级响应)一段时间,随后进入半开状态试探性放量,逐步恢复。这种机制能防止故障扩散,给后端留出恢复空间。
七、插件机制
Manba 的插件(Middleware)以链式方式组织,每个插件负责一类横切关注点:
- 鉴权类:如 Basic Auth、JWT 校验、IP 黑白名单
- 流量类:限流、熔断、重试
- 协议/内容类:CORS、请求头/响应头改写、路径重写
- 观测类:访问日志、Prometheus 指标
插件的执行顺序可在 API 配置中指定,便于组合出符合业务需求的处理链。开发者也可以参考现有插件的写法扩展自定义插件。
八、部署与配置
Manba 采用「单可执行文件 + 配置文件」的方式部署,典型步骤:
- 编译或下载
manba二进制; - 准备配置文件(监听地址、etcd 地址、日志、插件默认参数等);
- 启动 Server 进程;
- 通过 Dashboard 或直接写 etcd 完成路由/节点/规则配置;
- 配置变更自动同步到 Server 内存,实时生效。
依赖 etcd 作为配置中心是 Manba 架构中的关键设计,它让网关天然支持多实例部署:多个 Manba 实例连同一个 etcd,共享一套配置,横向扩容只需增加实例。
九、适用场景与选型建议
适合:
- 想用 Go 技术栈统一基础设施,避免引入 OpenResty/Nginx + Lua 的维护成本;
- 中小型微服务集群需要 API 路由、限流、熔断等基础治理能力;
- 需要可视化配置、动态生效的网关方案;
- 希望网关逻辑能用 Go 直接二次开发的团队。
需要注意:
- Manba 属于相对小众、较早期的开源项目,社区活跃度和更新频率不及 Kong、APISIX、Traefik 等主流网关,生产使用前建议评估维护状态;
- 依赖 etcd,需要额外的配置中心运维;
- 若追求极致的代理性能,Nginx/OpenResty 时代的方案在纯转发压测上仍具优势,需结合实际压测数据判断。
十、总结
Manba 是一个架构清晰的 Go 语言 HTTP API 网关,用「数据面 Server + 控制面 Dashboard + etcd 配置中心」的组合,实现了路由、负载均衡、限流、熔断、插件化等网关核心能力。它的价值在于以纯 Go、轻量、可扩展的方式,把微服务治理中常见的横切需求收敛到一个统一入口。
对于学习网关原理的同学,Manba 是一个很好的研读样本:它的代码结构直白,完整展示了「匹配 → 中间件 → 选节点 → 反向代理 → 统计」这条网关核心链路。对于需要自研或选型网关的团队,Manba 的思路(尤其是基于 etcd 的动态配置和插件链设计)也有很好的借鉴意义。在选型时,建议结合社区活跃度、功能完备性与自身长期维护成本综合权衡。
项目地址:https://github.com/fagongzi/manba ,可视化控制台见 manba-dashboard。




还没有评论,来说两句吧...