阿里微服务质量保障系列(一):微服务知多少

news2024/11/15 11:16:12

年初买了一本集团巨佬联合出的书《阿里测试之道》,然后认真拜读了下,我相信看过的同学都会获益匪浅,此书分享了阿里在大促保障、移动App测试、大数据测试、AI系统测试、云计算测试、资损防控、物流类测试等领域的方法、技术和工具平台,让外界得以了解阿里在测试领域的一系列技术创新、经验和方法。但是说实话,个人感觉此书适合互联网行业的高级测试管理和技术人员阅读,对于奋斗在一线的大头兵而言,此书除了可以了解先进的测试思想外,其实可操性不太大。而奋斗在“一线”阿里的测试工程师是怎么保障微服务质量的呢?想必大家也同样感兴趣,这也是我做阿里微服务质量保障系列文章的原因。本来我是想以一篇文章概之,但一篇长篇大论的文章势必分不清重点,倒不如做成一个系列。

我会从微服务开始介绍,最后以阿里的测试基建收尾,整个系列分7篇文章,每篇文章重点如下:

  • 微服务知多少
  • 研发流程知多少
  • 环境知多少
  • 域内测试知多少
  • 全链路测试知多少
  • 支付系统质量保障知多少
  • 测试基建知多少

本文主要介绍微服务,对比单体架构和微服务架构的特性,以及微服务架构的测试难点和测试策略。

如何理解微服务?

微服务体系结构是一种将大型应用程序分解为一组较小的服务的方法每个服务都在自己的进程中运行,并使用 HTTP/HTTPS、RPC 或 AMQP 等协议与其他进程进行通信。每个微服务在特定的上下文边界内实现特定的端到端域或业务功能,每个微服务都必须自主开发,并且可以独立部署。每个微服务应拥有其相关的域数据模型和域逻辑,并且可以基于不同的数据存储技术(SQL、NoSQL)和不同的编程语言

当然概念比较抽象,我以自身的两份工作经历,让大家感受下微服务和单体架构的区别,这样有利于你理解后面的内容同时更加有代入感。

单体应用架构下的服务特性

17年第一份工作,当时测试的投顾平台就是一个单体应用,它是前后端分离的项目,前端是Vue框架实现,后端Spring+SpringMVC+MyBatis实现。当时的每天的工作内容就是集成打包、上传jar包到服务器,运行应用然后开始测试。由于开发没有沉淀单测用例,开发扩展新功能畏手畏脚,经常会牵一发动全身,完全靠测试保证质量。那段时间测试压力超级大,即便是很小的改动,也要重新重新打包部署,测试也要把端到端所有功能回归一遍,那段经历简直糟糕透了,大部分时间耗费在测试之外的事情上。
现在看起来,单体应用就像一个完整的人,身上的任何一个部位“手术”后,都要将人留院观察(回归)全部“功能”确认没问题后,医生方可建议出院。 如果微服务更像各种服务组装成的机器人。某个功能出现问题就根治某部位,再观察(回归)对应的部分功能是否OK即可,降低了测试成本。

微服务架构下的服务特性

可以用下图的股票交易系统架构为例:

其中order服务、fee服务、account transaction服务、market服务都是独立的服务,可以有自己的存储系统、特定的技术栈实现,而各个服务可以独立部署和开发。

可以看到微服务的几个关键特性。

  • 微服务具有规模小、独立和松散耦合的特点。
  • 每个微服务具有一个单独的代码库,可由小型开发团队进行管理。
  • 微服务是独立部署的。 团队可以更新现有微服务,而无需重新生成和重新部署整个应用程序。
  • 微服务负责将其数据或外部状态保存到各自的数据库中。与整体体系结构不同,微服务不共享数据库。
  • 微服务使用定义完善的 API 相互通信。 每个服务的内部实现细节均对其他服务隐藏。
  • 微服务无需共享相同的技术堆栈、库或框架。

微服务测试难点?

架构设计复杂度高

微服务将单体架构分解为粒度更细、更易管理的服务,但这意味着要引入更多的服务间依赖关系

对于测试同学而言,你不能只像以前单体应用服务测试时那样只关注系统整体实现了什么,还需要关注系统架构设计、每个服务实现的功能、上下游调用关系和调用方式(同步调用、异步调用)等。

团队协作难度大

系统依赖性的增加会给团队协作带来更大的沟通成本。

