Openresty(二十一)ngx.balance和balance_by_lua灰度发布

2023-09-16 14:17:54

一  openresty实现灰度发布

①  灰度发布

说明: '早期'博客对'灰度'发布的'概念'进行解读,并且对'原生 nginx'灰度实现进行讲解

后续: 主要拿'节点引流'的灰度发布,并且关注'gray灰度策略'

相关借鉴

②  回顾HTTP反向代理流程

ngx_http_upstream

可'操作'点:根据'负载均衡策略'选择上游的服务器

  wrr               hash               least_conn              反向代理和负载均衡原理

③  指令

balance: '均衡'

说明: 只有下面'两个'指令,而不是'三个',没有'balancer_by_lua'指令

掌握: upstream {}、'balancer_by_lua_file'、'balancer_by_lua_block'

upstream

强调: upstream模块中'server配置的地址'不能用变量,只能为'ip'

balancer_by_lua_block

1、负载均衡器'结果'可以和'现有的nginx upstream模块'一起使用

常见: 'ngx_proxy'和'ngx_fastcgi'

2、'balancer_by_lua*'可以和'标准upstream连接池'机制一同工作

常见: 标准'keepalive'指令

注意: 确保keepalive 指令在一个单独的upstream{}配置块中的'balancer_by_lua_*'的后面

3、'balancer_by_lua*' 会完全'忽略'掉定义在upstream{}块中定义的'servers'列表

重点: 但是'server'指令必须存在,作为一个'placeholder'占位符存在,避免'nginx -t'报错

同俗理解:  openretry '优先走' balancer_by_lua 逻辑块

实质:通过lua-resty-core库中的'ngx.balancer'模块,从一个完全'动态'的server列表中'选择'

颗粒度:基于'每个请求'中

4、当nginx的upstream机制'重试'请求中指令指定的条件,如proxy_next_upstream指令

说明: 这个指令'注册的Lua代码'处理器可能在一个单独的'下游请求'中被调用'不止'一次

5、注意'事项'

  1) 这个上下文中执行的Lua代码并'不支持yielding'

  2) 所以可能yield的Lua APIs(例 cosockets和"light threads")在这个上下文中是'被禁用'

  3) 通过在'早期阶段'处理程序'如:access_by_lua*'处理这种操作和

  4) 通过'ngx.ctx 'table传递结果给这个上下文的解决方法可以'绕过'这个限制

balancer_by_lua_file

1、OpenResty 的 'balancer_by_lua' 指令让'动态负载均衡'成为可能

2、它'替代'了原生的 'hash/ip_hash/least_conn' 等算法

3、不仅可以让'自由定制'负载均衡策略,还可以随意'调整'后端服务器的数量

4、完全'超越'了 upstream 系列指令,实现了接近'商业版' Nginx Plus 的功能

+++++++++++++ "注意事项" +++++++++++++

1、'balancer_by_lua' 也是一个比较'特殊'的执行阶段

特点: 这里'不能'使用 'ngx.sleep'、'ngx.req.*' 或 'coocket'

补充: 同时应当尽量'避免'大计算量操作或磁盘读写,否则会导致'阻塞'

2、动态负载均衡使用的'服务器列表'通常'存储在外部'的 Redis '常见' 或 MySQL 里

备注: 由于'不能直接'使用 cosocker,所以在 'balancer_by_lua' 里也就'不能'操作这些服务器

解决: 但可以在'其他'的阶段'access_by_lua、ngx.timer[常见]'里 -->

访问服务器获取'列表'、解析'域名',然后放在 'ngx.ctx' 或全局模块里'传递'过来

k8s nginx ingress动态更新原理

③  ngx.balance

​lua-resty-core 模块 '提供' ngx.balancer

1、这'四'个函数的的'用法'都很'简单'

2、动态负载均衡的'重点'其实是服务器'列表的维护'和'选择算法'

备注:这些工作通常应该在 'balancer_by_lua' 之'外'完成,ngx.balancer 只是最后的'执行者'

set_current_peer     nginx转发实现过程中的问题总结

最佳实践: balancer.set_current_peer用于设置后端的'地址'与'端口'

balancer中只能'设置ip',不'支持'直接设置域名,

思考: 如何解决'DNS'解析问题?

  1、host中的域名'不起'作用,'可以'使用'lua-resty-dns'解析域名,然后获取'解析'结果

  2、可以在'access_by_lua*阶段'解析域名,总之要在'upstream'之前'解析'域名

  例如:这里是在rewrite阶段,从'请求信息'中读取出了'关键'信息,做了一次DNS解析再'设置'进去的

set_more_tries

set_more_tries:设置连接'失败'后的'重试'次数

balancer.set_more_tries不能超过proxy_next_upstream_tries

