使用Nginx实现灰度发布的使用

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

灰度发布常见一般有三种方式:

  • Nginx+LUA方式
  • 根据Cookie实现灰度发布
  • 根据来路IP实现灰度发布

本文主要将讲解根据Cookie和来路IP这两种方式实现简单的灰度发布,Nginx+LUA这种方式涉及内容太多就不再本文展开了。

A/B测试流程

Nginx根据Cookie实现灰度发布

根据Cookie查询Cookie键为version的值,如果该Cookie值为V1则转发到hilinux_01,为V2则转发到hilinux_02。Cookie值都不匹配的情况下默认走hilinux_01所对应的服务器。

两台服务器分别定义为:

  • hilinux_01  192.168.1.100:8080
  • hilinux_02  192.168.1.200:8080

用if指令实现

upstream hilinux_01 {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
  server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

server {
 listen 80;
 server_name www.hi-linux.com;
 access_log logs/www.hi-linux.com.log main;

 #match cookie
 set $group "default";
  if ($http_cookie ~* "version=V1"){
    set $group hilinux_01;
  }

  if ($http_cookie ~* "version=V2"){
    set $group hilinux_02;
  }

 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;
 }
 }

用map指令实现

在Nginx里面配置一个映射,$COOKIE_version可以解析出Cookie里面的version字段。$group是一个变量,{}里面是映射规则。

如果一个version为V1的用户来访问,$group就等于hilinux_01。在server里面使用就会代理到http://hilinux_01上。version为V2的用户来访问,$group就等于hilinux_02。在server里面使用就会代理到http://hilinux_02上。Cookie值都不匹配的情况下默认走hilinux_01所对应的服务器。

upstream hilinux_01 {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
  server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

map $COOKIE_version $group {
~*V1$ hilinux_01;
~*V2$ hilinux_02;
default default;
}

server {
 listen 80;
 server_name www.hi-linux.com;
 access_log logs/www.hi-linux.com.log main;

 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;
 }
 }

Nginx根据来路IP实现灰度发布

如果是内部IP,则反向代理到hilinux_02(预发布环境);如果不是则反向代理到hilinux_01(生产环境)。

upstream hilinux_01 {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

upstream hilinux_02 {
  server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}

upstream default {
  server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}

server {
 listen 80;
 server_name www.hi-linux.com;
 access_log logs/www.hi-linux.com.log main;

 set $group default;
 if ($remote_addr ~ "211.118.119.11") {
   set $group hilinux_02;
 }

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;
 }
}

如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的。

server {
 listen 80;
 server_name www.hi-linux.com;
 access_log logs/www.hi-linux.com.log main;

 set $rootdir "/var/www/html";
  if ($remote_addr ~ "211.118.119.11") {
    set $rootdir "/var/www/test";
  }

  location / {
   root $rootdir;
  }
}

到此最基本的实现灰度发布方法就讲解完了,如果要做更细粒度灰度发布可参考ABTestingGateway项目。

ABTestingGateway是新浪开源的一个动态路由系统。ABTestingGateway是一个可以动态设置分流策略的灰度发布系统,工作在7层,基于nginx和ngx-lua开发,使用redis作为分流策略数据库,可以实现动态调度功能。

ABTestingGateway:https://github.com/CNSRE/ABTestingGateway

参考文档
http://www.google.com
http://www.jianshu.com/p/88f206f48278
http://blog.chinaunix.net/uid-531464-id-4140473.html

