Openresty(二十二)ngx.balance和balance_by_lua终结篇

一  灰度发布铺垫

①  init_by_lua*

init_by_lua   

init_by_lua_block

特点: 在openresty 'start'、'reload'、'restart'时执行,属于'master init' 阶段机制: nginx 'master' 主进程'加载配置文件'时,运行全局Lua VM级别上的参数指定的'Lua代码'场景: 想对于应用'做一次全局性'的初始化

案例1: init阶段'已经加载'的模块会放在'package.loaded'中,供'后续阶段'直接使用备注: 在'初始化时'候加载过了,已经在 package.loaded '表'里

案例2: ' lua_shared_dict' 和 'ngx.shared'的'set、get'方法结合使用

  

当配置重载时,init_by_lua* 不会清空其内的lua_shared_dict共享数据

注意事项: 只能使用'print'、'ngx.log' API 和 'lua_shared_dict' 指令推荐: 在'init_by_lua'中调用'require()'来加载自己的模块文件特点: 1) require()会在全局Lua注册的'package.loaded表'中缓存Lua模块2) 所以在'整个Lua虚拟机实例中'你的模块将'只会加载一次'补充: 'init_by_lua*'中master进程'执行'lua代码

案例3: 阻塞'I/O'调,执行'shell'命令  --> '特殊场景'1、在这个'上下文'中,你可以保守使用'lua库'完成阻塞I/O调用2、因为在'master进程'的阻塞调用在服务的启动过程中是完全'没问题'的3、进一步说在'配置加载'阶段,Nginx核心就是'阻塞 I/O 方式'处理的场景: 采用在'init阶段'调用'shell'命令

lua执行系统命令方法os.execute和io.popen      init_by_lua_file不能连接redis

注意: 此处的'content'是'字符串',需要自己重新解析成字典,可以存入变量,也可以存在共享内存中

init_by_lua_file 

说明: '推荐'使用'init_by_lua_file'

②  init_worker_by_lua*

说明: ​官方对'init_worker_by_lua*'并没有'API'的限制

init_worker_by_lua

init_worker_by_lua_block

1、在'每个'nginx worker进程启动时调用'指定'的lua代码2、用于启动一些'定时'任务:比如'心跳'检查,定时'拉取'服务器配置等等强调:此处的任务是'跟Worker进程数量'有关系的,不要'重复'了,那么如何'避免'重复呢?

 ngx.worker.id判断某个worker进行初始化

说明: 使用ngx.timer可以'突破' init_worker_by_lua 中'不能使用 cosocket' 的限制

如何在 init_worker_by_lua 阶段连接redis/mysql/dns    redis连接池封装

③   lua_shared_dict

④   ngx.shared.DICT

ngx.shared共享内存操作

二   灰度发布案例

建议: 配置'指令'和'代码'解耦,这里暂时'不讲究'了

①  业务流程图

canary  --> gray  --> '灰度'LBM: 做'配置下发'的时候,UI侧会有一个'gray灰度'开关按钮,在upstream生成对应的'代码'片段形如:upstream {server 127.0.0.1:80;balance_by_lua 'lua/gray.lua'}备注: 这里暂时'不讨论 upstream{}'内的健康检查
​
再次强调: 同一个'schema'集群内选举灰度节点,也即'集群内'灰度引流,而不是'集群间'引流

补充: 1、一般会将'灰度策略'先写入'DB',例如'mysql'中2、利用'bgr灰度插件'解析从'redis'拉取的'灰度'策略,返回'灰度节点'信息3、init_worker_by*的'功能'1) 从'redis'中拿灰度策略,放到'ngx.shared本地缓存'中2) 启动定时任务,定时'异步'拉取'灰度'策略

②  相关参考

openresty+Lua+Redis灰度发布     高性能软件负载OpenResty整合Reids集群配置

关于openresty的全局初始化问题   基于openresty/lua-resty-redis 二次封装的工具库