推荐: 用'ngx.ctx.tries'记录进入balancer.lua的'次数',超过设置的重试次数直接给错误响应码

get_last_failure

get_last_failure:获取'上一次连接失败'的具体'原因'

注意: state_name '和' status_code  返回值的'含义'

set_timeouts

recreate_request

相关参考

④  案例讲解

1: 简单'案例'

if not ok then --> 检查'是否'设置成功,代码要'健壮'

第三方lua-resty-balance

更多推荐

[GIT]版本控制工具

[GIT]版本控制工具Git的命令Git的配置信息查看现有Git配置信息设置Git配置信息用户信息配置文本编辑器配置差异分析工具配置编辑Git配置文件Git仓库操作初始化Git仓库克隆Git仓库Git分支仓库创建Git远程仓库命令Git提交历史Git标签添加标签查看已有标签删除标签查看标签版本的修改内容其它操作Git是

自己实现 SpringMVC 底层机制 系列之-实现任务阶段 5- 完成 Spring 容器对象的自动装配 -@Autowried

😀前言自己实现SpringMVC底层机制系列之-实现任务阶段5-完成Spring容器对象的自动装配-@Autowried🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

自己实现 SpringMVC 底层机制 系列之--实现任务阶段 3- 从 web.xml动态获取 wyxspringmvc.xml

😀前言自己实现SpringMVC底层机制系列之–实现任务阶段3-从web.xml动态获取wyxspringmvc.xml🏠个人主页:尘觉主页🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉在csdn获奖荣誉:🏆csdn城市之星2名⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣⁣

macOS - 使用VLC

文章目录关于VLC安装查看帮助流媒体MRL语法:URL语法:主程序(core)音频视频截图:窗口属性:子画面屏幕显示(OSD):字幕:覆盖:轨道设置:播放控制:默认设备:高级:输入播放列表性能选项:热键跳跃大小:关于VLCVLCmediaplayerVLC是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文

SpringMVC概述,SpringMVC是什么,有什么优势?

目录一、MVC模式二、SpringMVC是什么?三、SpringMVC的优势四、SpringMVC的应用场景一、MVC模式MVC模式是一种软件架构模式,它将软件的用户界面(即前台页面)和业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性和灵活性。MVC模式包含三个组件:Model(模型)、View(视图)和Co

Spring MVC请求处理流程和九大组件

文章目录SpringMVC请求处理流程SpringMVC九⼤组件需求:前端浏览器请求url:http://localhost:8080/demo/handle01,前端⻚⾯显示后台服务器的时间开发过程配置DispatcherServlet前端控制器开发处理具体业务逻辑的Handler(@Controller、@Requ

阿里云大数据实战记录10:Hive 兼容模式的坑

文章目录1、前言2、什么是Hive兼容模式?3、为什么要开启Hive模式?4、有什么副作用?5、如何开启Hive兼容模式?6、该场景下,能不能不开启Hive兼容模式?7、为什么不是`DATE_FORMAT(datetime,string)`?8、小结1、前言今天在开发一个表单的时候,MaxCompute抛给我一个错误:

pdf转换成word,这里有几个不错的方法

  pdf转换成word怎么转?大家都知道,在电脑进行各种文件格式转换中,PDF转换为Word文档的需求量应该是最大的。在我们的日常工作中,经常需要将PDF转换为Word格式。为什么要将pdf文件转换成word,相信大家也都应该知道的,因为pdf文件不易编辑的特点,导致大家相对pdf文件内容进行修改

计算机竞赛 深度学习 python opencv 实现人脸年龄性别识别

文章目录0前言1项目课题介绍2关键技术2.1卷积神经网络2.2卷积层2.3池化层2.4激活函数:2.5全连接层3使用tensorflow中keras模块实现卷积神经网络4Keras介绍4.1Keras深度学习模型4.2Keras中重要的预定义对象4.3Keras的网络层构造5数据集处理训练5.1分为年龄、性别5.2性别

【React】React入门

目录一、何为React二、React与传统MVC的关系三、React的特性1、声明式编程①、实现标记地图2、高效灵活3、组件式开发(Component)①、函数式组件②、类组件(有状态组件)③、一个组件该有的特点4、单向式响应的数据流四、虚拟DOM1、传统DOM更新①、举例讲解2、虚拟DOM①、举例讲解五、创建Reac

2022年统计用区划代码表SQL 第二部分02

行政区划代码为国家公布的六位县级以上行政区划代码行政区编码的用途:APP里做城市级联选择根据身份证前六位获取用户所在城市区县370786昌邑市370800济宁市370811任城区370812兖州区百度高德等接口通常都会返回adcode字段(行政区编码)根据行政区编码可以查询天气数据例如请求天气API接口,传参adcod

热文推荐