到此这篇关于使用Nginx实现灰度发布的使用的文章就介绍到这了,更多相关Nginx 灰度发布内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Nginx与Lua灰度发布的实现

    安装 memcached yum install -y memcached #启动memcached服务,端口11211,以nobody身份启动,-d后台模式运行 memcached -p11211 -u nobody -d #将自己的IP设为灰度测试的IP telnet 127.0.0.1 11211 set 119.32.216.122 0 0 1 1 quit 安装 memcached for lua wget https://github.com/openresty/lua-resty-

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

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

  • 使用Nginx实现灰度发布的使用

    灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来. 灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现.调整问题,以保证其影响度. 灰度发布常见一般有三种方式: Nginx+LUA方式 根据Cookie实现灰度发布 根据来路IP实现灰度发布 本文主要将讲解根据Cookie和来路IP这两种方式实现简单的灰度发布,Nginx+LUA这种

  • Spring Cloud 优雅下线以及灰度发布实现

    前言 在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题.如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的.那什么是优雅的呢?主要就是指在服务升级的时候,不中断整个服务,让用户无感知,进而不会影响用户的体验,这就是优雅的. 实际上,优雅下线是目标,而不是手段,它是一个相对的概念,例如kill PID和kill -9 PID都是暴力杀死服务,相对于kill -9 PID来说,kill PID就是优雅的.但如果单独拿kill PID出来说,我们

  • springboot 实现接口灰度发布的实例详解

    目录 前言 最小化改造方式 springmvc接口请求原理 HandlerMapping简介 RequestCondition接口定义 代码实现过程 1.添加一个自定义注解用于标注接口类以及接口方法 2.自定义HandleMapping 3.自定义封装RequestCondition 4.注册自定义的ApiVersionHandleMapping 5.接口测试 前言 对灰度发布有所了解的同学应该知道,灰度发布的目的之一,就是能够根据业务规则的调整,交互上呈现不同的形式,举例来说,当前有2个版本,

  • SpringCloud实现灰度发布的方法步骤

    目录 1.什么是灰度发布? 2.灰度发布有什么作用? 3.灰度发布的实现方式:网关到服务,服务到服务 3.1网关到服务代码实现 3.2网关到服务代码实现 1.什么是灰度发布? 灰度发布又称金丝雀发布,是在系统升级的时候能够平滑过渡的一种发布方式.在其上可以进行A/B测试,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来.灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现.调整问题,以保证其影响度. 关于

  • 浅谈Vue灰度发布新功能的使用

    目录 概述 组件级别 页面级别 方案一 新增入口页面分发 方案二 高阶组件方案 方案三 动态Router.js引入 总结 参考 什么是灰度发布?百度百科的解释如下. 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式.AB test就是一种灰度发布方式,让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来.灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现.调整问题,以保证其影响度. 从上可以看出,灰度发布的主要作用有以下

  • 使用nginx模拟进行金丝雀发布的方式

    这篇文章介绍一下蓝绿部署以及使用nginx如何最简单地模拟一下金丝雀发布的方式 金丝雀发布/灰度发布 金丝雀发布的重点在于:试错.金丝雀发布的来历本身就是自然界的美丽生物在人类工业发展过程中的一个悲惨的故事.金丝雀就是用它的生命来为矿工的安全来试错的.用很小的成本来换取整体的安全,在持续部署的实践中,金丝雀就是流量控制,用很少的流量比如百分之一或者十分之一用于检证某个版本是否正常,如果不正常则就用最低的成本实现了其作用,降低了风险.如果正常,则可以逐渐加大权重直至百分之百,将所有的流量都平稳地切

  • SpringCloudGateway Nacos GitlabRunner全自动灰度服务搭建发布

    目录 1 | 业务场景说明 2 | 具体实现方案 2.1 | SCG 2.2 | Nacos 2.3 | GitlabRunner 3 | 后续 TODO 4 | 使用版本说明 1 | 业务场景说明 要实现的业务场景: 可以根据单个用户id或者批量用户id,判断是否需要灰度该用户/批量用户 可以根据请求头字段(可动态设定的任意kv),判断是否需要走灰度服务 2 | 具体实现方案 这里采用 SpringCloudGateway(SCG) + Nacos + GitlabRunner 来实现整个自动

  • Nginx如何封禁IP和IP段的实现

    写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[Nginx专题]进行查阅.今天,我们来介绍Nginx另一个强大的功能:禁用IP和IP段. 禁用IP和IP段 Nginx的ngx_http_access_module 模块可以封配置内的ip或者ip段,语法如下: deny IP; deny subnet; allow IP; allow subnet

随机推荐