Lua Redis 使用   Java Redis 预热数据    openresty定时任务    限制定时任务耗尽资源

k8s灰度发布

+++++++++++++ "题外话" +++++++++++++1、一般会'将nginx的配置信息'写到'数据库'中,然后通过nginx+consul-template 做'配置渲染'假定: mysql中的 'region'、'集群名'能唯一的决定一个'集群'的配置信息附加: 其中'upstream_id'是其一个'field'字段2、利用每个'upstream_id'的schmea的'不能'重复的特性应用: 根据'upstream_id'获取'后端服务器'列表补充: 后端服务器列表的信息在'对应服务配置'注册LB,做'配置下发'的时候已经'写入'数据库

③  代码雏形1

说明: 通过'init_worker_by_block' + 'ngx.timer.every' 实现定时'拉取'redis配置数据实现: 管理面将策略'下发'到redis后,openresty '定时[5min]'从redis中'拉取'数据  

遗留: redis'资源池'如何'复用'?nacos能实现'灰度发布'吗?灰度用户请求中'打上'标签: 'gray=true'

④  灰度策略管理面

说明: 一般会通过'UI'将策略下发到'redis'中,这里我们'模拟'手动将'key'写到缓存数据库中关键: redis 'key' 组成,一般会通过':'分割,分割的'每一个字段'都是一个'维度'特征信息模拟'key': 这里'假定'key是'uuid:ip'形式,讲解一种'简单'的形式,key的'组成'反映'特征'形式常见: $upstream_id:$tenant  --> 保证这个'key'的唯一性模拟'value': 'ip:port'形式,要'与'upstream关联[存储在'mysql'中],选取'某个server 节点'补充: 业界喜欢称一个'upstream'为一个'schema'后续设计: UI侧可以设置'多种灰度特征策略',然后选取'灰度'节点信息也即: 在'后台管理系统中'添加'ip'、'用户名'灰度白名单后+++++++++++++++  "典型案例"  +++++++++++++++灰度策略配置'UI'侧设计:1、'region'、'集群名称'、LB类型 进行 '灰度'策略的下发2、对应'server'块的'域名'、'端口'、'location'信息

OpenResty的Redis模块踩坑记录   openresty操作redis,null处理    redis连接池

1、'遍历'key2、key的'设计',到底是'hash'结构,还是'其它'数据结构?

⑤   灰度机制

1、'优先'从'本地缓存'中去取local cacheip = cache_ngx:get('gray_key')2、本地缓存中'不存在',去'redis缓存服务中'去取,然后加载到'本地'缓存检查'redis缓存中的键'是否存在 --> if redis_client.exists(key):if cacheip == "" or cacheip == nil or cacheip == ngx.null then3、通过本地'ngx.shared 一级'缓存 和 redis'二级'缓存

高并发灰度策略    小破站诡异0问题    openresty最佳实践   灰度发布

⑥  代码雏形2

细节: balance_by_lua 会 '忽略' upstream中的'server'配置

用到的'两个'指令: ​​access_by_lua_file 和 ​​balancer_by_lua_file1、在'前一个指令'中获取'租户'信息选择'灰度'节点;2、在'第二个指令'中根据获取的信息'执行'负载均衡,进行'转发';

不依赖于balance_by_lua实现灰度发布

# 另外一种方式  --> 这种'不依赖'于'balance_by_lua'做判断upstream  default_route {...
}location /gray {	set $backend 'default_route';rewrite_by_lua_file   'lua/gray.lua';  # 获取灰度节点的'逻辑'proxy_pass http://$backend;			
}	强调: 如果使用 'content_by_lua' 这个命令,就'无法'在进行'proxy_pass'了,会'冲突'

openresty实现灰度发布 

利用 proxy_pass 及lua指令 set_by_lua 动态修改当前 upstream 变量实现灰度发布

ngx_balancer.set_more_tries设置不生效,导致无限重试

OpenResty balancer_by_lua负载均衡原理解析    Openresty专栏     跨域

