Nginx 实现灰度发布的三种方法总结

      互联网灰度发布是目前互联网产品在推广时采用最多的方式,因为向用户推荐产品并不是短时间内能够完成的。新产品由于其本身在开发技术上存在一定缺陷,所以可以逐步放宽用户群范围,并根据用户的反馈对产品存在的缺陷进行改进。在发布的过程中经常出现如下问题:
问题一、选择的推广用户不具备代表性
灰度发布首选的用户群一定要具有代表性,设计出的产品才能被大部分人接受。如果刚开始发布产品时,选择的推广人群方向就有偏差,则很难修改出适合大众的产品。

这个问题其实很好解决,可以对样本的种类进行多样化的选择,只需控制好每类样本的数量即可达到预期的目标。
问题二、过于依赖自己的开发知识
这个问题是互联网灰度发布中最常见的,开发员往往储备了大量的专业知识,所以会认为自己的想法也是用户的想法。他们会认为自己设计出的产品用户一定能够理解,并精通产品本身的使用功能。

这是因为开发员对自己设计的产品过于熟悉,而出现的误区。这种设计理念如果不及时改进,会影响日后一系列的产品测试。经常对用户体验进行调查,根据用户的想法合理修改系统,才能满足大部分用户的需求。

互联网灰度发布在前期策划时,还需要考虑到新旧系统的兼容性以及用户体验的一致性,避免日后在产品更新迭代时出现难以解决的问题。

Nginx 实现灰度发布的三种方法总结
灰度发布的主要原理是访问路由的控制,重点是保证每次访问的是同一个节点。
方式一:通过调节负载均衡权重
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

简单配置如下:

http { 
  upstream cluster { 
    ip_hash; #如果你的系统中没有使用第三方缓存管理工具 ,建议使用此方式
    server 192.168.1.210:80 weight=5; 
    server 192.168.1.211:80 weight=3; 
    server 192.168.1.212:80 weight=1; 
  } 

  server { 
    listen 80; 

  location / { 

  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://cluster; 
    } 
  } 
} 

这种方式灰度发布通过weight来实现,但是这种方式只适合修改节点的行为,而且要求应用都是一模一样的,其实质作用是,节点增加或删除之后,对负载能力的调节,最终目的是为了让流量最终保持均衡。


方式二.使用nginx+lua实现web项目的灰度发布

location / {
 content_by_lua '
      myIP = ngx.req.get_headers()["X-Real-IP"]
      if myIP == nil then
        myIP = ngx.req.get_headers()["x_forwarded_for"]
      end
      if myIP == nil then
        myIP = ngx.var.remote_addr
      end
      if myIP == "公司出口IP" then
        ngx.exec("@client")
      else
        ngx.exec("@client_test")
      end
    ';
} 

location @client{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client;

}
location @client_test{
  proxy_next_upstream   error timeout;
  proxy_redirect     off;
  proxy_set_header    Host $host;
  #proxy_set_header    X-Real-IP $remote_addr;
  proxy_set_header    X-Real-IP $http_x_forwarded_for;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  client_max_body_size  100m;
  client_body_buffer_size 256k;
  proxy_connect_timeout  180;
  proxy_send_timeout   180;
  proxy_read_timeout   180;
  proxy_buffer_size    8k;
  proxy_buffers      8 64k;
  proxy_busy_buffers_size 128k;
  proxy_temp_file_write_size 128k;
  proxy_pass http://client_test;
} 

由于使用了nginx+lua模块,这种方式适合很多场景,非常强大,但是问题是你可能需要学习很多lua的语法。


方式三.使用http头信息判断+权重(灰度值)


http请求传输过程中,会自动带上User-Agent,Host,Referer,Cookie等信息。我们只需要判断ip地址段,用户代理,Cookie中的信息等。我们这里以Cookie为例。
当然,这里需要解决两个问题:
①首次访问静态页面可能不会产生cookie
②我们需要通过代码动态设置路由
③通过weight控制灰度值
我们可以通过一个例子来解决上述中的②与③的问题

upstream tts_V6 {
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60;
}
upstream tts_V7 {
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60;
}
upstream default {  #通过upstream default + weight节点控制权重
    server 192.168.3.81:5280 max_fails=1 fail_timeout=60 weight=5;
    server 192.168.3.81:5380 max_fails=1 fail_timeout=60 weight=1;
}
server {
    listen 80;
    server_name test.taotaosou.com;
    access_log logs/test.taotaosou.com.log main buffer=32k;
    #match cookie
    set $group "default";
    if ($http_cookie ~* "tts_version_id=tts1"){ #动态控制路由
        set $group tts_V6;
    }
    if ($http_cookie ~* "tts_version_id=tts2"){
        set $group tts_V7;
    }
    location / {            
        proxy_pass http://$group;
        proxy_set_header  Host       $host;
        proxy_set_header  X-Real-IP    $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        index index.html index.htm;
    }
 }

对于问题①,我们可以在index页面通过script来访问动态页面:

<?php

if(!session_id())
{
 session_start();
}
if(!isset($_COOKIE["tts_version_id"]))
{
 $cookieValue = $_SERVER['SERVER_PORT']==5280?"tts1":"tts2";
 setcookie("tts_version_id", $cookieValue, time()+3600, "/");
}
?>

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前后端分离项目实现灰度发布的主要思路将前端和后端的发布过程分离,并通过一些技术手段实现部分用户的灰度发布。下面是一种常见的实现方式: 1. 前端部分: - 前端代码可以通过版本控制工具(如Git)进行管理,每个功能或者模块对应一个分支或者一个特定的版本。 - 在灰度发布过程中,可以通过配置文件或者数据库来控制不同用户的访问权重,例如将10%的用户指向新版本,90%的用户指向旧版本。 - 可以使用一些前端框架(如Vue、React等)提供的路由功能,根据用户的访问路径来决定使用新版本还是旧版本。 2. 后端部分: - 后端代码也可以通过版本控制工具进行管理,每个功能或者模块对应一个分支或者一个特定的版本。 - 在灰度发布过程中,可以通过配置文件或者数据库来控制不同用户的访问权重,例如将10%的请求指向新版本,90%的请求指向旧版本。 - 可以使用一些反向代理工具(如Nginx)来实现请求的转发和负载均衡,根据用户的请求路径或者其他标识来决定使用新版本还是旧版本。 3. 监控和回滚: - 在灰度发布过程中,需要对用户的访问情况进行监控和统计,可以使用一些监控工具(如ELK、Prometheus等)来实现。 - 如果发现新版本存在问题或者性能不佳,可以及时回滚到旧版本,保证系统的稳定性和可用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值