负载均衡

当网关后面挂接同一应用的多个副本时,每次用户的请求都会通过网关的负载均衡算法,路由到对应的服务上面。例如:随机算法,权重算法,Hash 算法等等。

如果上游服务采取微服务的架构,也可以和注册中心合作实现动态的负载均衡。

当微服务动态挂载(动态扩容)的时候,可以通过服务注册中心获取微服务的注册信息,从而实现负载均衡。

路由选择

网关可以根据请求的 URL 地址解析,知道需要访问的服务。再通过路由表把请求路由到目标服务上去。

有时候因为网络原因,服务可能会暂时的不可用,这个时候我们希望可以再次对服务进行重试。

流量控制

限流是 API 网关常用的功能之一,当上游服务超出请求承载范围,或者服务因为某种原因无法正常使用,都会导致服务处理能力下滑。

这个时候,API 网关作为“看门人”,就可以限制流入的请求,让应用服务器免受冲击。

限流实际上就是限制流入请求的数量,其算法不少,有令牌桶算法,漏桶算法,连接数限制等等。这里我们就介绍三个常用的,一般通过 Nginx+Lua 来实现。

统一鉴权

访问应用服务器的请求都需要拥有一定权限,如果说每访问一个服务都需要验证一次权限,这个对效率是很大的影响。可以把权限认证放到 API 网关来进行。

目前比较常见的做法是,用户通过登录服务获取 Token,把它存放到客户端,在每次请求的时候把这个 Token 放入请求头,一起发送给服务器。

API 网关要做的事情就是解析这个 Token,知道访问者是谁(鉴定),他能做什么/访问什么(权限)。

说白了就是看访问者能够访问哪些 URL,这里根据权限/角色定义一个访问列表。

如果要实现多个系统的 OSS(Single Sign On 单点登录),API 网关需要和 CAS(Central Authentication Service 中心鉴权服务)做连接,来确定请求者的身份和权限。

熔断降级

当应用服务出现异常,不能继续提供服务的时候,也就是说应用服务不可用了。作为 API 网关需要做出处理,把请求导入到其他服务上。

或者对服务进行降级处理,例如:用兜底的服务数据返回客户端,或者提示服务暂时不可用。

同时通过服务注册中心,监听存在问题的服务,一旦服务恢复,随即恢复路由请求到该服务。

发布测试

灰度发布(金丝雀发布)

假设将 4 个服务从 V1 更新到 V2 版本,这 4 个服务的流量请求由 1 个 API 网关管理。

那么先将一台服务与 API 网关断开,部署 V2 版本的服务,然后 API 网关再将流量导入到 V2 版本的服务上。

这里流量的导入可以是逐步进行的,一旦 V2 版本的服务趋于稳定。再如法炮制,将其他服务替换成 V2 版本。

金丝雀发布一般先发 1 台,或者一个小比例,例如 2% 的服务器,主要做流量验证用,也称为金丝雀(Canary)测试(灰度测试)。

其来历是,旷工下矿洞前,先放一只金丝雀探查是否有毒气,金丝雀发布由此得名。

金丝雀测试需要完善的监控设施配合,通过监控指标反馈,观察金丝雀的健康状况,作为后续发布或回滚的依据。

如果金丝测试通过,则把剩余的 V1 版本全部升级为 V2 版本。如果金丝雀测试失败,则直接回退金丝雀,发布失败。

蓝绿发布

蓝绿部署中,一共有两套系统:一套是正在提供服务系统(也就是上面说的旧版),标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的,并且正在运行的系统,只是系统版本和对外服务情况不同。正在对外提供服务的老系统是绿色系统,新部署的系统是蓝色系统。

蓝色系统不对外提供服务,用来做发布前测试,测试过程中发现任何问题,可以直接在蓝色系统上修改,不干扰用户正在使用的系统。

蓝色系统经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统,切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。

当确信对外提供服务的蓝色系统工作正常,不对外提供服务的绿色系统已经不再需要的时候,蓝色系统正式成为对外提供服务系统,成为新的绿色系统。 原先的绿色系统可以销毁,将资源释放出来

蓝绿发布特点

  1. 蓝绿部署的目的是减少发布时的中断时间能够快速撤回发布
  2. 两套系统没有耦合的时候才能百分百保证不干扰

滚动发布

一般是取出一个或者多个服务器停止服务,执行更新,并重新将其投入使用。周而复始,直到集群中所有的实例都更新成新版本。

发布流程:
相对于蓝绿发布需要一套完备的机器不同,滚动发布只需要一台机器(这儿这是为了理解,实际可能是多台),我们只需要将部分功能部署在这台机器上,然后去替换正在运行的机器,如上图,将更新后的功能部署在Server1上,然后Server1去替换正在运行的Server,替换下来的物理机又可以继续部署Server2的新版本,然后去替换正在工作的Server2,以此类推,直到替换完所有的服务器,至此,服务更新完成。

滚动发布特点

  1. 这种部署方式相对于蓝绿部署,更加节约资源——它不需要运行两个集群、两倍的实例数。我们可以部分部署,例如每次只取出集群的20%进行升级。
  2. 回滚困难

缓存数据

我们可以在 API 网关缓存一些修改频率不高的数据。例如:用户信息,配置信息,通过服务定期刷新这个缓存就行了:

  • 用户请求先访问 API 网关,如果发现有缓存信息,直接返回给用户。

  • 如果没有发现缓存信息,回源到应用服务器获取信息。

  • 另外,有一个缓存更新服务,定期把应用服务器中的信息更新到网关本地缓存中。

