Mini-Gateway
Go · Gin · Redis · Prometheus · Grafana · OpenTelemetry · FastHTTP · Nacos · Protocol Buffers · Hystrix
出发点
网关是整条链路上唯一的单点:所有流量都从它过,所以它既是性能瓶颈的第一现场,也是故障放大器。 这个项目围绕两件事做——把单机吞吐压上去,以及在下游出问题时不要把自己也拖死。
一、非阻塞 I/O 与并发模型
- Go 协程池 + epoll 多路复用做非阻塞 I/O。用池而不是每连接一个 goroutine,是为了给并发量设上界——否则连接一多,调度和栈内存自己就会把机器打满。
- 单机 10K+ 并发连接,平均响应时间低于 5ms。
二、自适应熔断
- 滑动窗口统计 + hystrix-go,按错误率和响应时间两个维度自适应熔断。只看错误率会漏掉「还在返回 200 但已经慢到不可用」的下游。
- 高负载下错误率从 15% 降到 0.5%。
- 用滑动窗口而不是固定窗口,是因为固定窗口在边界上会把两个窗口的流量叠在一起,判断会抖。
三、HTTP ↔ gRPC 双向转换
- Protocol Buffers 编解码配合 grpc-gateway 做双向转换,让外部仍然用 HTTP/JSON,内部走 gRPC。
- 转换延迟控制在 5ms 以内,保持 95% 的性能。
四、静态资源零拷贝
- fasthttp.ServeFile 走
sendfile,数据不经过用户态,省掉两次拷贝和一次上下文切换。 - 资源传输性能提升 60%,内存占用降低 40%。
五、分布式限流
- Redis + Lua 实现令牌桶。放 Lua 里是为了让「取令牌」这一串读写在 Redis 侧原子执行,多实例下才不会各自算出一份额度。
- 跨实例精准限流,精度误差在 1% 以内。
可观测性
- Prometheus + Grafana 看指标,OpenTelemetry 串链路,Nacos 做服务发现与配置。 上面那些数字能说出来,前提是这一层先搭好了——不然优化只能凭感觉。