测试开发:从0到1学习如何测试API网关

日常工作中,难免会遇到临危受命的情况,虽然没有这么夸张,但是也可能会接到一个陌生的任务,也许只是对这个概念有所耳闻。也许这个时候会感到一丝的焦虑,生怕没法完成领导交给的测试任务。其实也没有必要那么紧张,面对一个陌生的被测对象,我们只需要去了解清楚它的应用场景、内部原理、实现逻辑,结合开发的设计需求,一样也能完成好测试任务,积累经验。这次就分享一些从0到1学习如何测试API网关的经验。

一、什么是API网关

简述:

API网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部的客户端可能需要调用多个服务的接口才能完成一个业务需求,这个时候系统结构会显得非常错综复杂,会出现许多问题:

  • 客户端复杂性增加,现在一般同一套后端服务会支撑多个客户端
  • 存在跨域请求,在一定场景下处理相对复杂
  • 认证复杂,每个服务都需要单独验证
  • 耦合度高,难以重构
  • 某些微服务会存在防火墙等一些保护措施,无法直接访问

微服务网关是微服务架构中的一个关键角色,用来保护,增强和控制对于微服务的访问,微服务网关是一个处于应用程序或服务之前的系统,用来管理授权,访问控制和流量限制等,这样微服务就会被微服务网关保护起来对所有的调用者透明。因此,隐藏在微服务网关后面的业务系统就可以更加专注于业务本身。

组成:

  • 路由转发:接受外界请求,转发到后端微服务
  • 过滤器:完成一系列横切功能,例如权限校验,限流以及监控等

优点:

  • 安全性高,只有网关系统对外进行暴露,微服务可以隐藏在内网,通过防火墙策略保护
  • 易于监控,可以在网关收集监控数据并将其推送到外部监控系统进行分析
  • 易于认证,可以在网关处统一进行认证,无需在后端微服务中进行认证
  • 减少耦合,避免多个客户端与后端微服务之间的交互次数
  • 易于鉴权,在网关处统一鉴权

职能:

  • 请求接入,作为所有API接口服务请求的接入点
  • 业务聚合,作为所有后端业务服务的聚合点
  • 中介策略,实现安全,验证,路由,过滤,流控等策略
  • 统一管理,对所有API服务和策略进行统一管理

二、微服务网关常见技术

  • nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务
  • zuul,Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器
  • spring-cloud-gateway是spring出品的基于spring的网关项目,集成断路器,路径重写等,性能比Zuul好

2.1 gateway是什么

Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Zuul,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

几个概念
  • Route(路由):这是网关的基本构建块。它由一个ID,一个目标URI,一组断言和过滤器定义。如果断言为真,则路由匹配成功。
  • Predicate(断言):输入类型是一个ServerWebExchange。我们可以使用它来匹配来自HTTP请求的任何内容,例如headers或参数。
  • Filter(过滤器):Gateway中的Filter分为两种类型的filter,分别是gateway filter和global filter,过滤器会对请求和响应作处理。

2.2 gateway怎么用

说到底predicate就是为了实现一组匹配规则,方便让请求过来找到对应的Route进行处理,而spring cloud gateway内置了几种predicate的使用。

1、通过时间匹配

Predicate 支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。比如我们现在设置只有在 2018 年 1 月 20 日才会转发到我的网站,在这之前不进行转发,我就可以这样配置:

spring:
  cloud:
    gateway:
      routes:
       - id: time_route
        uri: http://youknowit.com
        predicates:
         - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]

2、通过cookie匹配

Cookie Route Predicate 可以接收两个参数,一个是 Cookie name , 一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

spring:
  cloud:
    gateway:
      routes:
       - id: cookie_route
         uri: http://youknowit.com
         predicates:
         - Cookie=youknowit, value

3、通过请求路径匹配

Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://x.x.x.x:8022/
        predicates:
        - Path=/foo/{segment}

如果请求路径符合要求,则此路由将匹配,例如:/foo/1或者/foo/bar。

当然内置的匹配规则还有很多,通过请求参数,请求方式,请求IP地址等去匹配,也可以组合使用。

注意:

一个请求满足多个路由的谓词条件时,请求只会被首个成功匹配的路由转发