康威定律想必大家都了解,

ommunication dictates design。
组织沟通方式决定系统设计。

这条定律重点是讲组织架构和沟通对系统设计的影响组织的沟通和系统的设计之间紧密相连,特别是复杂系统,解决好人与人的沟通才能有一个更好的系统设计

《人月神话》一书中总结出了随着人员的增加沟通成本呈指数增长的规律:沟通成本 = n(n-1)/2。

举例说明一下:

5人项目组,需要沟通成本是 5*(5–1)/2 = 10

15人项目组,需要沟通成本是15*(15–1)/2 = 105

50人项目组,需要沟通成本是50*(50–1)/2 = 1225

150人项目组,需要沟通成本是150*(150–1)/2 = 11175

此外不同团队,经常遇到同一个项目,开发频率不一致的情况,团队需要等待其他团队,以便完成相关微服务的并行开发;团队需要等待测试环境进行完整的搭建和配置后,方可实现整体联调、测试和验收。

测试成本高

微服务架构的复杂性使测试工作本身变得更加困难。测试挑战包括测试环境、测试方法。

1. 测试环境

这块后面的内容会详细介绍。因为微服务架构下,经常出现并行开发的情况,因此不同的开发同学拉自己的项目迭代,不同的迭代都有自己的联调环境。对于阿里而言,这边的环境总体上分为三大类:开发、测试、线上。其中开发环境又分为Dev环境、Stable环境;测试环境分为test环境、e2e环境。生产环境分为预发pre环境、灰度gray环境、生产环境。虽说这么多环境不用测试同学全部维护,但是不同环境因配置差异出现的问题也经常耗费测试同学额外的测试成本。

2. 测试方法

直接用单体应用架构下的测试方法来测试微服务并不可行。单体应用架构下,通常用端到端测试的方式对业务功能进行整体验证。而在微服务架构下,因为测试对象发生了变化,即从测试产品转变到测试实现产品功能的微服务,需要对测试对象进行重新分析,则需要调整新的测试策略和测试技术。

微服务测试策略?

单体架构下的金字塔测试策略显然不适用于微服务架构,微服务测试策略更像“钻石”。

  • 单元测试 :从服务中最小可测试单元视角验证代码行为符合预期,以便测试出方法、类级别的缺陷。
  • 集成测试:验证当前服务内部模块之间的通信方式或者交互符合预期,以便测试出内部集成缺陷。
  • 域内测试:验证微服务实现的功能以及与外部交互的异常场景(例如调用超时、服务异常、网络异常等)服务预期。
  • 契约测试:验证当前服务与外部服务之间的交互,以表明它符合消费者服务所期望的契约。
  • 全链路测试测试:也叫端到端测试。从用户视角验证整个系统的功能能否符合用户的预期。

- END -


关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

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

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

相关文章

十一、Properties、多线程

