38.【学习心得】学习心得-一人一套测试环境

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【学习心得】学习心得-一人一套测试环境

文档参考:书名:《从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战》-王伟杰

image.png

前文如下:


23.【学习心得】学习心得-冷热分离概述

24.【学习心得】学习心得-如何分离冷热数据

25.【学习心得】学习心得-基于MySQL的分表分库

26.【学习心得】学习心得-读缓存

27.【学习心得】学习心得-如何更新redis缓存

28.【学习心得】学习心得-写缓存

29.【学习心得】学习心得-写缓存实现思路

30.【学习心得】学习心得-秒杀架构

31.【学习心得】学习心得-全链路日志

32.【学习心得】学习心得-熔断场景

33.【学习心得】学习心得-熔断技术选型

34.【学习心得】学习心得-限流

35.【学习心得】学习心得-数据一致性

36.【学习心得】学习心得-数据同步

37.【学习心得】学习心得-BFF

1. 解决思路


解决思路如下。

1)利用容器的特性,在几秒内快速启动服务实例。

2)将测试环境需要搭建的服务通过容器实例部署起来。

3)将这些容器通过Kubernetes管理(编排)起来。那么,这一整套测试环境都需要包含哪些服务器?


如图17-1所示,每套测试环境中需要部署的组件有MQ、ZooKeeper、Redis、配置中心、数据库、API服务、后台服务、网关等。


网络异常,图片无法展示
|


之前评估过,如果把上述这些中间件部署到容器中,将会出现以下3种情况。

1)中间件服务端改造成本大。

2)客户端的SDK需要进行大量的改造。

3)最重要的一点是,会导致容器环境与其他普通环境存在很大的代码差异。因此,即使在容器中测试没问题,也需要在其他环境中进行大量测试,此时容器测试环境就没有什么意义了。为此,最终决定在容器测试环境中只部署独立的API服务或后端服务,其他组件直接重用测试环境的中间件,如图17-2所示。


网络异常,图片无法展示
|


基于以上设计方案,如果想快速部署一套独立的测试环境,一般需要解决哪些问题?因为容器测试环境复用了测试环境的一些组件,所以需要解决以下5个问题。


1.1 API服务间的隔离


如何确保容器环境的客户端请求能到达容器的API服务,而非仍然到达测试环境的API服务? 当时的系统是这么设计的:每一个API服务中都会带一个配置项channelID,然后客户端每次访问API时都需要加上一个channelID参数;网关层接收到这个请求后,会根据channelID将请求匹配到对应channelID的API服务中(当然URL也需要匹配),此时整个隔离过程就比较简单了。


先介绍一下具体的研发流程:每个项目都有一个JIRA Issue,而XXX123就是一个JIRA Issue ID,项目组会为每个项目单独创建一套容器测试环境,于是这个Issue ID自然而然地被当作了环境标识。

具体的调用请求处理过程如图17-3所示。


网络异常,图片无法展示
|


在图17-3中,网关层接收到所有请求后,会根据不同的channelID将请求分发到不同的API服务中。这样,API服务的隔离问题就解决了。


1.2 后台服务间的隔离


如何确保容器环境部署的服务只调用容器服务,而测试环境虚拟机的服务只调用虚拟机服务?

当时的系统是这样设计的:在打包RPC服务时,将一个环境变量env的值设置为容器测试环境的标识,也就是JIRA Issue ID,比如XXX123;然后每个RPC服务注册ZooKeeper时,将在Service的metadata中加一个tag参数,并设置tag的值为XXX123。之后,RPC服务只会调用同样tag的服务。

这是什么意思?比如测试环境中有3个UserService,其中,一个是测试环境的虚拟机,两个是容器测试环境部署的UserService。前者的tag为空,后两个容器UserService注册ZooKeeper后,它们的tag值分别为XXX123和XXX245。OrderService调用UserService时,如果OrderService也是XXX123这个容器环境的服务,则它只会调用带XXX123这个tag值的UserService;如果它是正常虚拟机的服务,则只会调用不带tag值的UserService。这样,后台RPC服务间的隔离问题就解决了


以上要点中并没有提及ZooKeeper,因为API和RPC服务的隔离问题解决后,ZooKeeper的数据隔离问题基本也解决了。其实,ZooKeeper在每套测试环境中起到的作用只是API服务和RPC服务的注册发现。


1.3 MQ和Redis隔离


如何确保容器环境和虚拟机之间的MQ消息不互串、Redis数据不互相影响? 项目组本来想使用类似tag的概念来解决这个问题,通过封装MQ与Redis的客户端代码让它们只消费同样env值的服务生产的内容。但是,还需要遵循以下原则:尽量减少容器测试环境与正式环境的代码差异。针对这个问题,项目组讨论了很久,最终认为没必要专门定制,只需保证走测试流程时使用不同的测试数据就可以了(不同的项目一般都会使用不同的测试数据,包括不同的用户、不同的订单等),这样基本不会再出现不同容器测试环境流转相同MQ消息、缓存数据的情况了。 当然,Redis中的一些通用数据还是会被共同使用,比如城市的基础数据。不过这些数据即使在不同容器测试环境之间互相串联也没关系。


