GitHub - wanghongfei/gogate:Go实现的高性能Spring Cloud网关

19-07-08 banq
              

Go实现的高性能Spring Cloud网关(支持Consul和Eureka),路由配置热更新,负载均衡,灰度,服务粒度的流量控制,服务粒度的流量统计!

Go语言实现的Spring Cloud网关,目标是性能,即使用更少的资源达到更高的QPS。

GoGate以使用高性能关系着称的FastHttp库收发HTTP请求,且会为每个主机创建³³单独一个HostClient以减少锁竞争。

目前已经实现的功能有:

  • 基于Eureka(或Consul)的服务发现,注册
  • 请求路由,路由配置热更新
  • 负载均衡
  • 灰度发布(基于Eureka元信息里的版本字段分配流量)
  • 微服务粒度的QPS控制(有基于内存的令牌桶算法限流和Redis + Lua限流两种可选)
  • 微服务粒度的流量统计(暂时实现为记录日志到的/ tmp目录下)
  • 优雅关闭(开启此功能会略微损耗性能)

初步测试了一下性能,结论如下:

相同的硬件环境,Zuul充分预热且关闭Hystrix的前提下,Go版的网关QPS为Zuul的2.3倍,同时内存占用仅为Zuul的十分之一(600M vs 50M)。而且Go基本上第一波请求就能达到最大QPS,zuul要预热几次才会稳定。

如果按消耗相同资源的前提下算的话,请一定要比zuul节省多的多的多的机器。

什么情况下可以考虑使用非Java的语言的网关?

  • 系统使用Spring Cloud全家桶
  • 对Zuul 1性能不满意
  • 对云官方已经明确不会整合Zuul 2的行为不爽
  • 认为Spring Cloud Gateway不够成熟(相比Zuul 2.0)
  • 对网关的CPU /内存资源使用非常敏感

点击标题进入Github项目!