本次提测版本,开发使用spring-cloud-gateway来将平台业务侧引入网关, 将网关作为调用PaaS的唯一入口,便于维护,同时利用网关的能力实现限流,熔断,鉴权,灰度验证等功能。第一期只接入统一前装,充分验证后后续接入其他应用。因此,本次测试的重点在路由转发功能。

三、常见测试点

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 5000
        response-timeout: 5s
        ssl:
          close-notify-flush-timeout-millis: 3000
          close-notify-read-timeout-millis: 0
          handshake-timeout-millis: 10000
          useInsecureTrustManager: true
      routes:
        # gis
        - id: gis_route
          predicates:
            - Path=/gis/**
          uri: http://x.x.x.x:8022/

知道了网关的基础知识和基本原理之后,对于我们如何测试它,作为一名测试人员心中已经有了大概的思路,接下来就是根据我们实际的需求去列出测试点,并进一步转换为用例去执行。从上面开发给出的配置能知道,此次开发提测主要是实现了基于路径匹配的路由转发功能,其余功能暂未引入,这样想来就简单了许多。

3.1 功能测试

常见请求正常转发

  • get请求正常转发:带参数与不带参数
  • post请求正常转发:数据格式校验,例如json,form等
  • delete请求正常转发:带参数与路径带参
  • put请求正常转发:数据格式校验,例如json,form等
  • patch请求正常转发:数据格式校验,例如json,form等
  • 接口超时测试:具体的边界值测试需根据自身业务需求场景来设计case
  • 文件上传功能:大小限制,乱码问题,格式问题
  • 路由规则:根据项目需求的不同规则来制定,例如全量匹配,正则,先后顺序等
  • 负载策略:轮询,权重等
  • 超时设置

3.2 插件测试

API网关插件各个公司根据不同的需求有不同的插件,此次提测也没有涉及,所以收集整理了一些常见的通用插件,例如降级,限流,熔断,跨域,abtest插件等,提供一些测试思路。

限流

基本概念: 客户端请求太多,超出了服务端的承受能力,导致服务端不可用或无法响应,耗尽服务端资源甚至是服务崩溃。解决方案:服务端对客户端进行限流,保护服务端资源。对各类请求设置最高的QPS阈值,当请求高于阈值时直接阻断。

限流插件测试思路:可以在API网关平台为对应测试接口配置限流策略。根据不同时间,使用压测工具进行阶段性的压力测试,并统计阻断接口数,具体的数值可以根据自身业务场景进行测试。

降级

基本概念: 服务降级是指当服务器压力剧增的情况下,根据实际业务情况,将一些不重要的接口换种简单的方式处理,从而将服务器资源释放给当前的核心业务使其可以高效运作。

降级插件测试思路:降级策略主要看开发如何选择,有的就是让请求无法访问到后端服务,借口暂停使用,当接口配置降级插件。插件开关打开,返回API网关所配置的响应信息状态码等,接口是无法真正的请求到后端服务。

熔断

基本概念: 微服务架构中,各个微服务之间相互依赖非常普遍,因此在整个链路中 ,有一个环节出现问题,都会造成整个上下游服务调用出现问题,服务出现宕机。也就是说,熔断就是调用方发起服务调用时,如果被调用方返回的错误率超过一定的阈值,那么后续的请求不会真正发起请求,而是调用方直接返回错误。两个关键点,判断何时熔断和何时从熔断状态恢复。

熔断插件测试思路: 不同的网关有不同的熔断策略,例如针对5xx的返回,根据不同的入参控制返回,可返回2xx,4xx,5xx,当规定的时间5xx数达到阈值,服务是否开启熔断。熔断恢复测试也是一样,比如10s,允许部分请求通过,你可以继续控制请求,若这部分请求都成功,恢复熔断。具体的case设计还是要根据自身业务为准。

跨域

基本概念: 跨域是指,只要协议,域名,端口有任何一个不相同,都被当作是不同的域。所谓同源策略就是指,协议,域名和端口都要相同,其中有一个不同都会产生跨域。

跨域测试思路: CORS是一种基于HTTP头的机制,该机制通过允许服务器标识除了自己以外的其他origin,这样浏览器可以访问加载这些资源。浏览器必须首先使用OPTIONS方法发起一个预检请求,从而获知服务端是否允许该垮源请求。服务器允许之后,才发起实际的HTTP请求。在预检请求的返回中,服务端也可以通知客户端,是否需要携带身份凭证。测试时,我们就可以通过是否需要携带参数,身份凭证等;各种参数组合,不同请求等方面去设计case。

3.3 容错测试

  • 数据库宕机或者重启:新发布的路由或者插件设置等数据操作可能失败,但是不影响已生效的路由和插件
  • 后端服务其中一台或多台宕机,重启,添加新节点等:负载策略能够自动提出不可用的服务节点和自动增加新的服务节点
  • redis服务宕机一台或多台:不影响已生效路由和插件
  • eureka挂一台或多台:不影响已生效负载策略

注意: 数据库down,因为有本地缓存,验证本地缓存是否生效,所以数据库重启或者down掉,不能影响已经生效的路由和插件;后端服务down掉一台,验证eureka是否有将死掉的节点删除,若eureka并没有将死掉的节点删除,则会报错。添加新的节点,需要看请求是否有轮询;redis主要用于限流,在redis down掉限流策略失效,但是其他插件功能及路由应该不受影响;eureka是注册中心,注册中心在启动的时候会将所有资源加载本地,所以eureka挂一台或者多台,不影响已经加载到本地的。
总上所述,总结来说就是API网关的所有依赖都可以down,但是gateway不可以不用。

3.4 压力测试

  • 正常压测:压API网关的API即可
  • 负载测试:压测时,增加和减少后端服务节点;某个服务资源打满或者超时严重,不影响其他项目正常访问
  • 切换路由配置
  • 项目资源测试:超过配置资源返回错误

注意: 项目资源的作用是进行线程隔离,每个项目资源分配应该是固定的,不能抢占其他项目资源而导致其他服务不可用,进行负载测试时,增加压力,增加和减少后端服务节点,请求应该不报错。

四、总结

上述内容,是对一些网关通用功能的测试思路总结。由于本次开发提测网关版本并没有涉及过多的功能,例如还有集群的热加载,插件在集群项目与API间的运用,API的发布,下线,插件的随时切换,监控等需求,亲身实践还不够,只能提供一些思路,还需要具体结合项目的业务进行更为准确的case设计。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【微服务】面试题(一)

最近进行了一些面试,这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务(Microservices)和分布式系统(Distributed Systems)是两种不同的软件架构风格,虽然它们之间有些重叠&#…

南京观海微电子---Vitis HLS设计流程(实例演示)——Vitis HLS教程

1. 前言 课时2我们介绍了Vitis HLS的设计流程,如下图所示: 算法或软件的设计和仿真都基于C/C,通过HLS平台导出打包好的IP RTL代码,最后将该打包的IP加入到主工程使用。 本课时,我们通过一个具体的实例,演示…

Kibana管理ES生命周期

希望通过Kibana界面管理ES索引的生命周期 版本:7.15.2 创建索引模板 创建索引模板方便匹配索引,对匹配到的一批索引采用同一套生命周期管理策略,例如开发环境的所有索引以dev-开头,可以创建样式为dev-*的索引模板以匹配开发环境…

【服务器uwsgi + flask + nginx的搭建】

目录 服务器uwsgi flask nginx的搭建1. 安装必要的软件2. 启动nginx服务3. 测试Nginx4. 配置uwsgi和flask5. 配置nginx 服务器uwsgi flask nginx的搭建 1. 安装必要的软件 安装Python、uWSGI、Flask 和 Nginx。 # Ubuntu 安装命令 sudo apt-get update sudo apt-get ins…

海外媒体宣发,穿透与世界的交流 - “保姆级”教程 - 大舍传媒

1. 引言 在当今高度信息化的世界,境外媒体宣发已经成为企业、品牌和政府机构推广自身形象、扩大影响力的重要手段。如何在国际舞台上有效传播信息,提高国际知名度,成为了许多组织面临的重要课题。大舍传媒凭借多年的境外媒体宣发经验&#x…

第六篇: 3.5 性能效果 (Performance)- IAB/MRC及《增强现实广告效果测量指南1.0》

​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇 广告效果测量定义和其他矩阵之- 3.1 广告印象(AD Impression)第三篇 广告效果测量定义和其他矩阵之- 3.2 可见性 (Viewability…

Goingpub国自然基金-免费查询

可进行年份、学部、项目类别等检索,支持生成主题词汇总分析报告。 最最最关键,免费,只需要你注册登录一下,防止被爬虫侵扰。 界面简单,实用,支持模糊搜索,包含最新2023年数据,共56…

34-4 CSRF漏洞 - CSRF跨站点请求伪造

一、漏洞定义 CSRF(跨站请求伪造)是一种客户端攻击,又称为“一键式攻击”。该漏洞利用了Web应用程序与受害用户之间的信任关系,通过滥用同源策略,使受害者在不知情的情况下代表攻击者执行操作。与XSS攻击不同,XSS利用用户对特定网站的信任,而CSRF则利用了网站对用户网页…

yolov9直接调用zed相机实现三维测距(python)

yolov9直接调用zed相机实现三维测距(python) 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1. yolov4直接调用zed相机实现三维测…

iPhone卡在苹果标志如何修复?

由于多种原因,您的 iPhone 可能会陷入白色 Apple 标志。第一次出现的时候你可能并没有多在意,以为只是这次时间比较长,直到发现任何操作都无法恢复到正常状态,这时你就开始感到焦虑了。这时,你可能会认为在尝试了很多你…

基于ARM内核的智能手环(day6)

模拟量传感器 模拟量传感器可以提供连续的输出信号,通过测量和转换物理量的变化来获取相关信息。其中包括: 光照传感器 光照传感器常用于测量周围环境的光照强度。其特点包括: 使用光敏电阻作为传感器元件。光敏电阻的阻值随着光照强度的…

3D数据发布工具HOOPS Publish如何将3D模型转换成PDF格式?

在现代科技发展的推动下,3D技术在各个行业中扮演着越来越重要的角色。从工程设计到医疗保健,从建筑规划到教育培训,3D模型都成为了理解、沟通和展示复杂数据的主要工具。而将这些3D模型转换成PDF格式,能够使其更易于共享、存档和展…

让智能体像Excel易用还要多久?

2023年,国内AI产业迎来狂飙时代。大模型热潮推动AI智能体(AI Agent)发展,继ChatGPT成功后,OpenAI目标直指AI Agents。上半年,行业竞相扩大模型规模、提升参数和计算能力,抢占AI浪潮先机。然而&a…

单身女孩的心事26岁的我在寻找另一半微信脱单群

在繁华的都市中,有一个名叫小雅的26岁女孩,她每天穿梭在拥挤的人群中,过着看似平凡却充满期待的生活。小雅是一个性格开朗、独立自主的女孩,她有着稳定的工作和不错的收入,朋友们都羡慕她的生活。然而,小雅…

IP-GUARD内置用户系统同步飞书组织架构使用说明

一、功能简介 实现将飞书的通讯录组织架构同步到内置用户系统。 二、功能配置 2.1 飞书创建自建应用 在浏览器上打开飞书开放平台 https://open.feishu.cn ,登录管理员账号后点击开发 者后台 在开发者后台点击创建企业自建应用,填写自建应用程序名称以及描述,设置图标,点…

nestjs 全栈进阶--module

视频教程 10_模块Module1_哔哩哔哩_bilibili 1. 模块Module 在 Nest.js 中,Module 是框架的核心概念之一,用于组织和管理应用程序的不同部分,包括服务、控制器、中间件以及其他模块的导入。每个 Nest.js 应用程序至少有一个根模块&#xf…

【QT+QGIS跨平台编译】076:【libdxfrw跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libdxfrw介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、libdxfrw介绍 libdxfrw是一个用于读取和写入DXF(Drawing Exchange Format)文件的开源C++库。DXF是一种由AutoCAD开发的文件格式,用于存储CAD(计算机辅助设计)图形数据,它…

【代码随想录】哈希表

文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …

基于计算机视觉的交通信号违章检测系统(闯红灯违章检测)

Introduce: 该系统可以实时检测交通信号灯违规: 城市中越来越多的汽车会导致大量交通拥堵,这意味着如今在孟加拉国和世界各地,交通违规行为变得更加严重。这造成了严重的财产破坏和更多可能危及人民生命的事故。为了解决令人震惊的问题并防止这种深不可…

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置

Flask Python Flask-SQLAlchemy中数据库的数据类型、flask中数据可的列约束配置 SQLAlchemy官方文档地址实战的代码分享数据类型列约束配置自定义方法 SQLAlchemy官方文档地址 SQLAlchemy官方文档地址 实战的代码分享 Flask-SQLAlchemy框架为创建数据库的实例提供了一个基类…