博客昵称:架构师Cool
最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。
作者简介:一名退役Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟!
博主小留言:哈喽!各位CSDN的uu们,我是你的小弟Cool,希望我的文章可以给您带来一定的帮助
个人百万笔记知识库, 所有基础的笔记都在这里面啦,点击左边蓝字即可获取!助力每一位未来架构师!
欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
网关策略
- 1、流量治理
- 1-1、API鉴权
- 1-2、集群隔离
- 1-3、请求隔离
- 1-4、灰度发布
- 2、监控告警
- 2-1、立体化监控
- 2-2、多维度告警
- 3、关键设计
- 3-1、异步外调
- 3-2、外调链接池化
- 3-3、释放连接
- 3-4、对象池化设计
- 3-5、上下文切换
- 3-6、监控告警
- 4、解决方案
- 4-1、Shepherd API网关
- 4-2、Mashape Kong
- 4-3、Soul
- 4-4、Apiman
- 4-5、Gravitee
- 4-6、Tyk
- 4-7、Traefik
- 4-8、小豹API网关
1、流量治理
1-1、API鉴权
请求安全是API网关非常重要的能力,集成了丰富的安全相关的系统组件,包括有基础的请求签名、SSO单点登录、基于SSO鉴权的UAC/UPM访问控制、用户鉴权Passport、商家鉴权EPassport、商家权益鉴权、反爬等等。业务研发人员只需要简单配置,即可使用。
1-2、集群隔离
API网关按业务线维度进行集群隔离,也支持重要业务独立部署。如下图所示:
1-3、请求隔离
服务节点维度,API网关支持请求的快慢线程池隔离。快慢线程池隔离主要用于一些使用了同步阻塞组件的API,例如SSO鉴权、自定义鉴权等,可能导致长时间阻塞共享业务线程池。快慢隔离的原理是统计API请求的处理时间,将请求处理耗时较长,超过容忍阈值的API请求隔离到慢线程池,避免影响其他正常API的调用。除此之外,也支持业务研发人员配置自定义线程池进行隔离。具体的线程隔离模型如下图所示:
1-4、灰度发布
API网关作为请求入口,往往肩负着请求流量灰度验证的重任。
灰度场景
在灰度能力上,支持灰度API自身逻辑,也支持灰度下游服务,也可以同时灰度API自身逻辑和下游服务。如下图所示:
灰度API自身逻辑时,通过将流量分流到不同的API版本实现灰度能力;灰度下游服务时,通过给流量打标,分流到指定的下游灰度单元中。
灰度策略
支持丰富的灰度策略,可以按照比例数灰度,也可以按照特定条件灰度。
2、监控告警
2-1、立体化监控
API网关提供360度的立体化监控,从业务指标、机器指标、JVM指标提供7x24小时的专业守护,如下表:
监控模块 | 主要功能 | |
---|---|---|
1 | 统一监控Raptor | 实时上报请求调用信息、系统指标,负责应用层(JVM)监控、系统层(CPU、IO、网络)监控 |
2 | 链路追踪Mtrace | 负责全链路参数透传、全链路追踪监控 |
3 | 日志监控Logscan | 监控本地日志异常关键字:如5xx状态码、空指针异常等 |
4 | 远程日志中心 | API请求日志、Debug日志、组件日志等可上报远程日志中心 |
5 | 健康检查Scanner | 对网关节点进行心跳检测和API状态检测,及时发现异常节点和异常API |
2-2、多维度告警
有了全面的监控体系,自然少不了配套的告警机制,主要的告警能力包括:
告警类型 | 触发时机 | |
---|---|---|
1 | 限流告警 | API请求达到限流规则阈值触发限流告警 |
2 | 请求失败告警 | 鉴权失败、请求超时、后端服务异常等触发请求失败告警 |
3 | 组件异常告警 | 自定义组件处理耗时长、失败率高告警 |
4 | API异常告警 | API发布失败、API检查异常时触发API异常告警 |
5 | 健康检查失败告警 | API心跳检查失败、网关节点不通时触发健康检查失败告警 |
3、关键设计
3-1、异步外调
基于Netty实现异步外调主要有两种方式可以实现:
- 方式一:建立全局Map,上线文传递(不参与远程传输)requestId,响应时使用requestId进行映射上游信息
- 方式二:直接将上游信息包装成Context进行上线文传递(不参与远程传输)
方式一需要独立维护一个全局映射表,同时需要考虑请求超时和丢失的情况,否则会出现内存不断增长问题。
3-2、外调链接池化
使用Netty实现API网关外调微服务时,因建立连接需要极度消耗资源,所以需要考虑将外调的链接进行池化管理,设计时需要注意以下几点:
- 初始化适当连接(过多过少都不适合)
- 考虑连接能随流量增减而进行自动扩缩容
- 取出的连接需要检查是否可用
- 连接需要考虑双向心跳探测
3-3、释放连接
http的链接是独占的,所以在释放的时候要特别小心,一定要等服务端响应完了才能释放,还有就是链接关闭的处理也要小心,总结如下几点:
-
Connection:close
-
空闲超时,关闭链接
-
读超时关闭链接
-
写超时,关闭链接
-
Fin,Reset
-
写超时:writeAndFlush包含Netty的encode时间和从队列里把请求发出去即flush的时间。因此后端超时开始需要在真正flush成功后开始计时,这样才最接近服务端超时时间(还有网络往返时间和内核协议栈处理时间)
3-4、对象池化设计
针对高并发系统,频繁创建对象不仅有分配内存开销,还对gc会造成压力。因此在实现时,会对频繁使用的对象(如线程池的任务task,StringBuffer等)进行重写,减少频繁的申请内存的开销。
3-5、上下文切换
整个网关没有涉及到IO操作,但在IO编解码和业务逻辑都用了异步,是有两个原因
- 防止开发写的代码有阻塞
- 业务逻辑打日志可能会比较多
在突发的情况下,但是我们在push线程时,支持用Netty的IO线程替代,这里做的工作比较少,这里由异步修改为同步后(通过修改配置调整),CPU的上下文切换减少20%,进而提高了整体的吞吐量,就是不能为了异步而异步,Zuul2的设计类似。
3-6、监控告警
协议层
- 攻击性请求。只发头,不发/发部分body,采样落盘,还原现场,并报警
- Line or Head or Body过大的请求。采样落盘,还原现场,并报警
应用层
- 耗时监控。有慢请求,超时请求,以及tp99,tp999等
- QPS监控和报警
- 带宽监控和报警。支持对请求和响应的行、头、body单独监控
- 响应码监控。特别是400和404
- 链接监控。对接入端的链接,以及和后端服务的链接,后端服务链接上待发送字节大小也都做了监控
- 失败请求监控
- 流量抖动报警。流量抖动要么是出了问题,要么就是出问题的前兆
4、解决方案
4-1、Shepherd API网关
4-2、Mashape Kong
访问地址:https://github.com/Kong/kong
4-3、Soul
访问地址:https://github.com/Dromara/soul
4-4、Apiman
访问地址:https://apiman.gitbooks.io/apiman-user-guide/user-guide/gateway/policies.html
4-5、Gravitee
访问地址:https://docs.gravitee.io/apim_policies_latency.html
4-6、Tyk
访问地址:https://tyk.io/docs
4-7、Traefik
访问地址:https://traefik.cn
Træfɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。
功能特性
- 它非常快
- 无需安装其他依赖,通过Go语言编写的单一可执行文件
- 支持 Rest API
- 多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, 并且还会更多
- 后台监控, 可以监听后台变化进而自动化应用新的配置文件设置
- 配置文件热更新。无需重启进程
- 正常结束http连接
- 后端断路器
- 轮询,rebalancer 负载均衡
- Rest Metrics
- 支持最小化官方docker 镜像
- 后台支持SSL
- 前台支持SSL(包括SNI)
- 清爽的AngularJS前端页面
- 支持Websocket
- 支持HTTP/2
- 网络错误重试
- 支持Let’s Encrypt (自动更新HTTPS证书)
- 高可用集群模式
4-8、小豹API网关
访问地址:http://www.xbgateway.com
小豹API网关(企业级API网关),统一解决:认证、鉴权、安全、流量管控、缓存、服务路由,协议转换、服务编排、熔断、灰度发布、监控报警等。