本文作者:icy

Golang-Manba:Go 语言实现的 HTTP API 网关

icy 11分钟前 2 抢沙发
Golang-Manba:Go 语言实现的 HTTP API 网关摘要: Manba:Go 语言实现的 HTTP API 网关 一、项目简介 Manba 是一个基于 Go 语言开发的 HTTP API 网关(HTTP API Gateway)。项目地址:...

Golang-Manba:Go 语言实现的 HTTP API 网关

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 采用传统网关的经典分层结构,可以概括为「数据面 + 控制面」两部分:

Plain text
         ┌──────────────────────────────────────┐
         │            Client 请求                │
         └──────────────────┬───────────────────┘
                            │
                    ┌───────▼────────┐
                    │   Manba Server  │  (数据面,Go 进程)
                    │ ┌────────────┐  │
                    │ │  Router    │  │  路由匹配 (host+path)
                    │ ├────────────┤  │
                    │ │  Plugins   │  │  中间件链 (限流/熔断/鉴权/日志…)
                    │ ├────────────┤  │
                    │ │ LoadBalance│  │  负载均衡 + 健康检查
                    │ └────────────┘  │
                    └───────┬────────┘
                            │ 反向代理
                    ┌───────▼────────┐
                    │   Upstream(s)  │  后端服务集群
                    └────────────────┘
                            ▲
                            │ 配置同步 (etcd / API)
                    ┌───────┴────────┐
                    │ Manba Dashboard│  (控制面)
                    └────────────────┘

数据面是真正处理转发请求的 Manba Server 进程,内部依次经过路由、插件链、负载均衡、反向代理几个阶段,最终将请求转发到后端集群。

控制面则是配置的存储与管理入口。Manba 通过 etcd 保存路由、节点、规则等元数据,Server 监听 etcd 中的变更,实时更新本地内存中的路由表与规则;Dashboard 负责将这些配置以可视化方式呈现和编辑。

四、请求处理流程

一次请求在 Manba 中大致经历如下流程:

  1. 接入与解析:接收 HTTP 请求,解析 Host 与 Path。
  2. 路由匹配:根据配置的路由规则(host/path 匹配)定位到目标 API。
  3. 插件链执行:按配置顺序执行路由绑定的插件,如限流检查、熔断判断、鉴权、CORS 处理、请求头改写等;任一插件否决则直接返回。
  4. 选择后端节点:根据负载均衡策略从该 API 对应的 upstream 中挑选一个可用节点(跳过被健康检查标记为不可用的节点)。
  5. 反向代理:基于 httputil.ReverseProxy 一类机制,将请求转发到目标节点,记录耗时、状态码等指标。
  6. 响应回写与统计:将后端响应返回给客户端,并更新限流/熔断/监控统计数据。

整个流程在 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 采用「单可执行文件 + 配置文件」的方式部署,典型步骤:

  1. 编译或下载 manba 二进制;
  2. 准备配置文件(监听地址、etcd 地址、日志、插件默认参数等);
  3. 启动 Server 进程;
  4. 通过 Dashboard 或直接写 etcd 完成路由/节点/规则配置;
  5. 配置变更自动同步到 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。

manba_20261105184332.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/golang/1493.html发布于 11分钟前
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,2人围观)参与讨论

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