API网关服务
Posted 之家技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了API网关服务相关的知识,希望对你有一定的参考价值。
总篇第23篇 2018年第23篇
一、概述
1.网关背景介绍
API网关作为服务的统一入口,降低了构建微服务的复杂性,防止由于提供服务的API Crash或性能不稳定造成用户体验下降。
它解决了我们日常工作中遇到如下问题:
(1)接口性能差,短期内由于各种原因无法优化,如何在0技术投入的情况下迅速提升接口的读取性能?
(2)由于网络抖动或请求量增大导致服务短时间内无法使用,如何保证这段时间服务的高可用?
(3)接口格式不统一调用接口时需要重新封装代码(创建数据模型、解析请求参数、解析响应结果等),如何不重新开发就可以自动适配请求参数、响应结果的格式?
(4)新开发一个接口需要重启服务导致线上服务出现波动,如何在不停服务的情况下发布API?
2.优势及功能
(1)网关的主要优势:
1)N倍提升读取性能:在不改动业务代码的前提下通过网关快速提升接口的读取性能。
2)屏蔽接口不稳定性:服务异常后网关仍可一段时间内提供可用服务;对API的错误率进行统计及时发现服务的潜在风险,并可定制短信提醒。
3)数据模型转换:通过Groovy动态脚本对请求参数和响应结果格式进行自动适配。
4)一键反向代理:操作界面简单配置,一键发布,无需停服务快速生成可用API。
(2)网关的主要功能:
蓝色部分为已完成功能,灰色部分进行中和后期规划功能。【具体功能描述在后面的功能列表和后期规划中进行详细介绍】。
二、开源网关对比
下面对API网关服务、Zuul和Spring Cloud Gateway的基本功能进行一个简单的对比。目前市面上有很多开源的API网关,之所以选择Zuul和Spring Cloud Gateway进行对比,因为Zuul是目前应用非常广泛的开源网关,而Spring Cloud Gateway是Spring官方基于Spring5.0开发了,是构建于Spring大家族之上的网关,是以替换Zuul的姿态出现的。
从上图可以发现,Zuul和Spring Cloud Gateway更多的为微服务提供解决方案,针对微服务相关的功能比较完善,但不关心具体的业务场景。
API网关既然是网关所以也拥有网关的基本功能,如负载均衡、限流、熔断、降级等。API网关的重心更多的是针对现实业务中常见的问题和痛点,提供一套通用简洁的解决方案,从而提高开发的效率,所以API网关有一些特有功能,如动态缓存、数据模型转换、静态响应、结果聚合等。
三、场景使用样例
下图举例介绍为了提升API读取性能接入网关调用方和服务提供方需要做哪些改动。
四、适用场景
以下介绍API网关服务常见的几种业务场景。
1. 提升API读取性能
场景:接口性能差,对方短时间内无法优化,我们自己优化又需要增加额外的研发工作量。
功能:使用API网关的缓存功能,将响应结果在网关层缓存,无需开发就可提升API的读取性能,减少开发的工作量。
2. 请求参数和响应结果格式适配
场景:接口格式不统一,每个接口都需要定义数据模型,写代码解析请求参数、解析响应结果。
功能:数据模型转换包含请求参数转换和响应结果转换,请求参数转换可以读取请求参数,映射成成统一的参数名称,响应结果转换可以读取响应结果,转换成统一的格式再响应,调用方不需要再针对接口做适配工作,减少开发的工作量。
3. 提供Mock接口
场景:多方配合开发,依赖对方接口进行测试,希望提供Mock接口开发测试使用。
功能:API网关提供Mock集成功能,通过配置一键生成Mock接口返回Mock数据,减少开发Mock接口的工作量。
4. 聚合多个接口的响应结果
场景:一个商品的库存、价格需要调用两个服务的接口才能拼接完全,没有合适的服务方来提供这种组合接口。
功能:API网关的结果聚合功能,可以将多个接口聚合成一个接口,由网关分别调用多个接口然后聚合响应结果,一次请求即可返回,既减少了封装响应结果的工作量,还降低了外网访问的网络开销。
五、业务架构
API网关构建在第三方服务与内部服务中间,通过HTTP的方式进行交互。API网关本身分为网关服务和管理后台服务,网关服务负责提供高性能的API访问,管理后台服务提供简洁的API配置界面对API配置信息进行增删改查发布,同时接入配置中心,做到配置信息动态实时更新。
业务架构图如下:
六、技术架构
API网关在技术实现上做了分离,共分为11个部分。技术架构图如下:
(1)接入层
负责接入API的鉴权、跨域访问、限流、降级等功能。
(2)服务编排层
对请求参数进行转换,对响应结果进行处理,同时处理多接口合成一个接口的调用功能。
(3)反向代理层
提供第三方API的鉴权,Mock功能,熔断后的重试机制,请求超时的重试机制等。
(4)分布式事务
提供事务管理器,支持TCC事务,记录事务日志。
(5)Cache层
通过网关标识、过期时间和参数生成缓存的key,过滤掉动态参数,缓存响应结果。
(6)操作后台
提供配置界面,查看API列表,检索API,API配置信息的增删改查,API的发布、下线,查看API历史发布版本,恢复历史版本等功能。
(7)日志处理
采集API访问的日志信息,对日志进行分析,统计出调用量、响应时间等API的关键指标。
(8)健康检测
检测第三方服务的API是否异常,可以对异常服务进行降级控制,同时检测网关服务是否异常。
(9)异常、报警
定义不同异常级别,记录异常日志,根据异常级别选择报警方式,可以不报警或者短信、钉钉报警。
(10)共享内存
将降级开关、Mapping配置文件、限流配置、熔断配置、缓存配置等写入共享内存。
(11)配置获取
从配置中心和共享内存中读取配置信息,对配置信息进行解析,并校验配置信息的合法性与合理性。
七、功能列表
1. 动态缓存
提供对响应结果缓存的功能,减少接口性能优化的工作量。
配合熔断等功能在第三方接口异常后通过配置仍可通过网关提供可用服务,提高用户体验。
2. 数据模型转换--请求参数
通过Groovy脚本解析请求参数,将请求参数转换成统一格式,无需开发就可以达到请求参数适配的效果。
3. 数据模型转换--响应结果
通过Groovy脚本解析响应结果,转换成统一格式再进行响应,无需开发就可以达到响应结果适配的效果。
4. Mock集成
通过配置Mock的响应结果,一键发布生成Mock接口,提供Mock数据。
5. 版本控制
支持回滚API的任意历史发布版本。
6. 结果聚合(开发中)
将并行调用的多个接口通过配置无需开发生成一个新的接口,减少服务方开发接口的工作量,减少调用方多个接口依赖的处理工作。
7. 服务依赖(开发中)
将串行调用的多个接口通过配置无需开发生成一个新的接口,减少服务方开发接口的工作量,减少调用方多个接口依赖调用的处理工作。
8. 负载均衡
9. 熔断
触发配置规则进入熔断,熔断开启后可报警也可开启限流、降级、动态缓存等功能,保证服务仍然可用。
熔断器有三个状态,开启、半开起、关闭。调用失败次数积累,到了阈值,熔断器进入开启状态,在此期间所有请求返回熔断结果,一段时间后(可配置),熔断器进入半开起状态,此时有请求过来,熔断器会请求后端服务,成功则熔断器关闭,异常则重新回到开启状态。
10. 限流
提供针对API的限流功能,采用令牌桶的方式实现,支持预消费令牌,限流生效后返回指定响应内容。
11. 降级
针对API自动或手动降级。熔断探测到服务异常后可自动进行降级,也可通过配置页面手动开启降级,降级生效后返回指定响应内容。
12. 跨域
通过Cors解决浏览器跨域访问问题。
八、配置页面
配置界面包含8个部分。
1. 基本信息
1)名称:API的名称,全局唯一,不可修改;
2)请求类型:取值范围(GET、POST、PUT、DELETE等);
3)跨域:跨域开关,取值范围(开启、关闭);
4)MOCK:MOCK结果;
5)测试链接:该API在网关上可访问的测试链接;
6)测试响应结果:上面测试链接返回的响应结果,用来验证接口是否正常。
2. 缓存
1)开关:是否开启缓存,取值范围(开启、关闭)。
2)时间:缓存的过期时间,缓存开启则不能为空,大于0,单位秒
3)Key生成策略排除参数:参数名称,多个以逗号分隔,用来过滤动态参数。
3. 熔断
1)开关:取值范围(开启、关闭);
2)失败次数:大于0,默认5次,达到失败次数熔断器进入开启状态;
3)超时时间:大于0,默认0不限制;
4)重置状态时间:单位秒,默认30,熔断器进入开启状态之后达到重置状态时间后进入半开起状态;
5)重试次数:默认0不重试;
6)响应内容:熔断生效后的响应内容。
4. 限流
1)访问限制/单位:取值范围(不限制、1秒);
2)API访问次数:限制的访问次数,大于0,类型为1秒时不能为空;
3)响应内容:限流生效后响应内容。
5. 降级
1)开关:取值范围(开启、关闭);
2)响应内容:降级开启后响应内容。
6. 负载均衡
1)策略:取值范围(轮询、随机);
2)Host:配置Host映射;
7. 数据模型转换
1) 请求参数:Groovy脚本内容;
2) 响应结果:Groovy脚本内容。
8. 编排聚合
1)类型:取值范围(结果聚合、服务依赖);
2 配置:结果聚合或者服务依赖的配置信息,有上面的类型决定。
九、性能测试
目前开发环境的服务器8核8G内存,JVM内存采用目前普遍常用的配置-Xms512m-Xmx512m。
选用ab作为压力测试的工具,ab是Apache服务器自带的一个压力测试工具,可以模拟多线程并发请求,测试服务器负载压力,是目前比较常用的压测工具。-n表示请求数,-c表示并发数。
一般系统并发数1000就能满足需求,API网关性能要求会更高一些,但考虑到我们用开发环境进行的压测,机器上部署了其他服务,同时机器性能比生产环境差,所以选取1000作为最高的并发用户数。
以下是请求数10000,并发数分别为200,600,1000的压测结果汇总:
(1)执行ab -n 100000 -c 200,10万请求200并发,如图:
(2)执行ab -n 100000 -c 600,10万请求600并发,如图:
(3)执行ab -n 100000 -c 1000,10万请求1000并发,如图:
十、后期规划
1. 结果聚合
将并行调用无相互依赖的多个接口通过配置在API网关上聚合成一个接口。
2. 服务依赖
将串行调用的相互依赖的多个接口通过配置在API网关上合成一个接口。
3. 健康检测
第三方服务检测,主动探测服务是否存活,结合降级等功能对异常服务的响应结果进行控制。
4. 日志采集
采集API的调用日志,通过日志对API性能进行统计分析,以报表的形式展现。
以上是关于API网关服务的主要内容,如果未能解决你的问题,请参考以下文章