https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html
性能隐患
- 请求线程异步化,防止网络等待引起的线程占用
Shepherd对API请求做了全异步化处理,请求通过Jetty IO线程异步提交到业务处理线程池,调用后端服务使用RPC或HTTP框架的异步方式,释放了由于网络等待引起的线程占用,使线程数不再成为网关的瓶颈。下图是使用Jetty容器时,服务端的请求线程处理逻辑:
- QPS 高时 导致 网络超时错误
我们通过域名压测网关单机的端到端QPS,发现QPS在超过2000时,会出现很多超时错误,而网关的服务端负载与性能却非常富余。调研发现,公司内其他的Web应用都存在这个问题,与Oceanus团队进行联合排查后,发现是Nginx与Web应用之间的长连接功能没有打开,且无法配置。Oceanus团队经过紧急排期,研发并上线长连接功能后,Shepherd端到端的QPS成功提升到了10000以上。
- CPU热点排查,将性能瓶颈找出,减少主链路上的本地日志打印,对请求日志进行异步化、远程化改造
另外,我们对Shepherd服务端进行了API请求预热的优化,使得网关启动时能立刻达到最佳性能,减少毛刺的发生。然后,通过压测时的CPU热点排查,将性能瓶颈找出,减少主链路上的本地日志打印,对请求日志进行异步化、远程化改造。Shepherd端到端的QPS再次提升30%以上。
服务隔离
集群隔离
借鉴公司缓存、任务调度等成熟组件的经验,Shepherd在设计之初,就考虑了按业务线维度进行集群隔离,也支持重要业务独立部署。如下图所示:
请求隔离
服务节点维度,Shepherd支持请求的快慢线程池隔离。快慢线程池隔离主要用于一些使用了同步阻塞组件的API,例如SSO鉴权、自定义鉴权等,可能导致长时间阻塞共享业务线程池。
快慢隔离的原理是统计API请求的处理时间,将请求处理耗时较长,超过容忍阈值的API请求隔离到慢线程池,避免影响其他正常API的调用。
除此之外,Shepherd也支持业务研发人员配置自定义线程池进行隔离。具体的线程隔离模型如下图所示:
稳定性保障
Shepherd提供了一些常规的稳定性保障手段,来保证自身和后端服务的可用性。如下图所示:
图 12
- 流量管控:从用户自定义UUID限流、App限流、IP限流、集群限流等多个维度提供流量保护。
- 请求缓存:对于一些幂等的、查询频繁的、数据及时性不敏感的请求,业务研发人员可开启请求缓存功能。
- 超时管理:每个API都设置了处理超时时间,对于超时的请求,进行快速失败的处理,避免资源占用。
- 熔断降级:支持熔断降级功能,实时监控请求的统计信息,达到配置的失败阈值后,自动熔断,返回默认值。
灰度
灰度场景
Shepherd在灰度能力上,支持灰度API自身逻辑,也支持灰度下游服务,也可以同时灰度API自身逻辑和下游服务。如下图所示:
图 13
灰度API自身逻辑时,通过将流量分流到不同的API版本实现灰度能力;灰度下游服务时,通过给流量打标,分流到指定的下游灰度单元中。
灰度策略
Shepherd支持丰富的灰度策略,可以按照比例数灰度,也可以按照特定条件灰度。
监控告警
故障自愈
Shepherd服务端接入了弹性伸缩模块,可根据CPU等指标进行快速扩容、缩容。除此之外,还支持快速摘除问题节点,以及更细粒度的问题组件摘除。