【架构师】零基础到精通——网关策略

news2024/12/25 13:56:53

博客昵称:架构师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组件异常告警自定义组件处理耗时长、失败率高告警
4API异常告警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网关),统一解决:认证、鉴权、安全、流量管控、缓存、服务路由,协议转换、服务编排、熔断、灰度发布、监控报警等。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue服务端渲染SSR

一:ssr的理解 1、服务端渲染 Server Side Render SSR解决方案,后端渲染出完整的首屏的dom结构返回,前端拿到的内容包括首屏及完整spa结构,应用激活后依然按照spa方式运行,这种页面渲染方式被称为服务端渲染 (server si…

ISO C++ 26 并发和并行性重大完善

ISO C 委员会举行会议正式通过了 C 26 的时间表。ISO C 标准委员会主席兼微软语言架构师 Herb Sutte,并发和并行小组仍在按计划推进 C26 的 std::execution 和 SIMD 并行 一、 C23 与C 26 开发时间表: 二、C26标准属性三大规则。非正式总结是: [已经在c …

【Python 基础篇】Python数据序列推导式

文章目录 前言一、列表推导式二、字典推导式三、集合推导式总结 前言 在Python中,推导式(Comprehension)是一种简洁而强大的语法,用于快速创建列表、字典和集合。推导式使得在一个简单的语句中就能生成一个新的数据结构&#xff…

忘记Gmail谷歌账号密码或者密码错误怎么办?用这种方法轻松搞定

有些朋友以前注册过谷歌邮箱,但很久很久没有再去使用。现在注册ChatGPT需要谷歌邮箱,于是打算把尘封已久的谷歌邮箱找出来,可是这时候你突然发现,谷歌邮箱的密码忘了。 今天重点来说说如何找回谷歌账号的密码,希望能够…

英语口语进阶:让你的疲劳与口渴表达更地道

前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,阿里云社区博客专家 😉😉 💕 座右铭: 先努力成长自己,再帮助更多的人,一起加油进…

Web网页制作期末复习(4)——CSS盒子模型、弹性盒模型(flex box)、文档流、浮动、清除浮动、定位、圆角、阴影

目录 CSS盒子模型 概念 弹性盒模型(flex box) 内容 父元素上的属性 display属性 flex-direction属性 justify-content属性 align-items属性 子元素上的属性 flex 文档流(标准流) 浮动 定义 浮动的原理 清除浮动 …

用OpenCV进行OCR字符分割

1. 引言 本文重点介绍如何利用传统的图像处理的方法来进行OCR字符切分,进而可以用分割后的单个字符做相应的后续任务,虽然现在计算机视觉依然是卷积神经网络的天下,但是对于一些相对简单的落地场景传统方案还是很有效的。 闲话少说&#xff…

底盘线控悬架智能化趋势

摘要: 汽车的底盘主要由行驶系、传动系、转向系和制动系四部分组成,其中行驶系又由汽车的车架、车桥、车轮和悬架等系统组成。底盘的悬架系统不仅是汽车重要的组成部分,而且还关乎到一辆汽车在行驶过程中的质感,影响车辆的操控性…

CSDN周赛59期简要题解

本期题目相对比较友好,而且在比赛报名界面还提示了非编程题考察的章节——诚不欺我: 本期非编程题需要选手阅读的章节是第2章“逆向思考——从递推到递归”—2.3节“堆栈和队列:遍历的数据结构” 选择和判断都考到了栈的数据结构&#xff0…

【MySQL进阶】:子查询与HAVING/SELECT的完美结合

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL子查询在HAVING/SELECT字句中使用、及相关子查询和WITH/EXISTS字句的讲解✨ 目录 前言一、在HAVING/SELECT字句中使用子查询二、相关子查询三、WITH/EXISTS、NOT EXISTS字句四、总结 一、在HAVING/SELECT字句中…

【Python 基础篇】Python 字典及字典常用函数

文章目录 导言一、字典的创建和访问二、字典的增删改查1、增加元素2、删除元素3、修改元素4、查找元素 三、字典常用函数及操作1、len()2、keys()3、values()4、items()5、字典的遍历 总结 导言 在Python中,字典(Dictionary)是一种无序的数据…

使用它或失去它!谷歌即将清理不活跃账号

如果你很长时间没有登录你的谷歌账号,最好尽快登录,否则你很可能会失去账号。 2023年5月16号,谷歌宣布,将开始删除至少两年不活跃的账号。 如果谷歌帐户至少两年未被使用或登录,可能会删除该帐户及其内容,包…

04. 青龙面板通知配置 邮箱 pushPlus 企业微信机器人(保姆级图文)

目录 1. qq邮箱通知2. pushPlus通知3. 企业微信机器人总结 欢迎关注 『青龙面板』 专栏,持续更新中 欢迎关注 『青龙面板』 专栏,持续更新中 1. qq邮箱通知 emailUser:填写你的邮箱 emailPass:填写邮箱密钥授权码 邮箱密钥获取教…

【从零开始学习JAVA | 第六篇】面向对象综合训练

目录 前言: 1.文字版格斗游戏: 2.对象数组1 前言: 前面我们已经讲解了JAVA面向程序对象思想的关键要素:封装。我们将利用本篇进行几个小型的练习,帮助我们更好的理解面向对象编程这种思想。 1.文字版格斗游戏&#x…

C++哈希表

目录 介绍哈希概念哈希冲突哈希函数解决哈希冲突 闭散列介绍线性探测二次探测负载因子 实现哈希表结构哈希函数元素查找插入元素删除元素 开散列介绍实现哈希表结构元素查找插入元素删除元素析构函数 介绍 哈希概念 了解过搜索二叉树与红黑树后,它们的结构特点主要…

8.批量消息发送与批量消息消费

highlight: arduino-light 4.4 批量消息 4.4.1 发送限制 生产者进行消息发送时可以一次发送多条消息,批量发送消息能显著提高传递小消息的性能。 不过需要注意以下几点: 批量发送的消息必须具有相同的Topic批量发送的消息必须具有相同的刷盘策略批量发送…

统计数组中非零元素的个数统计数组中每列中非零元素的个数统计数组中每行中非零元素的个数numpy.count_nonzero()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 统计数组中非零元素的个数 统计数组中每列中非零元素的个数 统计数组中每行中非零元素的个数 numpy.count_nonzero() 选择题 以下说法错误的是? import numpy as np anp.array([[0,1,2,3],[3,…

文件加密后怎么打开?打开加密文件的方法

当我们把重要文件加密后,可以有效地保护文件数据安全,那么文件加密后该怎么打开使用呢?下面我们就一起来了解一下吧。 EFS加密 作为Windows系统提供的文件加密方法,EFS加密并不需要密码。在我们使用加密时登录的系统账号时&…

使用HTML制作一个赛龙舟小游戏

在这个信息爆炸的时代,开发者们肩负着前所未有的责任与挑战,以屈原名言 路漫漫其修远兮,吾将上下而求索 为指引,使用HTML制作一个赛龙舟小游戏,以此激励广大开发者在技术征途上不断求索,追求极致。 一、前期…

忘记了谷歌Gmail账号名怎么办?用这种方法轻松找回谷歌邮箱地址

有些朋友以前注册过谷歌邮箱,但很久很久没有再去使用。 现在注册ChatGPT需要谷歌邮箱,于是打算把尘封已久的谷歌邮箱找出来,可是这时候你才发现,谷歌邮箱的账号名早已忘掉了。 今天重点来说说如何找回谷歌账号,希望能够…