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

一  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.balancer1、这'四'个函数的的'用法'都很'简单'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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

指定程序在哪个GPU上运行

摘要: 当本地(或服务器)有个多个GPU时,需要指定程序在指定GPU上运行,需要做以下设置。 目录 一、在终端上指定GPU二、在程序中指定GPU三、系统变量指定GPU四、pytorch中指定GPU 一、在终端上指定GPU 在终端运行程序时…

Python:Django框架的Hello wrold示例

Django是Python的目前很常用的web框架,遵循MVC设计模式。 以下介绍如何安装Django框架,并生成最简单的项目,输出Hello world。(开发工具VScode) 一、安装Django 在VScode终端控制台执行以下指令安装Django python install django 如果要查…

第15篇ESP32 idf框架 wifi联网_WiFi AP模式_手机连接到esp32开发板

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit_esp32_devkit_v1使用pmw呼吸灯实验 第6篇:ESP32连接无源喇叭播…

Django之初入门

一)Django简介 1.简介 Django是一个开源的Python Web框架,它以简洁高效的方式帮助开发者构建复杂的Web应用程序。Django采用了MVC(Model-View-Controller)的架构模式,通过强大的工具和功能,提供了一套完整…

js网络编程

目录 AJAXXHR创建AJAX请求GET和POST传递参数XHR的state其他事件监听响应数据和响应类型http的状态码超时时间封装自己AJAX函数 Axios创建Axios请求实例请求和响应拦截器 FetchFetch与XHR的区别Fetch数据的响应发送Fetch请求 封装Axios AJAX AJAX即异步的JavaScript 和 XML&…

Spring面试题11:什么是Spring的依赖注入

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的依赖注入 依赖注入(Dependency Injection)是Spring框架的一个核心特性,它是指通过外部容器将对象的依赖关系注入到对象中,从而…

M-LAG协议交互原理

介绍M-LAG的实现原理。 基于M-LAG组成的双活系统提供了设备级的可靠性,那么M-LAG是如何建立的?如图1所示,M-LAG的建立过程有如下几个步骤: DFS Group配对 当M-LAG两台设备完成配置后,设备首先通过peer-link链路发送DF…

论文阅读-Group-based Fraud Detection Network on e-Commerce Platforms

目录 摘要 1 Introduction 2 BACKGROUND AND RELATED WORK 2.1 Preliminaries 2.2 Related Works 3 MODEL 3.1 Structural Feature Initialization 3.2 Fraudster Community Detection 3.3 Training Objective 4 EXPERIMENT 4.1 Experimental Setup 4.2 Prediction …

laravel 阿里云短信发送

示例 一、安装 安装:composer require mrgoon/aliyun-sms dev-master 二、打开config/app.php,添加配置代码 1、‘providers’ 配置组下添加 Mrgoon\Aliyunsms\AliyunsmsServiceProvider::class, 2、‘aliases’ 配置组下添加 Aliyunsms>Mrgoon…

【力扣】13. 罗马数字转整数

题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符数值I1V5X10L50C100D500M1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X II 。 27 写…

OpenWrt 学习记录

OpenWrt 学习记录 ssh settingCodePathreview MakefileCURDIRMAKEFILE_LIST ssh setting keygenssh-keygen -t rsa -C "hughwin10WLS.com"copy rsa_pub to gitee sshcat id_rsa id_rsa.pub打开gitee仓库,点击头像、点击设置,点击SSH公钥&…

基于C/C++的共享内存的创建和使用(Linux)

流程: 生成一个key值(函数:ftok)创建共享内存,返回一个共享内存id(函数:shmget)映射共享内存,关联的到当前进程,得到虚拟地址(函数:shmat)使用内存,此时操作shmat函数返回的指针就是…

记一次STM32F4 HAL IAP开发过程踩坑

第一次在HAL库上做IAP,不太熟悉库结构,被坑了一早上… MCU上做了一个shell,实现了goto命令跳转到APP区执行(只是为了开发时方便)。跳转到APP前和以前一样清理了所有初始化过的外设,也对中断进行了处理&…

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础

Qt5开发及实例V2.0-第十九章-Qt.QML编程基础 第19章 QML编程基础19.1 QML概述19.1.1 第一个QML程序19.1.2 QML文档构成19.1.3 QML基本语法 19.2 QML可视元素19.2.1 Rectangle(矩形)元素19.2.2 Image(图像)元素19.2.3 Text&#xf…

spring和springmvc常用注解

1.Spring常用注解: 1)Repository将DAO类声明为Bean 2)Service用于修饰service层的组件 3)Controller通常作用在控制层,将在Spring MVC中使用 4)Component是一个泛化的概念,仅仅表示spring中的一…

机器人如何有效采摘苹果?

摘要:本文利用动捕数据构建拟人运动模型,对比观察两种苹果采摘模式,并对系统性能进行全面评估,为提高机器人采摘效率提供创新方法。 近期,一项关于苹果采摘机器人的有趣研究—— "Design and evaluation of a rob…

linux 编译安装 opencv 和指定 opencv_contrib 库

1. 下载 opencv 和对应版本的 opencv_contrib 库 opencv:https://opencv.org/releases/opencv_contrib:https://github.com/opencv/opencv_contrib 2. 使用 cmake 编译 opencv 和指定 opencv_contrib 库 # 在 opencv 源码文件夹下创建并进入 build 文…

rust学习-rpc

使用框架rpcx-rs rpcx-rs 0.2.2 版本,使用Rust访问rpcx服务,支持 JSON 和 MessagePack 两种序列化方式。 protobuf序列化的支持、服务治理各种功能(路由、失败处理、重试、熔断器、限流)、监控(metrics、trace)、注册中心(etcd、consul)等众多的功能 cat ../Cargo.toml [pa…

MR混合现实情景实训教学

MR混合现实技术是一种将虚拟现实与现实场景相融合的创新技术,可以广泛应用于各个领域。其中,混合现实情景实训教学是MR技术的一个重要应用场景。 在医学专业方面,医学生常常需要通过实际操作来提升自己的技能水平,然而传统的实训方…

Vue 使用SignalR.JS与Microsoft.AspNetCore.SignalR实时通讯

针对于Web与其他应用的的通讯,在.Net中,SignalR是一个不错的选择,在前后端没有分离的时候,直接引用对应的signalr.js文件即可; 这里主要记录Vue与Asp.netcore 前后端分离通过signalR通讯实践; 服务端即Asp.…