https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html

性能隐患

  1. 请求线程异步化,防止网络等待引起的线程占用

Shepherd对API请求做了全异步化处理,请求通过Jetty IO线程异步提交到业务处理线程池,调用后端服务使用RPC或HTTP框架的异步方式,释放了由于网络等待引起的线程占用,使线程数不再成为网关的瓶颈。下图是使用Jetty容器时,服务端的请求线程处理逻辑:
高性能API网关设计关键技术点 - 图1

  1. QPS 高时 导致 网络超时错误

    我们通过域名压测网关单机的端到端QPS,发现QPS在超过2000时,会出现很多超时错误,而网关的服务端负载与性能却非常富余。调研发现,公司内其他的Web应用都存在这个问题,与Oceanus团队进行联合排查后,发现是Nginx与Web应用之间的长连接功能没有打开,且无法配置。Oceanus团队经过紧急排期,研发并上线长连接功能后,Shepherd端到端的QPS成功提升到了10000以上。

  1. CPU热点排查,将性能瓶颈找出,减少主链路上的本地日志打印,对请求日志进行异步化、远程化改造

    另外,我们对Shepherd服务端进行了API请求预热的优化,使得网关启动时能立刻达到最佳性能,减少毛刺的发生。然后,通过压测时的CPU热点排查,将性能瓶颈找出,减少主链路上的本地日志打印,对请求日志进行异步化、远程化改造。Shepherd端到端的QPS再次提升30%以上。

服务隔离

集群隔离

借鉴公司缓存、任务调度等成熟组件的经验,Shepherd在设计之初,就考虑了按业务线维度进行集群隔离,也支持重要业务独立部署。如下图所示:

请求隔离

服务节点维度,Shepherd支持请求的快慢线程池隔离。快慢线程池隔离主要用于一些使用了同步阻塞组件的API,例如SSO鉴权、自定义鉴权等,可能导致长时间阻塞共享业务线程池。

快慢隔离的原理是统计API请求的处理时间,将请求处理耗时较长,超过容忍阈值的API请求隔离到慢线程池,避免影响其他正常API的调用。

除此之外,Shepherd也支持业务研发人员配置自定义线程池进行隔离。具体的线程隔离模型如下图所示:

高性能API网关设计关键技术点 - 图2

稳定性保障

Shepherd提供了一些常规的稳定性保障手段,来保证自身和后端服务的可用性。如下图所示:
高性能API网关设计关键技术点 - 图3
图 12

  • 流量管控:从用户自定义UUID限流、App限流、IP限流、集群限流等多个维度提供流量保护。
  • 请求缓存:对于一些幂等的、查询频繁的、数据及时性不敏感的请求,业务研发人员可开启请求缓存功能。
  • 超时管理:每个API都设置了处理超时时间,对于超时的请求,进行快速失败的处理,避免资源占用。
  • 熔断降级:支持熔断降级功能,实时监控请求的统计信息,达到配置的失败阈值后,自动熔断,返回默认值。

灰度

API网关作为请求入口,往往肩负着请求流量灰度验证的重任。

灰度场景

Shepherd在灰度能力上,支持灰度API自身逻辑,也支持灰度下游服务,也可以同时灰度API自身逻辑和下游服务。如下图所示:
高性能API网关设计关键技术点 - 图4
图 13
灰度API自身逻辑时,通过将流量分流到不同的API版本实现灰度能力;灰度下游服务时,通过给流量打标,分流到指定的下游灰度单元中。

灰度策略

Shepherd支持丰富的灰度策略,可以按照比例数灰度,也可以按照特定条件灰度。

监控告警

故障自愈

Shepherd服务端接入了弹性伸缩模块,可根据CPU等指标进行快速扩容、缩容。除此之外,还支持快速摘除问题节点,以及更细粒度的问题组件摘除。
高性能API网关设计关键技术点 - 图5

其他功能点

服务编排