如何搭建一个支持多版本服务并存的测试环境?
- 内容介绍
- 文章标签
- 相关推荐
如何搭建一个支持多版本服务并存的测试环境那个?
在项目开发过程中, 经常会出现多个迭代并行开发测试的场景,所以呢需要后台的存储资源共享但后台服务并存多个版本多个测试环境,以方便进行多迭代版本的并行开发测试。
真香! 那如何实现这一目标呢?下面我们将详细介绍如何搭建一个支持多版本服务并存的测试环境。

需求分析
先说说 我们需要明确需求:系统要在测试域名不变的前提下在页面提供一个浮层去切换不同的测试环境,方便测试同学进行不同需求的并行测试,挽救一下。。
为了实现这一目标, 我们需要解决以下几个问题:
- 多版本服务的并行运行
- 请求如何转发
- 配置文件处理
- 定时任务抢占问题的解决
解决方案
经过讨论,我们决定使用对请求的header 功力不足。 中特定的字段值来确定请求如何被转发的方案。
比如我们将使用nginx ingress来实现请求的转发。下面是一个简单的示例:
location ~ //.+ {
set $target_service "backend";
if {
set $target_service "backend-test";
proxy_pass http://$target_-:8000;
}
proxy_pass http://$target_-:8000;
}
但是这种方法存在一些问题。先说说nginx中的if规则非常特殊,和编程语言直觉中的if规则很不一样,可能会导致意想不到的后果,最终的最终。。
| Ingress Controller | 复杂路由规则支持 | 动态路由支持 |
|---|---|---|
| Nginx Ingress | 有限支持 | 不支持 |
| Traefik | 支持 | 支持 |
| Istio | 支持 | 支持 |
试着... 为了解决这些问题, 我们可以使用一个更高级的Ingress Controller,比方说Traefik或者Istio。这些Ingress Controller支持更复杂的路由规则,包括基于请求的属性来动态路由到不同的服务。
配置文件处理
虽然需要搭建多测试环境,但大部分时间也只有一套环境经常用于测试。所以我们多测试环境使用了同一套配置文件, 这样不仅 环境更加方便,而且当并行开发需要修改配置文件时不需要额外去拉平配置文件版本,改进一下。。
但是 这样做的话,假如配置文件的定时任务是打开的,就会造成定时任务被多环境抢占的问题。为了解决这个问题,我们可以在部署时通过脚本自动更改某一环境的定时任务开关,图啥呢?。
# IsEnableCron: false # 是否启用定时任务
# 根据server name来确定是否替换定时任务开关
if ; n
echo -e "replace IsEnableCron"
sed -i 's/IsEnableCron: *true/IsEnableCron: false/g' \
${WORKSPACE}/${appResourceName}/configmap/${grayRegionEnvList}/config/files/*.yaml
fi
定时任务抢占问题的解决
离了大谱。 为了避免定时任务被多环境抢占的问题,我们可以考虑环境加版本号的控制方法来处理定时任务抢占问题。
戳到痛处了。 不同环境共用一套配置文件, 流水线在部署时脚本自动更改某一环境的定时任务开关。
Nginx Ingress配置示例
annotations:
/nginx.org/proxy-body-size: 100m
/nginx.org/proxy-read-timeout: "600"
/nginx.org/proxy-send-timeout: "600"
/nginx.org/server-snippet: |
location ~ /xxhub/api {
if {
add_header Ch-Env dev-a always;
proxy_pass http://backend-:8000;
}
add_header Ch-Env test always;
client_max_body_size 100M;
proxy_read_timeout 150;
proxy_send_timeout 150;
rewrite "/xxhub/api" /api/$2 break;
proxy_pass http://:8000;
}
/use-regex: "true"
Nginx Map 配置示例:
map $http_ch_env $target_dev_service {
default backend;
dev-a backend-test;
}
map $http_ch_env $target_dev_header {
default dev;
dev-a dev-a;
}
尽管k8s的ingress对nginx服务的定制化转发规则支持得并不太好, 但它的server-snippet 可以支持配置自定义的转发规则,这些规则会填充到nginx配置文件的server块中。通过if和proxy_pass完成服务的转发,啥玩意儿?。
是吧? 但如果不采用server-snippet 的方式进行配置, 而是使用annotations的方式进行配置,则会出现其他的问题。比方说在ingress中设置了全局的一些proxy配置, 比方说proxy-body-size proxy-read-timeout ,以及rewrite 等。但这些全局配置在server-snippet 中的location块中不会生效,需要重新设置一遍。
大致估算了一下后续可能会有如下的一些工作:
- 多个后台服务的时候前端header参数带多个值, 后台根据值的不同,将请求打到不同的后台服务上。
- 后续可能要实现前端直接切换不同的后台服务的功能。
第一点是可行的,主要原因是可以通过修改nginx ingress中的map配置来实现将不同的header参数值映射到不同的后台服务上。第二点也是可行的,可以通过修改前端代码来实现直接切换不同的后台服务的功能。
客观地说... 通过使用nginx ingress和map配置,我们可以实现多版本服务的并行运行和请求的动态转发。一边,通过修改前端代码和配置文件,我们可以实现前端直接切换不同的后台服务的功能。未来我们将继续优化和改进我们的解决方案,以满足不断变化的需求。
如何搭建一个支持多版本服务并存的测试环境那个?
在项目开发过程中, 经常会出现多个迭代并行开发测试的场景,所以呢需要后台的存储资源共享但后台服务并存多个版本多个测试环境,以方便进行多迭代版本的并行开发测试。
真香! 那如何实现这一目标呢?下面我们将详细介绍如何搭建一个支持多版本服务并存的测试环境。

需求分析
先说说 我们需要明确需求:系统要在测试域名不变的前提下在页面提供一个浮层去切换不同的测试环境,方便测试同学进行不同需求的并行测试,挽救一下。。
为了实现这一目标, 我们需要解决以下几个问题:
- 多版本服务的并行运行
- 请求如何转发
- 配置文件处理
- 定时任务抢占问题的解决
解决方案
经过讨论,我们决定使用对请求的header 功力不足。 中特定的字段值来确定请求如何被转发的方案。
比如我们将使用nginx ingress来实现请求的转发。下面是一个简单的示例:
location ~ //.+ {
set $target_service "backend";
if {
set $target_service "backend-test";
proxy_pass http://$target_-:8000;
}
proxy_pass http://$target_-:8000;
}
但是这种方法存在一些问题。先说说nginx中的if规则非常特殊,和编程语言直觉中的if规则很不一样,可能会导致意想不到的后果,最终的最终。。
| Ingress Controller | 复杂路由规则支持 | 动态路由支持 |
|---|---|---|
| Nginx Ingress | 有限支持 | 不支持 |
| Traefik | 支持 | 支持 |
| Istio | 支持 | 支持 |
试着... 为了解决这些问题, 我们可以使用一个更高级的Ingress Controller,比方说Traefik或者Istio。这些Ingress Controller支持更复杂的路由规则,包括基于请求的属性来动态路由到不同的服务。
配置文件处理
虽然需要搭建多测试环境,但大部分时间也只有一套环境经常用于测试。所以我们多测试环境使用了同一套配置文件, 这样不仅 环境更加方便,而且当并行开发需要修改配置文件时不需要额外去拉平配置文件版本,改进一下。。
但是 这样做的话,假如配置文件的定时任务是打开的,就会造成定时任务被多环境抢占的问题。为了解决这个问题,我们可以在部署时通过脚本自动更改某一环境的定时任务开关,图啥呢?。
# IsEnableCron: false # 是否启用定时任务
# 根据server name来确定是否替换定时任务开关
if ; n
echo -e "replace IsEnableCron"
sed -i 's/IsEnableCron: *true/IsEnableCron: false/g' \
${WORKSPACE}/${appResourceName}/configmap/${grayRegionEnvList}/config/files/*.yaml
fi
定时任务抢占问题的解决
离了大谱。 为了避免定时任务被多环境抢占的问题,我们可以考虑环境加版本号的控制方法来处理定时任务抢占问题。
戳到痛处了。 不同环境共用一套配置文件, 流水线在部署时脚本自动更改某一环境的定时任务开关。
Nginx Ingress配置示例
annotations:
/nginx.org/proxy-body-size: 100m
/nginx.org/proxy-read-timeout: "600"
/nginx.org/proxy-send-timeout: "600"
/nginx.org/server-snippet: |
location ~ /xxhub/api {
if {
add_header Ch-Env dev-a always;
proxy_pass http://backend-:8000;
}
add_header Ch-Env test always;
client_max_body_size 100M;
proxy_read_timeout 150;
proxy_send_timeout 150;
rewrite "/xxhub/api" /api/$2 break;
proxy_pass http://:8000;
}
/use-regex: "true"
Nginx Map 配置示例:
map $http_ch_env $target_dev_service {
default backend;
dev-a backend-test;
}
map $http_ch_env $target_dev_header {
default dev;
dev-a dev-a;
}
尽管k8s的ingress对nginx服务的定制化转发规则支持得并不太好, 但它的server-snippet 可以支持配置自定义的转发规则,这些规则会填充到nginx配置文件的server块中。通过if和proxy_pass完成服务的转发,啥玩意儿?。
是吧? 但如果不采用server-snippet 的方式进行配置, 而是使用annotations的方式进行配置,则会出现其他的问题。比方说在ingress中设置了全局的一些proxy配置, 比方说proxy-body-size proxy-read-timeout ,以及rewrite 等。但这些全局配置在server-snippet 中的location块中不会生效,需要重新设置一遍。
大致估算了一下后续可能会有如下的一些工作:
- 多个后台服务的时候前端header参数带多个值, 后台根据值的不同,将请求打到不同的后台服务上。
- 后续可能要实现前端直接切换不同的后台服务的功能。
第一点是可行的,主要原因是可以通过修改nginx ingress中的map配置来实现将不同的header参数值映射到不同的后台服务上。第二点也是可行的,可以通过修改前端代码来实现直接切换不同的后台服务的功能。
客观地说... 通过使用nginx ingress和map配置,我们可以实现多版本服务的并行运行和请求的动态转发。一边,通过修改前端代码和配置文件,我们可以实现前端直接切换不同的后台服务的功能。未来我们将继续优化和改进我们的解决方案,以满足不断变化的需求。

