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的元数据管理不太一样

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

相关推荐
烛阴5 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
服务端技术栈5 小时前
电商营销系统中的幂等性设计:从抽奖积分发放谈起
后端
Chan165 小时前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
你的人类朋友6 小时前
✍️Node.js CMS框架概述:Directus与Strapi详解
javascript·后端·node.js
面朝大海,春不暖,花不开6 小时前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
钡铼技术ARM工业边缘计算机6 小时前
【成本降40%·性能翻倍】RK3588边缘控制器在安防联动系统的升级路径
后端
2201_761199047 小时前
k8s4部署
云原生·容器·kubernetes
慌ZHANG7 小时前
云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解
云原生
CryptoPP7 小时前
使用WebSocket实时获取印度股票数据源(无调用次数限制)实战
后端·python·websocket·网络协议·区块链
白宇横流学长7 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端