OpenResty火焰图性能分析工具安装     Nginx调试工具Coredump    Lua性能优化

⑦   lua/gray.lua 灰度插件

考虑: 如果'不是灰度白名单',则要使用原来的'负载均衡'策略--> '如何解决呢?' --> '重点'最佳实践: 自定义'负载均衡'算法引申:在'配置'注册的阶段,如果使用'灰度'策略,那么后续如何'取消'呢?

⑧  lua/gray_access.lua  灰度策略命中

重点: 从redis读取'租户'信息,如果有就'存'到 ​​ngx.ctx​​ 中-- 太'累'了,九不往这里贴代码了,后续有时间再补充

⑨   测试

思考:用户如何将用户'特征'信息传递过来? --> 'request Header'、'查询参数'

⑩  题外话

local http = require("resty.http")  -->  http'相关'模块

深入理解ngx.log

 lua_code_cache

openresty 项目问题汇总

nginx主动加载配置文件

openresty性能对比 

lua_load_resty_core on|off自v0.10.16版本起'该指令'就在本模块'失效'了当前resty.core模块会在'Lua VM初始化'的时候被'强制加载',不需要再显示'require'加载lua + nginx可以'作为网关'进行 '限流'、'流控'和'多级缓存'使用

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

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

相关文章

每日一题~二叉搜索树中的众数

题目链接:501. 二叉搜索树中的众数 - 力扣(LeetCode) 题目描述: 思路分析: 由题可知,题目中所给的树是一颗二叉搜索树,二叉搜索树的中序遍历结果是一个从小到大的数据集,那么我们可…

「聊设计模式」之抽象工厂模式(Abstract Factory)

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 前言 在软件开发中,设计模式是一种被广泛使用的经验…

C++(day4)

思维导图 封装Mystring #include <iostream> #include<cstring>using namespace std;class Mystring{ public://无参构造函数Mystring():size(10){strnew char[size];strcpy(str,"");cout<<"无参构造函数"<<endl;}//有参构造函数…

平衡二叉树删除结点后的调整操作

1.回顾插入操作 插入新结点后&#xff0c;要保持二叉排序树的特性不变&#xff08;左<中<右)若插入新结点导致不平衡&#xff0c;则需要调整平衡。 2.删除操作 删除结点后&#xff0c;要保持二叉排序树的特性不变&#xff08;左<中<右)若删除结点导致不平衡&…

C++---链表

1、链表 1.1、链表的结构 每个链表开头都有一个头指针Head尾节点的指针域为NULL&#xff0c;用于判断此列表是否结束 如果一个链表开始就为NULL&#xff0c;那么该链表为空链表 链表中的先后不代表在真实内存中的位置&#xff0c;只是单纯的逻辑上关系 1.2、创建链表 我们首…

网络编程 day1

1->x.mind网络编程基础 2->简述字节序的概念&#xff0c;并用共用体&#xff08;联合体&#xff09;的方式计算本机的字节序 1.字节序是指不同类型的CPU主机&#xff0c;内存存储多字节整数序列的方式 2.小端字节序&#xff1a;低序字节存储在低地址上 3.大端字节序&a…

定制化图标——Element UI 组件图标替换指南

本篇博客将介绍如何在使用 Element UI 组件时对原生图标进行定制化替换&#xff0c;提供了适用于满足个性化需求的方法和技巧。 引言 Element UI 是一款基于 Vue.js 的流行 UI 组件库&#xff0c;在前端开发中得到广泛应用。然而&#xff0c;在使用 Element UI 的组件时&#…

中小型教育机构这样做,让你轻松抓住受众注意力

教育一直都是家长对于孩子最关心的事情&#xff0c;对于部分家庭来说&#xff0c;教育支出占整个家庭支出的50%左右。 而软文作为目前效果比较明显而且性价高的推广方式&#xff0c;也很适合教育培训行业&#xff0c;因为它能让潜在客户可以清楚地了解产品的特性&#xff0c;感…

