必须在Go-Zero网关中通过自定义聚合处理器实现多服务并行调用:定义聚合路由、编写含超时与errgroup的处理器、配置静态或动态后端地址、注入鉴权/日志等前置中间件,并为各下游服务单独配置熔断。

要在Go-Zero网关中聚合多个后端API服务(如用户、订单、商品),必须让单个HTTP请求触发并行调用多个微服务,再统一组装响应体——这不是靠简单转发能实现的,必须在路由处理函数内嵌入聚合逻辑。
定义聚合型路由入口
在api文件中声明一个新路由,路径不绑定具体服务,而是指向自定义聚合处理器:
@handler aggregateUserOrderProductget /aggregate/user-order-product (AggregateRequest) returns (AggregateResponse)
这一步不能写成proxyHandler("user-service")之类的标准代理,否则只会转发到单一服务,无法启动聚合。
编写聚合处理器函数
在生成的handler目录下,找到aggregateuserorderproducthandler.go,替换默认实现:
① 在函数开头创建带超时的context:ctx, cancel := context.WithTimeout(r.Context(), 3*time.Second);【超时必须设在聚合层,否则下游任一服务卡死会导致整个聚合挂住】
② 启动三个goroutine并发请求不同服务,每个都使用ctx作为父context,确保任一超时或取消时其余请求自动中止;
③ 用errgroup.Group包裹三个调用闭包,调用eg.Wait()等待全部完成或首个错误返回;
④ 将三个服务的响应字段提取后填充到AggregateResponse结构体,直接c.Json(http.StatusOK, resp)返回。
配置后端服务地址与负载策略
方法一:静态配置(适合开发环境)
在etc/gateway.yaml的Upstreams节中,为每个被聚合的服务单独定义:
- Name: user-service Http: Target: http://10.0.1.10:8000
- Name: order-service Http: Target: http://10.0.1.11:8001
方法二:动态服务发现(生产推荐)
启用nacos或etcd注册中心,在gateway.yaml中配置Discovery字段,go-zero会自动拉取健康实例列表;【若未配置健康检查,聚合时可能将请求发往已宕机节点】
注入聚合所需的中间件链
在internal/server/server.go中,修改NewServer初始化逻辑:
将rest.WithMiddlewares()参数中加入自定义聚合中间件,例如auth.Middleware()和log.Middleware()必须放在聚合逻辑之前,确保鉴权和日志覆盖整个聚合生命周期;
限流中间件要设在聚合入口处,而不是各子服务调用前——否则QPS限制会被乘以调用次数;
熔断器需针对每个下游服务单独配置,比如user-service错误率超40%即开启熔断,此时聚合函数应降级返回缓存数据或空字段。



















