文档章节

Nginx 实现灰度发布的三种方式

IamOkay
 IamOkay
发布于 2017/05/20 18:25
字数 860
阅读 1951
收藏 80

灰度发布的主要原理是访问路由的控制,重点是保证每次访问的是同一个节点。

 

方式一:通过调节负载均衡权重

        负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
        负载均衡,英文名称为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来访问动态页面:

<script src="https://test.taotaosou.com/cookieinfo.php" /><script>

此外,我们还要在cookieinfo.php中判断和生成cookie

<?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, "/");
}
?>

 

© 著作权归作者所有

IamOkay

IamOkay

粉丝 198
博文 483
码字总数 403013
作品 0
海淀
程序员
私信 提问
Nginx 灰度发布(基于cookies)

背景介绍 灰度发布,主要任务是从产品用户群中按照一定策略选取部分用户,让他们先行体验新功能或版本。 灰度作用 及早获得用户的意见反馈,完善产品功能,提升产品质量 让用户参与产品测试,...

顶风走千里
2018/07/03
0
0
使用nginx实现的灰度发布思路研究(待实践)

灰度发布也叫 A/B 测试,原理是一套系统在实现了负载均衡,全国节点都部署了系统之后,可以在新功能上线后,让一小部分用户先使用,从中收集使用信息来做对比和发现bug,及时调整,最终分发到...

easonjim
2017/02/26
0
0
基于cookie在nginx实现业务灰度发布

基于cookie在nginx实现业务灰度发布 背景 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。 灰度发布可以保证整体系统的稳定, 在初始灰度的时候就可以发现、调整问题,以保证其影响...

双鱼座小龙
2017/05/14
0
0
动态分流系统--ABTestingGateway

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

叶秀兰
2015/08/18
16.9K
18
通过阿里云容器服务K8S Ingress Controller实现应用服务的灰度发布

简介 日常工作中我们经常需要对服务进行版本更新升级,为此我们经常使用到的发布方式有滚动升级、分批暂停发布、蓝绿发布以及灰度发布,今天主要跟大家分享下在阿里云容器服务Kubernetes集群...

chenqz
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

通过微服务来正确实施SOA

对于组织来说,能够构建、发展和扩展大型应用程序是至关重要的, 但所涉及的挑战使其成为一项艰巨的任务。正因为如此, 微服务凭借能够将单个组件拆分成围绕特定业务功能的独立服务,已成为构建...

Linux就该这么学
17分钟前
2
0
从 Spark 到 Kubernetes — MaxCompute 的云原生开源生态实践之路

2019年5月14日,喜提浙江省科学技术进步一等奖的 MaxCompute 是阿里巴巴自研的 EB 级大数据计算平台。该平台依托阿里云飞天基础架构,是阿里巴巴在10年前做飞天系统的三大件之分布式计算部分...

阿里云官方博客
20分钟前
1
0
使用python来操作redis用法详解

1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的red...

dragon_tech
20分钟前
2
0
给研发工程师的代码质量利器 | SOFAChannel#5 直播整理

> SOFA:Channel,有趣实用的分布式架构频道。 > > 本文根据 SOFAChannel#5 直播分享整理,主题:给研发工程师的代码质量利器 —— 自动化测试框架 SOFAActs。 > > 回顾视频以及 PPT 查看地址...

SOFAStack
22分钟前
1
0
段错误总结

https://blog.csdn.net/e_road_by_u/article/details/61415732 一、段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问...

悲催的古灵武士
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部