AbtestingGateway 分流策略添加
目录结构分布
我们从GitHub上把它下载后解压出来,有以下5个目录,分别是:
- admin 管理模块,对策略增删改查等功能
- diversion 主模块吧,看源码是通过反射的方式调用lib/userinfo里面的子模块读取我们需要做判断条件的信息,然后在根据提取出来的信息匹配规则,再根据匹配结果调用lib/diversion里面的模块提取upstream,最后返回upstream给nginx进行分流。
- doc 文档
- lib 各个操作的子模块
- utils 专门存放nginx相关文件的
我这次更改的需求是 添加一个分流策略
从哪里开始入手
我们了解每个目录是干啥的后,我们开始从lib这个模块开始入手
我们切换到lib/abtesting/utils/ 下面,修改init.lua模块以下代码
init.lua
添加分流策略
_M.divtypes = {
["iprange"] = 'ipParser',
["uidrange"] = 'uidParser',
["uidsuffix"] = 'uidParser',
["uidappoint"] = 'uidParser',
["arg_city"] = 'cityParser',
["url"] = 'urlParser',
["domainname"] = 'domainname', --新添加域名策略
}
我在上面的代码divtypes里面添加了 ["domainname"] = 'domainname'这一行,这个主要是对分流策略做添加一个策略作用,因为当我们对abtestinggateway添加策略的时候,它会从这里匹配。
userinfo目录下面添加lua文件
获取我们需要的参数在分流的时候。
添加完策略名后,我们还需要添加一个模块,先切换到 lib/abtesting/userinfo/ 下面,然后添加一个和刚才策略名一样的lua文件,比如我刚才设置的是domainname,那么我在这下面也添加一个 domainname.lua 文件,文件名不一样的话,会报错,提示导入模块失败的。代码如下:
[root@LeoDevops gray_release_newtang]# cat lib/abtesting/userinfo/domainname.lua
local _M = {
_VERSION = '0.01'
}
_M.get = function()
local h = ngx.var.host
return h
end
return _M
上面这段代码主要是提取http的请求域名的功能,然后返回给调用者。
diversion目录下添加lua文件
编写分流逻辑。
我们上面两步做完后,还有一步是自己写一个分流规则,我们可以参考这个/lib/abtesting/diversion下面的其他策略文件,照着写就是了,文件名需要和策略名字一致。
[root@LeoDevops gray_release_newtang]# cat lib/abtesting/diversion/domainname.lua
local modulename = "abtestingDiversionCustomercode" -- 模块名记得更改
local _M = {}
local mt = { __index = _M }
_M._VERSION = "0.0.1"
local ERRORINFO = require('abtesting.error.errcode').info
local k_domainname = 'domainname'
local k_domainname_set = 'domainname_set' --这个是key,后面对应的value就是我们要匹配的域名 比如{domainname_set:['t1.com','t2.com']}
local k_upstream = 'upstream'
_M.new = function(self, database, policyLib)
if not database then
error{ERRORINFO.PARAMETER_NONE, 'need avaliable redis db'}
end if not policyLib then
error{ERRORINFO.PARAMETER_NONE, 'need avaliable policy lib'}
end
self.database = database
self.policyLib = policyLib
return setmetatable(self, mt)
end
local isNULL = function(v)
return v and v ~= ngx.null
end
-- policy is in format as {{upstream = '192.132.23.125', domainname_set ={ "t1", "t2","t3"} }, {}}
_M.check = function(self, policy)
for _, v in pairs(policy) do
local domainname_set = v[k_domainname_set]
local upstream = v[k_upstream]
local v_domainname_set = domainname_set and (type(domainname_set) == 'table')
local v_upstream = upstream and upstream ~= ngx.null
if not v_domainname_set or not v_upstream then
local info = ERRORINFO.POLICY_INVALID_ERROR
local desc = ' k_domainname_set or k_upstream error'
return {false, info, desc}
end
for _, domainname in pairs(domainname_set) do
if not tostring(uid) then
local info = ERRORINFO.POLICY_INVALID_ERROR
local desc = 'domainname invalid ,can not convert to string'
return {false, info, desc}
end
end
--TODO: need to check upstream alive
end
return {true}
end
-- policyData will be in hash table domainname:upstream
_M.set = function(self, policy)
local database = self.database
local policyLib = self.policyLib
database:init_pipeline()
for _, v in pairs(policy) do
local domainname_set = v[k_domainname_set]
local upstream = v[k_upstream]
for _, domainname in pairs(domainname_set) do
database:hset(policyLib, domainname, upstream)
end
end
local ok, err = database:commit_pipeline()
if not ok then
error{ERRORINFO.REDIS_ERROR, err}
end
end
_M.get = function(self)
local database = self.database
local policyLib = self.policyLib
local data, err = database:hgetall(policyLib)
if not data then
error{ERRORINFO.REDIS_ERROR, err}
end
return data
end
_M.getUpstream = function(self, domainname)
if not tostring(domainname) then
return nil
end
local database, key = self.database, self.policyLib
local backend, err = database:hget(key, domainname)
if not backend then error{ERRORINFO.REDIS_ERROR, err} end
if backend == ngx.null then backend = nil end
return backend
end
return _M
上面的就是我的域名分流 逻辑,如果我加入了其他分流策略,那么只需要把domainname,k_domainname,k_domainname_set这三个变量名更改成自己的就可以了。
测试
完成上面三步后,我们就可以测试了,
policy_check
[root@LeoDevops ~]# curl 'http://127.0.0.1:8080/ab_admin?action=policy_check' -d '{"divtype": "domainname","divdata": [{"domainname_set": ["t1.quanshi.com", "t2.quanshi.com"],"upstream": "beta1"}]}'
{"code":200,"desc":"success "}
语法检测OK,通过,那么就添加策略了吧。
policy_add
[root@LeoDevops ~]# curl 'http://127.0.0.1:8080/ab_admin?action=policy_set' -d '{"divtype": "domainname","divdata": [{"domainname_set":["t1.quanshi.com", "t2.quanshi.com"],"upstream": "beta1"}]}'
{"code":200,"desc":"success the id of new policy is 0"}
策略添加成功,没有问题。
错误日志记录
这里使用的是nginx日志来记录日志,我们这里的也借助abtestingGateway来做日志记录。
我们切换到lib/abtesting/error/ 下面,编辑errorcode.lua 里面的代码
local modulename = 'abtestingErrorInfo'
local _M = {}
_M._VERSION = '0.0.1'
_M.info = {
... 省略N行
-- show some args when posting
['SHOW_REQUEST_ARGS'] = { 50701, 'requst arguments --> '},
['SHOW_POST_ARGS'] = { 50702, 'POST arguments --> '},
}
return _M
上面两行代码是我添加的错误代码。用于显示参数信息等。临时打下这些信息方便编写代码。
打印日志
local args = ngx.req.get_uri_args()
local action = args.action
local do_action = ab_action[action]
local info = ERRORINFO.SHOW_REQUEST_ARGS
log:errlog(dolog(info,action )) --记录http请求的参数,临时打开下,记录为error也可以,反正是临时打开下。
AbtestingGateway 分流策略添加的更多相关文章
- AD组策略添加本地账号、设置允许ping回显
AD组策略添加本地账号 1. 管理工具--组策略管理--选择相应GPO(编辑)----首选项--控制面板设置--本地用户和组--右键添加账号 2.域成员计算机刷新组策略(gpupdate/force) ...
- imperva 默认策略添加例外
创建违规访问 检查违规的告警类型 假如客户的这个目录下真的有这个文件,而且客户非常明确这是一个正常且安全的东西怎么办?我该如何的将它添加到例外? 添加例外的步骤: 再次构造违规的请求: 默认策略添加例 ...
- nginx:负载均衡(三)分流策略
[1]轮询策略.轮询策略是最简单的策略,无脑配置,不考虑服务器的访问的能力.每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除 upstream www.daysn. ...
- JsonModelStrategy策略添加
今天在学习 zf2的时候,发现后端如果返回的是JsonModel的话,则在前台异步请求的时候发现取不到数据了,后来经过多次研究,才发现要在view_manager中创建策略,代ma是这样子的,stra ...
- AbtestingGateway 复制请求到其他服务上
perface 最近有需求,需要把服务a发给服务b的请求复制给服务c,服务a发给服务b的时候会经过nginx,这个nginx是有lua脚本来辅助工作的.说白了,这个nginx+lua就是abtesti ...
- 新浪的动态策略灰度发布系统:ABTestingGateway
原文链接:http://www.open-open.com/lib/view/open1439889185239.html ABTesingGateway 是一个可以动态设置分流策略的灰度发布系统,工 ...
- 【Azure API 管理】在APIM 中添加 log-to-eventhub 策略,把 Request Body 信息全部记录在Event Hub中
问题描述 根据文档 https://docs.azure.cn/zh-cn/api-management/api-management-howto-log-event-hubs, 可以将Azure A ...
- 关于aws-SecurityGroup-安全组策略的批量添加的方法记录
因一些服务的客户端网络地址段计划变更,会影响到aws上配置这这些网段安全组策略所绑定的资源 因此需要先整理包含了出那些服务的网络地址段的安全组 然后根据旧网段的策略信息,将新的地址段给添加上,待后续正 ...
- Mac下使用ABTestingGateway快速搭建灰度网关
ABTestingGateway简介 ABTestingGateway 是新浪开源的一个可以动态设置分流策略的灰度发布系统,工作在7层,基于nginx和ngx-lua开发,使用 redis 作为分流策 ...
随机推荐
- CSDN博客文章的备份及导出电子书CHM
需要用到的工具集合下载:http://download.csdn.net/source/2881423 在CSDN.百度等写博客文章的应该很多,很多时候担心服务器有一天突然挂了,或者担心自己的号被封了 ...
- 探讨后端选型中不同语言及对应的Web框架
在进行后端选型的时候,实际上我们要选择的是一个框架.后端领域所使用的技术和框架已经趋于稳定,我们只需要按我们的需要选择所需要的框架.当存在多个框架适合时,我们再选择适合的语言.不得不指出的是,当我们喜 ...
- 解决IE9下交通银行网上银行无法输入密码的问题
自系统升级到 Win 7以后,突然发现用 IE9 浏览器登陆交通银行网上银行时,始终不能正常 输入密码.原来,非要进行特别的设置才可.现记录如下: 1.没有交通银行安装安全输入控件,安装即可. 当 ...
- 通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句
参考: https://blog.csdn.net/qq465235530/article/details/68064074 https://www.cnblogs.com/zj0208/p/6008 ...
- 从Encoder到Decoder实现Seq2Seq模型
https://zhuanlan.zhihu.com/p/27608348 更新:感谢@Gang He指出的代码错误.get_batches函数中第15行与第19行,代码已经重新修改,GitHub已更 ...
- 《Attention is All You Need》
https://www.jianshu.com/p/25fc600de9fb 谷歌最近的一篇BERT取得了卓越的效果,为了研究BERT的论文,我先找出了<Attention is All You ...
- 摄像专用的SD卡推荐
此类SD卡主要需要满足快速写入:特别对于4K的支持,速度要有很高才能满足. 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- SoapUI Pro Project Solution Collection-Custom project and setup
import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import com.eviware.soap ...
- pandas基础用法——索引
# -*- coding: utf-8 -*- # Time : 2016/11/28 15:14 # Author : XiaoDeng # version : python3.5 # Softwa ...
- CSS 居中布局
来源:http://www.cnblogs.com/QianBoy/p/8539077.html 水平居中 1)使用inline-block+text-align 原理:先将子框由块级元素改变为行内块 ...