资讯专栏INFORMATION COLUMN

Mac下使用ABTestingGateway快速搭建灰度网关

2bdenny / 1092人阅读

摘要:下使用快速搭建灰度网关简介是新浪开源的一个可以动态设置分流策略的灰度发布系统,工作在层,基于和开发,使用作为分流策略数据库,可以实现动态调度功能。目前在京东如实时价格秒杀动态服务单品页列表页等都在使用架构,其他公司如淘宝去哪儿网等。

Mac下使用ABTestingGateway快速搭建灰度网关 ABTestingGateway简介

</>复制代码

  1. ABTestingGateway 是新浪开源的一个可以动态设置分流策略的灰度发布系统,工作在7层,基于nginx和ngx-lua开发,使用 redis 作为分流策略数据库,可以实现动态调度功能。

    nginx是目前使用较多的7层服务器,可以实现高性能的转发和响应;ABTestingGateway 是在 nginx 转发的框架内,在转向 upstream 前,根据 用户请求特征 和 系统的分流策略 ,查找出目标upstream,进而实现分流。

环境搭建 1.安装openresty

</>复制代码

  1. 其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。

安装命令:brew install openresty

brew默认将openresty安装在/usr/local/Cellar/openresty/目录下

2.安装luajit

</>复制代码

  1. JIT = Just In Time即时编译,是动态编译的一种形式,是一种优化虚拟机运行的技术。
    程序运行通常有两种方式,一种是静态编译,一种是动态解释,即时编译混合了这二者。Java和.Net/mono中都使用了这种技术。

安装命令:brew install LuaJIT

brew默认将openresty安装在/usr/local/Cellar/luajit/目录下

3.安装redis

安装命令:brew install redis

启动命令:brew services start redis

ABTestingGateway搭建 项目下载:

命令:git clone https://github.com/CNSRE/ABTestingGateway.git

下载后目录结果如下

repo中的utils/conf文件夹中有灰度系统部署所需的最小示例

运行灰度网关

</>复制代码

  1. 1. 进入ABTestingGateway目录
  2. 2. 创建logs目录,mkdir logs
  3. 3. 启动redis
  4. 4.
  5. # 启动upstream server,其中stable为默认upstream
  6. 4. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/stable.conf
  7. 5. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/beta1.conf
  8. 6. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/beta2.conf
  9. 7. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/beta3.conf
  10. 8. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/beta4.conf
  11. # 启动灰度系统,proxy server,灰度系统的配置也写在conf/nginx.conf中
  12. 9. /usr/local/Cellar/openresty/1.13.6.2/nginx/sbin/nginx -p `pwd` -c conf/nginx.conf
简单验证:添加分流策略组

</>复制代码

  1. $ curl 127.0.0.1:8080/ab_admin?action=policygroup_set -d "{"1":{"divtype":"uidsuffix","divdata":[{"suffix":"1","upstream":"beta1"},{"suffix":"3","upstream":"beta2"},{"suffix":"5","upstream":"beta1"},{"suffix":"0","upstream":"beta3"}]},"2":{"divtype":"arg_city","divdata":[{"city":"BJ","upstream":"beta1"},{"city":"SH","upstream":"beta2"},{"city":"XA","upstream":"beta1"},{"city":"HZ","upstream":"beta3"}]},"3":{"divtype":"iprange","divdata":[{"range":{"start":1111,"end":2222},"upstream":"beta1"},{"range":{"start":3333,"end":4444},"upstream":"beta2"},{"range":{"start":7777,"end":2130706433},"upstream":"beta2"}]}}"
  2. {"desc":"success ","code":200,"data":{"groupid":0,"group":[0,1,2]}}
分流规则简介

ABTestingGateway灰度系统目前支持的策略有ip段分流、用户uid段分流、uid尾数分流、uid白名单分流

优先级由数字表示,从1开始,级别为1的策略优先级最高

以下共添加了3个分流规则,分别是用户uid尾数分流、城市分流、ip段分流,具体请看json中的注释
stable服务为默认的,未匹配到规则则分流到stable服务器上

