时间:2021-05-19
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来访问动态页面:
如
<script src="https://test.taotaosou.com/cookieinfo.php" /><script>此外,我们还要在cookieinfo.php中判断和生成cookie
<?phpif(!session_id()){ session_start();}if(!isset($_COOKIE["tts_version_id"])){ $cookieValue = $_SERVER['SERVER_PORT']==5280?"tts1":"tts2"; setcookie("tts_version_id", $cookieValue, time()+3600, "/");}?>感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Servlet实现文件上传的三种方法总结1.通过getInputStream()取得上传文件。/***Tochangethistemplate,chooseTo
java实现多线程的三种方法在java中,有三种方法可以实现多线程。第一种方法:继承Thread类,重写run函数。第二种方法:实现Runnable接口,重写r
读取Java文件到byte数组的三种方法(总结)packagezs;importjava.io.BufferedInputStream;importjava.i
python记录程序运行时间的三种方法这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下:方法1importdateti
本文实例总结了php实现四舍五入的方法。分享给大家供大家参考。具体分析如下:php实现四舍五入的三种方法,分别通过number_format函数、round函数