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 插件可以通过配置match 和 weighted_upstreams 属性,从而动态地将部分流量引导至各种上游服务。该插件可应用于灰度发布和蓝绿发布的场景

举个🌰

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

  • search
  • search-gray

对应的也是两个kubernetes的 service

  • 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

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

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

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

相关推荐
高频因子挖掘机16 分钟前
量化回测应该保存不复权数据吗?从数据口径到收益计算的工程实践
后端·github·api
高频因子挖掘机1 小时前
实时行情为什么不应该逐只股票请求?批量查询与标的池管理实践
后端·github·api
程序猿DD6 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i9 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8269 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林10 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne11 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF12 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li12 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala13 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端