1.4 配置中心数据的隔离


对于配置中心是这样设计的:如果容器测试环境的值与虚拟机测试环境的值不一样,不会修改配置中心的值,而是在容器环境的启动脚本中动态加上针对各自容器测试环境的环境变量,然后在业务代码中启动环境变量优先级高于配置中心的参数,这样就确保了容器测试环境的特殊配置,从而不影响配置中心的值。


1.5 数据库间的数据隔离


数据库互相影响的情况一般有两种。

1.测试数据互相影响

这一点其实和MQ、Redis的情况一样,只需要保证测试数据各自独立即可。

2.数据库结构兼容问题

比如同时进行两个项目,XXX123这个项目删除了user这张表的updateFlag字段,而XXX100这个项目还需要使用这个字段,此时如果两个项目共用一个数据库就会互相影响。其实,每次版本迭代时,都需要保证数据库可以兼容前一个版本的代码。比如刚刚那个例子,不能直接在XXX123中删掉updateFlag字段,而是等XXX100上线后再删掉。


关于数据库兼容前一个版本,再举一个例子。比如在XXX123这个项目中增加了一个字段updateUserID,且该字段的值为必填,否则数据就会报错;而XXX100这个项目并不会更新updateUserID,这样如果XXX123读到了XXX100写入的数据就会报错。这种情况该如何处理?此时可以在项目XXX123中增加一些代码让它可以容错,即允许updateUserID为空。也可以将项目XXX123与项目XXX100部署到不同测试环境的数据库中。


2 使用流程


使用流程是这样的,每次新建一个工程时(新的API或者后台服务)都会在Jenkins上配置一个Job,而这个Job需要接受以下3个参数。


1)Branch,即需要部署的代码分支。

2)测试环境test1/test2/test3(已经有3个测试环境,它决定了部署需要使用哪个测试环境的中间件)。

3)容器测试环境标识,也就是JIRA Issue ID。这个Job启动时,需要调用一个小工具,而这个小工具需要连接Kubernetes创建namespace(=JIRA Issue ID),然后在namespace中增加一个pod(pod中运行的是专门为JIRA Issue ID打包的代码)。


在做某个项目时,假设XXX123需要使用UserAPI、UserService、OrderService、ProductService,就会配置一个新的Jenkins Job来联动UserAPI、UserService、OrderService、ProductService的Job,并且将各个服务对应的Branch、测试环境和JIRA Issue ID传入Jenkins Job(这些值都通过硬编码配置在新的Jenkins Job中)。之后,每次点击这个项目的Jenkins Job时,就可以对其容器测试环境进行部署了。


当然,如果项目成员想自己部署一套环境,此时只需单独配置一个新的Jenkins Job,并找一个不一样的(比如开发任务的Issue ID)容器测试环境标识即可。


网络异常,图片无法展示
|


相关文章
|
1月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
45 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
1月前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
51 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
24天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
36 2
|
25天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
1月前
|
测试技术 开发者
vertx的学习总结6之动态代理类和测试
本文是Vert.x学习系列的第六部分,介绍了如何使用动态代理在事件总线上公开服务,以及如何进行Vert.x组件的异步测试,包括动态代理的创建和使用,以及JUnit 5和Vert.x测试工具的结合使用。
24 3
vertx的学习总结6之动态代理类和测试
|
1月前
|
测试技术
软件质量保护与测试(第2版)学习总结第十三章 集成测试
本文是《软件质量保护与测试》(第2版)第十三章的学习总结,介绍了集成测试的概念、主要任务、测试层次与原则,以及集成测试的不同策略,包括非渐增式集成和渐增式集成(自顶向下和自底向上),并通过图示详细解释了集成测试的过程。
61 1
软件质量保护与测试(第2版)学习总结第十三章 集成测试
|
1月前
|
测试技术
软件质量保护与测试(第2版)学习总结第十章 黑盒测试
本文是《软件质量保护与测试》(第2版)第十章的学习总结,介绍了黑盒测试的基本概念和方法,包括等价类划分、边界值分析和因果图法,并通过具体例子展示了如何设计测试用例来验证软件的功能性需求。
66 1
软件质量保护与测试(第2版)学习总结第十章 黑盒测试
|
1月前
|
人工智能 人机交互 数据库
软件质量保护与测试(第2版)学习总结第一章
本文是《软件质量保护与测试》(第2版)第一章的学习总结,概述了软件的特征、分类、软件工程的层次化技术、现代软件开发的变化,以及软件质量的概念和评价体系,包括黑盒、白盒和灰盒测试方法。
33 1
软件质量保护与测试(第2版)学习总结第一章
|
1月前
|
分布式计算 Hadoop 大数据
大数据体系知识学习(一):PySpark和Hadoop环境的搭建与测试
这篇文章是关于大数据体系知识学习的,主要介绍了Apache Spark的基本概念、特点、组件,以及如何安装配置Java、PySpark和Hadoop环境。文章还提供了详细的安装步骤和测试代码,帮助读者搭建和测试大数据环境。
61 1
|
1月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
64 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
下一篇
无影云桌面