学校网站建设需求分析调研表,石家庄网络公司查封,承德企业网站建设公司,蜀icp备 网站建设中企动力成都背景介绍
在现代互联网应用开发中#xff0c;灰度发布#xff08;又称金丝雀发布#xff09;是一种非常重要的部署策略。它允许我们将新版本服务逐步推送给部分用户#xff0c;而不是一次性全量发布#xff0c;从而降低风险并快速获得用户反馈。本文将分享一个实际的灰度…背景介绍
在现代互联网应用开发中灰度发布又称金丝雀发布是一种非常重要的部署策略。它允许我们将新版本服务逐步推送给部分用户而不是一次性全量发布从而降低风险并快速获得用户反馈。本文将分享一个实际的灰度环境部署案例涉及两个服务fbdm和grayfbdm共享同一数据库但运行不同代码的场景。 **目前场景**用于线上功能和需求验证防止全量上线验证出问题减少回滚的概率。
某业务系统中存在两个核心后端服务
fbdm正式服务面向所有用户grayfbdm灰度服务仅对测试或特定用户开放。
两者数据库一致配置相同仅代码版本不同。灰度发布前必须先完成数据库字段变更以保证向前兼容。
前端页面通过不同的访问地址与 Header 标签来区分灰度与正式流量。
访问角色访问域名Header 特征Nginx 路由目标测试用户gray.example.comappenvgraygrayfbdm正式用户prod.example.com无灰度标签fbdm
灰度环境请求需满足下列任一条件即可命中 grayfbdm
请求 Header 包含 appenvgrayURL 参数中包含 appEnvgray 或灰度域名作为 returnUrlOrigin 为灰度域名。
系统架构概述
基本系统包含以下关键组件
两个后端服务 fbdm生产环境服务grayfbdm灰度环境服务 共享数据库两个服务使用相同的数据库实例前端H5应用能够通过header标识请求来源Nginx反向代理负责根据规则将请求路由到不同的后端服务
核心设计原理
1. 数据库共享策略
由于两个服务使用相同的数据库在灰度发布过程中需要特别注意
数据库变更先行任何涉及数据库结构的变更必须先于服务部署执行代码兼容性新版本代码必须能够兼容旧版本的数据结构数据一致性确保灰度环境和生产环境不会因为数据操作相互干扰
2. 流量分流机制
Nginx作为流量入口根据多种条件将请求路由到不同的后端 # 上游服务定义
upstream fbdm {server 10.0.0.1:8081 fail_timeout5 max_fails2;server 10.0.0.2:8081 fail_timeout5 max_fails2;keepalive 2000;
}upstream grayfbdm {server 10.0.1.1:8081 fail_timeout5 max_fails2;keepalive 2000;
}
3. 路由判断条件
Nginx通过以下条件判断是否将请求路由到灰度环境
HTTP Header检查appenvgrayURL参数检查returnUrl或appEnv参数Origin Header检查请求来源是否为灰度域名
set $target http://fbdm;
if ($http_appEnv gray ) {set $target http://grayfbdm;
}
if ($arg_returnUrl ~* ^https?%3A%2F%2Fmfbdgray\.xxxxx\.com ) {set $target http://grayfbdm;
}
if ($arg_appEnv ~* ^gray ) {set $target http://grayfbdm;
}
if ($http_origin ~* https?://mfbdgray\.xxxxx\.com ) {set $target http://grayfbdm;
}4.完整Nginx配置
# 定义 upstream正式服务 灰度服务
upstream fbdm {server 10.0.0.1:8081 fail_timeout5 max_fails2;server 10.0.0.2:8081 fail_timeout5 max_fails2;keepalive 2000;
}
upstream grayfbdm {server 10.0.1.1:8081 fail_timeout5 max_fails2;keepalive 2000;
}# 80 端口跳转到 HTTPS
server {listen 80;server_name prod.example.com;location / {rewrite ^/(.*)$ https://$host/$1 permanent;}
}# 443 HTTPS 端口配置灰度智能路由
server {listen 443 ssl;server_name prod.example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;include ssl.conf;location / {set $target http://fbdm;# 灰度判断逻辑if ($http_appEnv gray) {set $target http://grayfbdm;}if ($arg_returnUrl ~* ^https?%3A%2F%2Fgray\.example\.com) {set $target http://grayfbdm;}if ($arg_appEnv ~* ^gray) {set $target http://grayfbdm;}if ($http_origin ~* https?://gray\.example\.com) {set $target http://grayfbdm;}proxy_pass $target;include https_proxy.conf;proxy_next_upstream error timeout invalid_header http_403 http_404 http_500 http_502 http_503 http_504;# 黑名单控制引用外部白名单/黑名单配置include /opt/nginx/conf/whitelist/login.conf;}# 登录、发送验证码等接口灰度策略保持一致location ~* ^(/api/auth/sendCode|/api/user/login|/api/user/checkMobile)$ {set $target http://fbdm;if ($http_appEnv gray) {set $target http://grayfbdm;}if ($arg_returnUrl ~* ^https?%3A%2F%2Fgray\.example\.com) {set $target http://grayfbdm;}if ($arg_appEnv ~* ^gray) {set $target http://grayfbdm;}if ($http_origin ~* https?://gray\.example\.com) {set $target http://grayfbdm;}proxy_pass $target;include https_proxy.conf;proxy_next_upstream error timeout invalid_header http_403 http_404 http_500 http_502 http_503 http_504;# 黑名单控制include /opt/nginx/conf/whitelist/mesg.conf;include /opt/nginx/conf/whitelist/login.conf;allow all;}
}
灵活灰度判断通过 Header、Query 参数与 Origin 三层判断方式确保请求正确识别接口隔离保护关键接口如登录与验证码单独配置防止因路由失误导致异常白名单机制通过 include 引用外部配置统一黑白名单管理自动 HTTPS 跳转防止未加密请求造成信息泄露。
成功案例
在一次重大架构升级中灰度发布机制帮助我们
提前发现代码的bug测试人员多轮验证未影响正常用户可以任何时间段发版让测试人员测试提升工作效率和速度
后续实践
版本兼容性确保灰度版本代码能够回滚避免因数据库变更导致生产环境不可用监控与日志为灰度环境设置独立的监控和日志收集便于问题排查流量比例控制可以通过Nginx配置实现按比例的灰度发布自动化测试灰度环境应配备完整的自动化测试套件用户标识策略除了测试人员可以考虑基于用户ID、设备ID等进行灰度分流