apisix实现http流量灰度方案的演进

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术

背景

想要实现http流量灰度的核心还是看你用什么网关,才能决定你用什么技术方案。

如果我们想用spring cloud gateway那一套,那么我们就需要自己去开发一些路由规则。

本次我们讨论的是云原生网关apisix的一种灰度发布实现方式

基于k8s的单service pod替换

实际最简单的方案就是我们可以基于kubernetes的服务发现来做 比如我们有一个search服务,有3个pod

我们可以发版只发布修改一个pod实现最简单的灰度

但是这样有一个最明显的弊端,我们无法精准控制灰度流量比例。在apisix那边对应只有一个upstream(上游服务)

基于k8s的多service+apisix traffic-split插件

traffic-split插件

traffic-split 插件可以通过配置matchweighted_upstreams 属性,从而动态地将部分流量引导至各种上游服务。该插件可应用于灰度发布和蓝绿发布的场景

举个🌰

比如现在search需要进行蓝绿发布。那么我们需要首先创建两个上游服务

  • search
  • search-gray

对应的也是两个kubernetesservice

  • search-service
  • search-service-gray

然后我们配置traffic-split插件

json 复制代码
{
  "plugins": {
    "traffic-split": {
      "rules": [
        {
          "match": [
            {
              "vars": [
                ["http_release_version", "==", "小奏技术"]
              ]
            }
          ],
          "weighted_upstreams": [
            {
              "upstream_id": "search_gray_upstream_id",
              "weight": 10
            }
          ]
        },
        {
          "match": [
            {
              "vars": []
            }
          ],
          "weighted_upstreams": [
            {
              "upstream_id": "search_upstream_id",
              "weight": 90
            },
            {
              "upstream_id": "search_gray_upstream_id",
              "weight": 10
            }
          ]
        }
      ]
    }
  }
}

注意这里我们配置了两条规则

  1. 第一条规则是针对带有特定 HTTP 头 http_release_version 等于 小奏技术 的请求。这些请求将被100%路由到新版本的 search_gray 服务。
  2. 第二条规则是默认规则,适用于所有其他请求。在这个例子中,我们将90%的流量路由到旧版本的 search 服务,将10%的流量路由到灰度的 search 服务

注意原生的traffic-split插件比较简陋,不支持uid这种自定义参数,需要自己开发,自定义请求头参数仅支持http_开头的,比如http_x_user_id

总结

总的来说基于apisix实现灰度发布还是比较简单的,实现方式有多种,区别主要还是kubernetes中是多个service还是单个service

相对来说多serviceapisix更推荐的做法,也能更精准控制流量。

但是相对于java传统的比如spring clouddubbo这些服务发现框架来说都是单service的元数据管理不太一样

所以后续要实现全链路灰度可能会有比较大的不同

相关推荐
我是华为OD~HR~栗栗呀24 分钟前
华为OD-Java面经-21届考研
java·c++·后端·python·华为od·华为·面试
考虑考虑33 分钟前
流收集器
java·后端·java ee
睡不醒的猪儿2 小时前
k8s部署自动化工具jenkins
云原生·kubernetes·自动化·jenkins
野犬寒鸦2 小时前
从零起步学习MySQL || 第十章:深入了解B+树及B+树的性能优势(结合底层数据结构与数据库设计深度解析)
java·数据库·后端·mysql·1024程序员节
上进小菜猪2 小时前
智能信创新范式:浙江省人民医院的全栈国产化与智能数据底座实践
后端
没有bug.的程序员3 小时前
Spring 常见问题与调试技巧
java·后端·spring·动态代理·1024程序员节
黎燃3 小时前
构筑自主可控医疗生态-数智融合新引擎-医疗全栈信创跃迁
后端
R.lin4 小时前
OSS服务模块-基于数据库配置的Java OSS服务解决方案,支持MinIO、七牛云、阿里云和腾讯云
java·数据库·后端·mysql
R.lin4 小时前
使用 Undertow 替代 Tomcat
java·后端·tomcat