</>复制代码

  1. {
  2. "1": {
  3. "divtype": "uidsuffix",
  4. "divdata": [
  5. {
  6. "suffix": "1", //http请求中header X-Uid尾数为1分流到beta1服务器
  7. "upstream": "beta1"
  8. },
  9. {
  10. "suffix": "3", //http请求中header X-Uid尾数为3分流到beta2服务器
  11. "upstream": "beta2"
  12. },
  13. {
  14. "suffix": "5",
  15. "upstream": "beta1"
  16. },
  17. {
  18. "suffix": "0",
  19. "upstream": "beta3"
  20. }
  21. ]
  22. },
  23. "2": {
  24. "divtype": "arg_city",
  25. "divdata": [
  26. {
  27. "city": "BJ", // url上参数city=BJ,分流到beta1
  28. "upstream": "beta1"
  29. },
  30. {
  31. "city": "SH",
  32. "upstream": "beta2"
  33. },
  34. {
  35. "city": "XA",
  36. "upstream": "beta1"
  37. },
  38. {
  39. "city": "HZ",
  40. "upstream": "beta3"
  41. }
  42. ]
  43. },
  44. "3": {
  45. "divtype": "iprange",
  46. "divdata": [
  47. {
  48. "range": {
  49. "start": 1111,
  50. "end": 2222
  51. },
  52. "upstream": "beta1"
  53. },
  54. {
  55. "range": {
  56. "start": 3333,
  57. "end": 4444
  58. },
  59. "upstream": "beta2"
  60. },
  61. {
  62. "range": {
  63. "start": 7777,
  64. "end": 2130706433
  65. },
  66. "upstream": "beta2"
  67. }
  68. ]
  69. }
  70. }
简单验证:设置运行时策略

</>复制代码

  1. $ curl "127.0.0.1:8080/ab_admin?action=runtime_set&hostname=api.weibo.cn&policygroupid=0"
  2. # 分流
  3. $ curl 127.0.0.1:8030 -H "X-Uid:39" -H "X-Real-IP:192.168.1.1"
  4. this is stable server
  5. $ curl 127.0.0.1:8030 -H "X-Uid:30" -H "X-Real-IP:192.168.1.1"
  6. this is beta3 server
  7. $ curl 127.0.0.1:8030/?city=BJ -H "X-Uid:39" -H "X-Real-IP:192.168.1.1"
  8. this is beta1 server

</>复制代码

  1. 注意

报错:

</>复制代码

  1. 2018/07/11 22:00:39 [error] 65912#7287282: *34 lua entry thread aborted: runtime error: ../lib/lua-resty-core/lib/ngx/semaphore.lua:64: dlsym(RTLD_DEFAULT, ngx_http_lua_ffi_semaphore_new): symbol not found
  2. stack traceback:
  3. coroutine 0:
  4. [C]: in function "require"
  5. .../Nginx/ABTestingGateway/utils/../diversion/diversion.lua:11: in function <.../Nginx/ABTestingGateway/utils/../diversion/diversion.lua:1>, client: 127.0.0.1, server: api.weibo.cn, request: "GET / HTTP/1.1", host: "127.0.0.1:8030"

原因:

brew安装的openresty版本与ABTestingGateway不一致导致的,将/usr/local/Cellar/openresty/1.13.6.2/lualib (1.13.6.2替换为您安装的版本)下的相关的lua文件拷贝覆盖ABTestingGateway/lualib下的文件,重启nginx即可

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40017.html

相关文章

  • UCloud 虚拟网络VPC技术演进之路

    摘要:在实践中,我们开发并上线了网关和负载均衡网关。而负载均衡网关则支持无缝替换传统交换机实现网关集群,支持一致性,并支持根据任意字段,内存和端口来计算哈希,支持协议。网络作为信息时代的重要载体,在云服务的快速发展下形成了独具特色的虚拟网络服务架构和模式。12月19日,2020中国云网络峰会于北京顺利召开,会上UCloud虚拟网络VPC负责人陈煌栋给大家带来了演讲《UCloud VPC技术演进之路...

    Tecode 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    wall2flower 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    余学文 评论0 收藏0
  • 马蜂窝容器化平台前端赋能实践

    摘要:本文将结合马蜂窝容器化平台赋能前端应用构建的实践经验,介绍整个平台背后的设计和实现原理,取得的一些效果及问题的优化方案。如果使用容器化平台就不会出现这方面的担忧。 容器对前端开发真的有用吗?答案是肯定的。 最初当我向公司的前端同学「安利」容器技术的时候,很多人都会说:「容器?这不是用在后端的技术吗?我不懂啊,而且前端开发用不上吧。」 showImg(https://segmentfau...

    desdik 评论0 收藏0
  • 微服务网关方案调研

    摘要:综述经调研,使用解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。 综述 经调研,使用Spring Cloud Zuul解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。此外,点评直接采用的nginx负载均衡前置网关,而没用第七层网关,原因据说是七层网关会影响性能,但由于...

    Y3G 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<