Java面试八股文宝典:初识数据结构-数组的应用扩展之HashMap

前言 除了基本的数组&#xff0c;还有其他高级的数据结构&#xff0c;用于更复杂的数据存储和检索需求。其中&#xff0c;HashMap 是 Java 集合框架中的一部分&#xff0c;用于存储键值对&#xff08;key-value pairs&#xff09;。HashMap 允许我们通过键来快速查找和检索值&…

004-Windows下开发环境搭建

Windows下开发环境搭建 文章目录 Windows下开发环境搭建项目介绍版本控制工具Git 与 SVNWindow下安装Git Qt 开发工具静态编译Qt环境安装 串口模拟器比较工具SQLite 数据库查看小工具预告 关键字&#xff1a; Qt、 Qml、 开发环境、 Windows、 C 项目介绍 欢迎来到我们的 …

数据库操作-DML/DQL

数据库操作-DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据&#xff08;INSERT&#xff09; 修改数据&#xff08;UPDATE&#xff09; 删除数据&#xff08;DELETE&#xff09; 增加(ins…

python 异常

1.捕获异常 2.密码爆破 3.

【业务功能118】微服务-springcloud-springboot-Kubernetes集群-k8s集群-KubeSphere-OpenELB部署及应用

OpenELB部署及应用 一、OpenELB介绍 网址&#xff1a; openelb.io OpenELB 是一个开源的云原生负载均衡器实现&#xff0c;可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区发…

【Seata】05 - Seata Saga 模式简单整理、Docker 部署 Nacos 单机(基于 Jpom)相关配置

文章目录 前言参考目录Saga 模式知识点简单整理1、适用场景、优缺点2、Saga 模式的使用3、可能出现的问题以及解决方法 Docker 部署 Nacos 单机&#xff08;基于 Jpom&#xff09;步骤 1&#xff1a;拉取镜像步骤 2&#xff1a;构建容器步骤 3&#xff1a;Nacos 设置 Seata 配置…

自动化测试工具slelnium的初体验

1.slelnium介绍 1.1 一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的。 1.2 可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff08;包括PhantomJS这些无界面的浏览器&#xff09;&#xff0c;可以接收指令&#xff0c;让浏览器自动加载页…

23062QTday2

完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两个按钮…

ROS 入门

目录 简介 ROS诞生背景 ROS的设计目标 ROS与ROS2 安装ROS 1.配置ubuntu的软件和更新 2.设置安装源 3.设置key 4.安装 5.配置环境变量 安装可能出现的问题 安装构建依赖 卸载 ROS架构 1.设计者 2.维护者 3. 立足系统架构: ROS 可以划分为三层 ROS通信机制 话…

SQL中的PowerDesigner逐步深入提问,你能掌握多少?

你提到了有PowerDesigner操作经验&#xff0c;请解释一下PowerDesigner是什么&#xff0c;以及它在数据库设计和开发中的作用是什么&#xff1f; 标准回答&#xff1a; PowerDesigner是一种数据库建模和设计工具&#xff0c;它用于创建数据库模型、设计表结构、定义关系和生成…

【漏洞复现】Smanga未授权远程代码执行漏洞(CVE-2023-36076) 附加SQL注入+任意文件读取

文章目录 前言声明一、产品简介一、漏洞描述二、漏洞等级三、影响范围四、漏洞复现五、修复建议六、附加漏洞漏洞一、SQL注入漏洞二、任意文件读取 前言 Smanga存在未授权远程代码执行漏洞,攻击者可在目标主机执行任意命令,获取服务器权限。 声明 请勿利用文章内的相关技术从…

windows彻底卸载unity

1.控制面板卸载 双击打开桌面的控制面板&#xff0c;选择卸载程序&#xff0c;选中Unity和UnityHub右击卸载。 2.清除unity的注册表 在运行中输入“regedit”双击打开注册表界面 删除 HKEY_CURRENT_USER\Software\Unity 下所有项 删除 HKEY_CURRENT_USER\Software\Unity Tec…