从保证业务不中断,看网关的“前世今生”
摘要:现在大家在谈“分布式”、“微服务”、“云原生”这些概念时,更多在谈支撑“软件服务”的弹性伸缩与负载均衡。API Gateway作为其第一道关卡以及其重要组成组件,我们来看看他的发展历程、现状及未来的方向。
API网关作为现代分布式、微服务、云原生系统中的一个重要组成部分,也作为一项重要的讨论主题,咱也聊聊负载均衡及API Gateway的现状。
现在大家在谈“分布式”、“微服务”、“云原生”这些概念时,除了“软件服务”功能本身,更多的是在谈如何让服务可以更好的扩展来支持大规模的应用。负载均衡及API网关是作为其第一道关卡以及其重要组成组件,我们来看看他的发展历程、现状及未来的方向。
负载均衡
谈到网关,不得不谈负载均衡,通常负载均衡有服务器负载均衡和客户端负载均衡(例如Spring Cloud Ribbon & Eureka)两种不同的方式。对于非REST且对实时性要求较高的服务来说,客户端负载均衡是一种常用的选择,比如王者荣耀、英雄联盟这种游戏来说,进入游戏的各种日常活动,都是基于REST服务的,而组队进行比赛时,通常都是非REST服务。还有在线协作的产品,如Welink的IM/Presence功能,其服务端是可以做成REST服务,而Welink Meeting这种实时音视频会议(real-time colloration),RESE服务不能满足其实时性要求。大都是采用客户端负载均衡的方式,基本过程如下:
1、负载均衡网关与服务器之间的注册或发现机制。
2、客户端向网关请求会议服务器列表,这里服务器会有一些业务逻辑从而计算出一些服务器列表返回给客户端。
3、客户端拿到服务器列表会向服务器发送探测报文,根据探测报文的响应时间(客户端与服务器之间网络状况),以及服务器的负载等因素来决定选择哪一个服务器。
4、客户端与服务器通过约定的协议建立业务连接。
5、如果客户端或者服务器任何一段出现异常,客户端会重新走2-4的流程恢复业务连接。
从上述可以看出客户负载均衡的会有一个相对复杂的过程,但是一旦建立连接,其性能一定是最优的。不过客户端负载均衡无法保证服务器REST服务化,一旦服务器发生故障,会有短暂的服务中断。但是该方案适用于一些实时性要求较高的一些应用(如上述说到的一些应用)。而对于REST的服务来说,采用L4负载均衡(F5、LVS、nginx、haproxy等)/L7负载均衡(haproxy、nginx、apache、Mysql proxy等)是通用的方法。这次Arch Summit,部分厂商介绍其采用4层负载均衡方案。我们来大致看一下整个分布式系统负载均衡的整体架构及发展历程。
从负载均衡的发展来看,根据其应用规模其演进过程大致如下:
API Gateway的现状
随着微服务的流行,API Getway得到蓬勃的发展。对于API Gateway本职工作是承担消息分发任务,提供给客户统一的API入口。通常有2种方式:Single API Gateway和Backend for Frontend API Gateway。有沒有第三种模式呢?我之前做的一个产品,其网关基本架构如下:
1、客户端有登录的要求,在登录认证的response里,包含了不同服务的api的url列表。
2、客户端在不同的api请求是,使用对应的api url,这样客户端来实现了大部分api的分发工作。
3、这时候API 网关的主要任务其实已经不是最初的API转发的功能了。而是为了简化后端服务,实现后端服务的一些公共功能。
4、甚至在这种场景下,可以没有API网关,API可以直接面对应用服务,再由应用服务来调度微服务进行业务处理。
回到的API gateway本身,其最核心设计理念是保证数据面的业务不中断。由于对接 API 网关的服务是多样的,客户 API 跟应用的设计不可控,你很难能要求每个接入的服务以及客户端都具备容错能力。这就要求网关尽量保证能正常处理每个请求,且满足较高的 SLA,现在业界的 API 网关的主流使用Nginx系,主要考虑如下:
- 支持热重启
数据面的组件升级是一个高风险动作, 一旦出现异常就可能导致连接中断,系统异常, 除非你的前端 LB(负载均衡)能具备快速排水的能力,当然即使如此,还是可能导致正在处理的请求被强制中断。所以数据面的热重启非常关键。 - 支持订阅式动态路由
API 路由变化相对频繁,及时性也要求比较高,如果采用定期同步方案,一次性同步几万条的数据会拖慢你的系统,因此增加一个订阅式的路由服务中心非常关键,我们可以快速订阅 ETCD 中的路由数据并实时生效。而且只拿增量数据性能压力不会太大。 - 支持插件化管理
Nginx 在插件方面提供了丰富的生态。不同的 API,不同的用户所需要的处理流程不完全一致,如果每个请求过来都按照相同流程处理,必定带来相关的冗余操作。插件化管理可以在一定程度上提升性能,还能保障在升级过程中能快速添加处理链。 - 高性能的转发能力
API 网关一般工作在多后端 API 反向代理模式,很多自研的 API 网关在性能上容易出现瓶颈,因此 nginx 优异的性能和高效的流量吞吐是其核心竞争力。 - 无状态可横向扩展
API 网关承载的是整个系统所有请求的集合,需要根据业务规模进行弹性伸缩,采用服务中心配合 Nginx 配置管理可以快速增删已有的集群,并同步到 LVS,实现快速的横向扩展能力。
随着现在的系统的越来越复杂,很多服务模块除了处理自身业务之外,还有承担一些非业务的职责,如认证和授权,限流,缓存,日志,监控,重试,熔断等。这样涌现了一批开源的API网关实现。
- Tyk:Tyk是一个开源的、轻量级的、快速可伸缩的 API 网关,支持配额和速度限制,支持认证和数据分析,支持多用户多组织,提供全 RESTful API(go语言)。
- Kong:Kong 可以认为是一个 OpenResty 应用程序,而OpenResty 运行在 Nginx 之上,使用 Lua 扩展了 Nginx。(Kong = OpenResty + Nginx + Lua)
- Orange:Orange 是一个基于 OpenResty 的 API Gateway,提供API及自定义规则的监控和管理,如访问统计、流量切分、API重定向、API鉴权、WEB防火墙等功能。(腾讯在用)
- Netflix Zuul:Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。(Spring Cloud)
- Ambassador:Ambassador 是一个开源的微服务 API 网关,建立在 Envoy 代理之上,为用户的多个团队快速发布,监控和更新提供支持,支持处理 Kubernetes ingress controller 和负载均衡等功能,可以与 Istio 无缝集成。(Kubernetes-Native)
- 其他…(例如:apiaxle: Nodejs 实现的一个 API 网关; api-umbrella: Ruby 实现的一个 API 网关。)
除了上述功能,随着API网关服务承担了越来越多的职责,其性能瓶颈也越显突出。这次ArchSummit一些公司展示了一些自己的特色功能,还有在产品演化中,自己在架构上做了一些优化,主要有:
- 采用C++来实现网关来提升性能 (*)
– 在本次会议中,有2-3家企业都在提用C++实现来提升性能。这基本上与架构无关,更多的是编程语言自身的差异了。 - 私有协议加速API与服务的映射关系
– 这个好几家都在做,比如腾讯。 - 网关实现分层隔离不变与易变,实现网关的增值业务的架构演进(*)
– 这个就是架构层面的东西了,我的理解是更多架构演进及运维相关的考虑。把面向前端客户(稳定)与面向后端服务(不稳定)的部分再分层实现、分层部署,从而面向客户的网关服务基本上不变动。当后端服务在功能扩展或者重构后,系统升级对于客户影响最小(具体细节没介绍)。 - 网关实现限流,让后端服务更稳定,更简单。
– 这个比较容易理解,也是常规的做法。这样让后端的应用服务/微服务设计与实现更简单。当然不同的产品实现各不相同。其中腾讯介绍游戏API网关时,提到了服务启动静态创建最大化连接Session,去除动态创建和回收机制,以达到性能最优。 - 网关实现认证,简化后端服务的业务流程(适合认证,不适合权限)
– 这个也是比较常规的做法,目的是也是让后端的应用服务/微服务设计与实现更简单。这种服务多适合认证,但是权限的管理在一些特殊的应用场景未必适用。比如某些应用里的某个功能,对于权限划分比较细,已经是针对内容级别的访问控制。网关一般不能代替服务来实现,还是需要通过服务本身来完成。
总结
从网关的发展来看,其经历了一代又一代的演进,从自身架构的演进,再到其功能上叠加,在促进其架构上的再此迭代演进。在现再这个万物皆云的时代,云原生这个概念已经被各个行业所接受并且提高一个很高的高度。连一些传统的网络设备业务也要上云。
对于产品的发展与演进,我们也会“抄、学、变”。
- 对于相同相识业务,成熟优秀的解决方案,我们要会“抄”,直接拿过来用,不要自己闭门造轮子。
- 对于不同的业务做转型演进,可以借鉴的经验不多,但是对于相关领域架构、知识。我们不能抄,而要“学”,学习其思想,其精髓。
- 最后是变,任何通用的解决方案和架构可以解决通用的问题,但是由于通用,也不可避免的有一些“通病”。
附录:Arch Summit API网关一些架构图:
点击关注,第一时间了解华为云新鲜技术~
从保证业务不中断,看网关的“前世今生”相关推荐
- 保证服务器宕机业务不中断,备特佳CDP容灾备份系统——服务器端数据备份软件 - 和力记易--CDP容灾备份专家...
软件介绍: 备特佳CDP容灾备份系统是和力记易自主研发适用于服务器端数据备份的CDP容灾备份软件,是一款主要面向Windows.Linux.Unix平台下集数据库备份.文件备份.操作系统备份于一体的C ...
- 极光笔记 | 极光推送业务无中断迁移上云实践
作者:极光推送后台技术专家 -- 曾振波 为什么要上云 关于企业上云,业内已经有了非常多的讨论和论述.这里主要是从极光自身的实际情况阐述几个理由. 1.传统自建机房在扩充底层软硬件资源时,需要进行选型 ...
- 不想业务被中断?快来解锁华为云RDS for MySQL新特性
本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:GaussDB 数据库. 相信很多用户在实际业务中都会碰到用户会话被中断这样的痛点,这时候其应 ...
- 大数据集群跨多版本升级、业务0中断,只因背后有TA
摘要:2021年4月21日,中国太平洋保险集团联合华为云完成了全球首例大数据集群跨多版本的大数据集群滚动升级. 本文分享自华为云社区<华为云FusionInsight助力太保跨多版本升级业务0中 ...
- Nutanix推出自动化功能,助力企业保证业务连续性
2020年5月19日,北京 -- 企业云计算领导者Nutanix(纳斯达克:NTNX)近日宣布,旗下超融合基础架构(HCI)软件和AHV虚拟化平台推出多项全新功能,为业务关键型应用保驾护航,在突发系统 ...
- 从模拟切换到真实业务接管,看zCloud如何助力银行灾备演练升级
点击上方"蓝字" 关注我们,享更多干货! 近年来,随着国家和行业监管部门对银行信息系统风险管理的要求不断提高,<商业银行数据中心监管指引>和<商业银行业务连续性监 ...
- 华为云FusionInsight MRS:千余节点滚动升级业务无中断
本文分享自华为云社区<华为云FusionInsight MRS如何实现千余节点滚动升级无业务中断升级>,原文作者:沙漏. 华为开发者大会2021(Cloud)大会期间,由华为技术专家天团打 ...
- JAVA后端如何保证业务操作的幂等性
JAVA后端如何保证业务操作的幂等性 说到幂等性,应该很多人都知道这个词,顾名思义,就是无论操作多少次,产生的结果都是相等的.尤其是交易中,在开发过程中,时时刻刻要考虑交易的幂等性,例如,客户端因为网 ...
- DocuWare 智能文档控制——杜绝成堆的文件和文件混乱,保证业务连续性,创建企业新阶段
一.智能文档控制--杜绝成堆的文件和文件混乱,保证业务连续性,创建企业新阶段 清晰有条理和即时可用的信息是成功的业务流程的关键,随时随地安全管理业务文档,快速查找并智能使用它们. 1.安全存储 使用安 ...
最新文章
- 在 ServiceModel 客户端配置部分中,找不到引用协定“WebServiceSoap”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素找不到与此协定匹配的终结点元素
- VSCode 竟然可以无缝调试浏览器了!
- 双系统重装win7/Xp后如何恢复ubuntu引导--转载
- java mybatis 动态sql
- Iphone 清空联系人
- 删库跑路大全 删库跑路
- 【论文笔记】Neural Machine Translation by Jointly Learning to Align and Translate
- 【web前端开发】HTML知识点超详细总结
- 程序退出,段错误segment default问题定位
- SQL获取当前月份的第一天
- 1905 杨辉三角
- [总结]FFMPEG命令行工具之ffmpeg详解
- 牛客每日练习----珂朵莉与宇宙,Forever97与寄信,Number
- 【深度学习】(ICCV-2021)PVT-金字塔 Vision Transformer及PVT_V2
- 9月20号是用计算机,2016年9月计算机应用基础统考题库 excel电子表格
- Python爬虫-爬取17K小说
- java操作Excel,mdb,dbf
- 海尔2020 无复权收盘价
- 网站ui设计教程_方便使用的20种UI设计Photoshop教程
- 纯javescript制作随机生成象数块小案例
热门文章
- 前端:HTML/03/超级链接,绝对地址URL,相对地址URL,特殊链接
- 解决 | 老司机都无法解决的事情,谁能解决?
- Bootstrap 插件的事件
- Bootstrap 排版列表
- es6 Promise.race()方法
- 江苏自考计算机组成原理多少分及格,自考《计算机组成原理》基本概念第七章...
- Git笔记(16) 变基
- ajax多选下拉,模拟select下拉框之多选(数据源采用模拟Ajax数据--原创)(示例代码)...
- java接口继承编程题_JavaSE习题 继承接口和泛型
- jquery load 事件用法