Properties集合 Properties作为Map集合的使用 介绍 是一个Map体系的集合类Properties可以保存到流中或从流中加载属性列表中的每个键及其对应的值都是一个字符串 基本使用 public static void main(String[] args) {Properties prop new Properties();//增prop.put("…

Pytorch c++ 部署报错解决方案

目录 1. Only the versions between 2017 and 2019 (inclusive) are supported! 2. Cannot find cuDNN library. Turning the option off C 部署的时候,demo 写完之后,提示如下错误 1. Only the versions between 2017 and 2019 (inclusive) are sup…

使用Kubernetes部署xxl-job-admin及xxl-job执行器服务

部署环境 xxl-job-2.4.0kubernetes-1.26 这里以xxl-job官方的2.4.0的代码为例子,在官方编写的Dockerfile基础上使用dockerkubernetes进行部署,xxl-job-admin和执行器的Dockerfile、application等配置文件并不是关键,所以这里示例安装以官方…

Linux系统初始化进程及文件(带命令)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.系统初始化进程及文件 1.init 进程 2.Systemd概述 3.SysVi…

【Java语言】— 循环结构 :for循环

循环结构:for循环 1.for循环 控制一段代码反复执行很多次。 for循环的格式如下: for (初始化语句;循环条件;迭代语句){循环体语句(重复执行的代码);}下面我们通过案例:输出3次HelloWorld感受一下。 //需求:输出3次HelloWorld…

OpenOCD 不同仿真器使用操作总结记录

针对不同的仿真器使用 OpenOCD 时候的设置操作总结 ...... 矜辰所致目录前言一、OpenOCD 环境搭建二、OpenOCD 基本测试三、Makefile 中仿真器配置3.1 ST-link3.2 Jlink3.2 CMSIS-DAP(待更新)结语前言 在使用 GCC 环境开发 ARM 系列芯片的时候&#x…

ArcGIS基础实验操作100例--实验35等高线生成DEM

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验35 等高线生成DEM 目录 一、实验背景 二、实验数据 三、实验步骤 方法一 &#xff…

4.5、静态路由配置及其可能产生的路由环路问题

静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表\color{red}人工配置路由表人工配置路由表。 这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化。\color{red}但不能及时适应网络状态&#xff08…

我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料

十三、资源包与玩家资料 1.资源包(Resource Pack) 早期的 Minecraft 并没有资源包一说,而是被叫做材质包。有些服务器为了让玩家拥有更好的游戏体验,一般会在自己特制的客户端中存放一些资源包供玩家加载。 显然,使用…

自动梯度计算

神经网络的参数主要通过梯度下降来进行优化. 当确定了风险函数以及网络结构后, 我们就可以手动用链式法则来计算风险函数对每个参数的梯度, 并用代码进行实现. 但是手动求导并转换为计算机程序的过程非常琐碎并容易出错&#xff0…

二叉树的基础oj题(单值二叉树、相同的树、对称二叉树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的构建和遍历、翻转二叉树)

今天,我带来二叉树的基础oj题 目录单值二叉树:[链接](https://leetcode.cn/problems/univalued-binary-tree/)相同的树:[链接](https://leetcode.cn/problems/same-tree/)对称二叉树:[链接](https://leetcode.cn/problems/symmetr…

syzkaller 黑盒测试1:环境搭建

syzkaller 黑盒测试1:环境搭建 近期需要使用syzkaller对某Linux发行版系统内核进行测试,但是未提供内核源码,只能在黑盒条件下测试。这是笔者第一次接触syzkaller,对测试流程不太熟悉。另外,网上很少有syzkaller黑盒测…

C语言版扫雷——从0到1实现扫雷小游戏

🐒博客名:平凡的小苏 📚学习格言:有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…

9_2、Java基本语法之常用类日期、时间类的使用

一、JDK 8之前时间日期API jdk8之前的日期时间类 1.System的currentTimeMillis() 2.java.util.Date以及子类java.sql.Date 3.SimpleDateFormat 4.Calender类:日历类 1、获取系统当前时间:System类下的currentTimeMillis(); //返回的是当前时间与1970年…

MySQL--整合Keepalived进行双机热备自动切换(升级版)

原文网址:MySQL--整合Keepalived进行双机热备自动切换(升级版)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL整合Keepalived进行双机热备自动切换(升级版)。 服务器要考虑高可用问题。nginx、tomcat、缓存、队列、数…

Java开发的古董拍卖系统竞标系统拍卖网

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家,发布古董展品,设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间,则不可以竞拍。多人竞拍,买家可以根据最高价设置谁中标&#xff…

系分 - 结构化方法【概念】

个人总结,仅供参考,欢迎加好友一起讨论 系分 - (概念)结构化方法 结构化方法贯穿整个软件工程全部,可以单独细分出来作为某个软件工程环节的技术指引 结构化方法,由结构化分析(SA,St…

【C语言进阶】速学,不会用数据库可不能再错过文本与二进制文件操作

目录 ✨前言✨: 🎈一、文本文件与二进制文件🎈: 🎁二、文件读取结束的判定🎁: 1.错误使用 feof 函数: 2.判断文件读取结束: 🎊三、文件缓冲区&#x1f38…

Ubuntu虚拟机图文安装详细教程

Hello, 小伙伴们,大家好!今天教大家一步一步进行ubuntu虚拟机的安装。俗话说的好:“工欲善其事必先利其器”,作为一名嵌入式软件开发人员,我们必须熟悉Linux系统的操作及使用,熟练掌握Linux系统下的开发&am…

java 接口的私有方法

其实java8就已经做下伏笔了 在拥有静态和默认 两种拥有方法体的方法之后 接口出现私有方法也是一种必然 然后我们来创建一个包 包下创建一个接口 subInterface 参考代码如下 public interface subInterface {private void show2() {System.out.println("我是一个私有方…