日志记录

通过 API 网关上的过滤器我们可以加入日志服务,记录请求和返回信息。同时可以建立一个管理员的界面去监控这些数据。

日志记录了以后,可以做很多功能扩展。我们整理了以下几点供大家参考:

  • 报表分析:针对服务访问情况,提供可视化展示。

  • 实时查询:了解实时关键信息,例如:吞吐量,并发数。在秒杀活动的时候,会特别关注。

  • 异常告警:针对关键参数进行监控,对于统计结果支持阈值报警,对接阿里云通知中心、短信、钉钉进行告警。

  • 日志投递:将日志进行归档,存放到文件库或者数据仓库中,以便后期分析。

API 网关实现功能相关推荐

  1. 一文详细讲解API网关核心功能和API管理扩展

    本文将详细讲解API网关的基础概念,使用场景和核心功能,以及基于API网关核心引擎做的API全生命周期管理功能扩展等,最后介绍当前主流的开源API网关引擎. API网关概述 在微服务架构体系里面,我们 ...

  2. API 网关功能以及未来展望

    本文转自 我的小米粥分你一半,原文:https://corvo.myseu.cn/2022/04/13/2022-04-13-api%E7%BD%91%E5%85%B3%E5%8A%9F%E8%83% ...

  3. 1分钟构建API网关日志解决方案

    访问日志(Acccess Log)是由web服务生成的日志,每一次api请求都对应一条访问记录,内容包括调用者IP.请求的URL.响应延迟.返回状态码.请求和响应字节数等重要信息. 阿里云API网关提 ...

  4. 谈谈微服务设计中的API网关模式

    来源:架构头条(ID: ArchFront) 原文:http://dwz.date/crrw 根据 Gartner 对微服务的定义:"微服务是范围狭窄.封装紧密.松散耦合.可独立部署且可独立 ...

  5. 这是我见过最蛋疼的注册中心与API网关实践!

    之前在做顾问和咨询项目的时候,见到了一种非常经典的关于API网关和注册中心的错误用法.其实在我的星球(https://t.zsxq.com/eA2bMBA)里已经分享过这个案例,没想到最近又碰到了两个 ...

  6. 可通过http获取远端服务信息_微服务基础——厉害了!API网关

    微服务刚刚诞生的时候,人们将服务进行拆分,实现服务之间的松耦合,并且每个服务有专门的团队维护,然后客户端直接和各个子服务进行交互.比如,订单,商品,会员服务. 那么这种客户端直接和后端服务交互的方式会 ...

  7. 万字讲解API网关的来龙去脉

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...

  8. Ocelot API网关的实现剖析

    转:https://www.cnblogs.com/shanyou/p/7787183.html 在微软Tech Summit 2017 大会上和大家分享了一门课程<.NET Core 在腾讯财 ...

  9. 开源API网关Kong基本介绍和安装验证

    本文将介绍开源API网关Kong.在GitHub搜索API网关类的开源产品,可以看到Kong网关常年都是排第一的位置,而且当前很多都有一定研发能力的企业在API网关产品选项的时候基本也会选择Kong网 ...

最新文章

  1. 老男孩Linux运维第41期20171016第六周学习重点课堂记录
  2. linux内核全局变量重定位,关于可重定位文件中全局变量的一个重定位疑惑,借各位牛刀一用^...
  3. 用一个中介对象来封装一系列的对象交互
  4. Ajax叠加(Ajax返回数据用Ajax发出)
  5. 通过pxe远程安装linux,通过PXE远程安装Linux系统
  6. 中文计算机语言编程优势,十种编程语言特点比较
  7. android imagebutton的点击事件,Android 点击ImageButton时有“按下”的效果的实现
  8. Cisco VPP fib.h中文对照
  9. SPI驱动SX1278模块1-网关.SPI头文件,c文件,sx1278头文件和c文件,主函数
  10. StreamNative 联合创始人翟佳出席QCon北京峰会并发表演讲
  11. 你不了解的 @reduxjs/toolkit 中的createApi
  12. 基于js实现的简易记账小本
  13. coco数据集进行裁剪、数据增强过程中的ground_truth bbox的设定以及变化
  14. 【引用】免费论文检测 系统 软件 论文免费检测 论文抄袭检测大师 万方数据论文相似性检测系统 万方论文检测...
  15. MySQL一般读作什么_MySQL入门必做练习题50题(一) 创建表
  16. C语言补漏:字符串指针与字符数组传参
  17. Unity场景中的双相机设置,3D相机和2D相机设置
  18. php carbon 中文,Carbon中文使用手册(下)
  19. AltiumDesigner16\Quartus13\Labview2017\Matlab安装包网盘
  20. travis CI + coveralls

热门文章

  1. vue中富文本样式设置不生效解决方案
  2. 基于PHP的毕业设计管理系统的设计与实现(源码+配套论文)
  3. 手机APP测试(一)
  4. MPEG2、MPEG4、H264的差异
  5. MPLS TE可靠性及其案例
  6. 有关equal及equals重写知识点(完全掌握这一篇够了)
  7. 18 | 在索引字段上加函数踩坑经验
  8. webpack之Code Splitting
  9. 根据Map的value值进行排序-map排序
  10. java换行符(java换行符怎么输入)