基于Spring Gateway路由判断器实现各种灰度发布场景

文章目录

    • 1、灰度发布实现
      • 1.1 按随机用户的流量百分比实现灰度
      • 1.2 按人群划分实现的灰度
        • 1.2.1 通过Header信息实现灰度
        • 1.2.2 通过Query信息实现灰度
        • 1.2.3 通过RemoteAdd判断来源IP实现灰度
    • 2、路由判断器
      • 2.1. After
      • 2.2. Before
      • 2.3. Between
      • 2.4. Cookie
      • 2.5. Header
      • 2.6. Host
      • 2.7. Method
      • 2.8. Path
      • 2.9. Query
      • 2.10. RemoteAddr
      • 2.11. Weight
      • 2.12. XForwarded Remote Addr

1、灰度发布实现

以前使用APISIX实现过灰度发布《jenkins与apisix整合,实现自动化部署与负载均衡、灰度发布(蓝绿发布)》
同样可以使用Spring Gateway实现类似灰度功能。本文使用前文的示例代码《Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡》来演示效果
app1和app2两个工程都增加一个version接口

示例代码如下:

// app1工程,版本1.0
private static int count = 0;
@GetMapping("/version")
public Map<String, Object> version(){Map<String, Object> data = new HashMap<>();data.put("visit_count", ++count);data.put("version", "1.0");data.put("service", "app1");return data;}
// app2工程,版本1.0
private static int count = 0;
@GetMapping("/version")
public Map<String, Object> version(){Map<String, Object> data = new HashMap<>();data.put("visit_count", ++count);data.put("version", "1.0");data.put("service", "app2");return data;}

正常负载均衡时nacos里gatewayapp.yml路由配置

- id: appuri: lb://app-servicepredicates:- Path=/app/**filters:- StripPrefix=1

访问10次,两个服务分别占50%流量。
在这里插入图片描述

1.1 按随机用户的流量百分比实现灰度

app2发布新版本,此时接口代码的版本号修改为1.1。
对访问的用户,随机分配流量,新版本流量占20%,旧版本流量占80%,使用Gateway的Weight路由判断器来实现。Nacos的路由配置修改为:

- id: app_grayuri: http://localhost:9092predicates:- Path=/app/**- Weight=group1, 20filters:- StripPrefix=1
- id: appuri: http://localhost:9091predicates:- Path=/app/**- Weight=group1, 80filters:- StripPrefix=1

在这里插入图片描述

1.2 按人群划分实现的灰度

按用户id、用户ip等方式实现的灰度,一般用户属性信息可以放在Header、Cookie、请求参数。可以通过路由判断器Cookie、Header、Query、RemoteAddr、XForwardedRemoteAddr判断属性值是否进入灰度环境

1.2.1 通过Header信息实现灰度

用户id<100访问,进入灰度新版本,其他用户进入旧版本,Nacos的路由配置修改为:

spring:cloud:gateway:routes:- id: app_grayuri: http://localhost:9092predicates:- Header=userid, ^([1-9][0-9]?)$- Path=/app/**filters:- StripPrefix=1- id: appuri: http://localhost:9091predicates:- Path=/app/**filters:- StripPrefix=1

在这里插入图片描述

1.2.2 通过Query信息实现灰度

用户id<100访问,进入灰度新版本,其他用户进入旧版本,Nacos的路由配置修改为:

spring:cloud:gateway:routes:- id: app_grayuri: http://localhost:9092predicates:- Query=userid, ^([1-9][0-9]?)$- Path=/app/**filters:- StripPrefix=1- id: appuri: http://localhost:9091predicates:- Path=/app/**filters:- StripPrefix=1

在这里插入图片描述

1.2.3 通过RemoteAdd判断来源IP实现灰度

只允许ip=192.168.76.128的访问,进入灰度新版本,其他用户进入旧版本,Nacos的路由配置修改为:

spring:cloud:gateway:routes:- id: app_grayuri: http://localhost:9092predicates:- RemoteAddr=192.168.76.128/24- Path=/app/**filters:- StripPrefix=1- id: appuri: http://localhost:9091predicates:- Path=/app/**filters:- StripPrefix=1

在这里插入图片描述

2、路由判断器

Spring Cloud Gateway包括许多内置的路由判断器,官方介绍https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

这些路由判断器匹配HTTP请求的不同属性。可以将多个路由判断器与逻辑和语句组合在一起。

名称说明
AfterAfter路由接受一个日期参数,匹配在指定日期时间之后发生的请求。
BeforeBefore路由接受一个日期参数,匹配在指定日期时间之前发生的请求。
BetweenBetween路由接受两个参数datetime1和datetime2,匹配在datetime1之后和datetime2之前发生的请求。
CookieCookie路由接受两个参数,Cookie名称和regexp(一个Java正则表达式),匹配具有给定名称且其值与正则表达式匹配的cookie。
HeaderHeader路由接受两个参数:Header名称和regexp(一个Java正则表达式),匹配与具有给定名称且其值与正则表达式匹配的hearder。
HostHost路由接受一个参数:域名列表,匹配列表中的域名地址。
MethodMethod路由接受一个Http方法(GET、POST…)参数,该参数是一个或多个HTTP方法。
PathPath路由判断器接受两个参数:Spring PathMatcher模式列表和一个名为matchTrailingSlash的可选标志(默认为true)。
QueryQuery路由器接受两个参数:一个必需的参数和一个可选的regexp(它是一个Java正则表达式)。
RemoteAddrRemoteAddr路由器接受一个来源列表(至少1个),这些来源地址是IPv4或IPv6字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。
WeightWeight路由器接受两个参数:group和Weight (int型),权重按组计算。
XForwarded Remote AddrXForwarded Remote Addr路由判断器接受一个来源列表(至少1个),这些来源地址IPv4或IPv6字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。
此路由器基于HTTP头X-Forwarded-For过滤请求。 可以与反向代理一起使用,例如负载平衡器或web应用程序防火墙,其中只有当请求来自这些反向代理使用的受信任IP地址列表时才允许请求。

2.1. After

After路由判断器接受一个日期参数,匹配在指定日期时间之后发生的请求。

spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]

This route matches any request made after Jan 20, 2017 17:42 Mountain Time (Denver).

2.2. Before

Before路由判断器接受一个日期参数,匹配在指定日期时间之前发生的请求。

spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]

2.3. Between

Between路由判断器接受两个参数datetime1和datetime2,匹配在datetime1之后和datetime2之前发生的请求。

spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

2.4. Cookie

Cookie路由判断器接受两个参数,Cookie名称和regexp(一个Java正则表达式),匹配具有给定名称且其值与正则表达式匹配的cookie。

spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p

2.5. Header

Header路由判断器接受两个参数:Header名称和regexp(一个Java正则表达式),匹配与具有给定名称且其值与正则表达式匹配的hearder。

spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+

2.6. Host

Host路由判断器接受一个参数:域名列表,匹配列表中的域名地址。

spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org

2.7. Method

Method路由判断器接受一个Http方法(GET、POST…)参数,该参数是一个或多个HTTP方法。

spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST

2.8. Path

Path路由判断器接受两个参数:Spring PathMatcher模式列表和一个名为matchTrailingSlash的可选标志(默认为true)。

spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}

此路由将匹配路径/red/1、/red/1/、/red/blue、/blue/green。
如果matchTrailingSlash设置为false,那么请求路径/red/1/将不匹配。

2.9. Query

Query路由判断器接受两个参数:一个必需的参数和一个可选的regexp(它是一个Java正则表达式)。

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=green

如果请求中包含绿色查询参数,则匹配上述路由。
此路由匹配包含参数名为green的请求,比如https://www.test.com?green=1

spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.

此路由匹配参数名为red,值为gree.(正则匹配,比如green、greet都会匹配),

2.10. RemoteAddr

RemoteAddr路由器接受一个来源列表(至少1个),这些来源地址是IPv4或IPv6字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。

spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24

如果请求的客户端地址为192.168.1.10,则符合路由匹配。

注意:如果Spring Cloud Gateway位于代理层后面,可能无法获取真实的客户端IP地址。可以通过设置一个自定义的RemoteAddressResolver来自定义远程地址解析的方式。Spring Cloud Gateway提供了一个非默认的远程地址解析器,它基于X-Forwarded-For报头,即XForwardedRemoteAddressResolver。

RemoteAddressResolver resolver = XForwardedRemoteAddressResolver.maxTrustedIndex(1);....route("direct-route",r -> r.remoteAddr("10.1.1.1", "10.10.1.1/24").uri("https://downstream1")
.route("proxied-route",r -> r.remoteAddr(resolver, "10.10.1.1", "10.10.1.1/24").uri("https://downstream2")
)

2.11. Weight

Weight路由器接受两个参数:group和Weight (int型),权重按组计算。

spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2

这条路由将把80%的流量转发给weighthigh.org, 20%的流量转发给weighlow.org

2.12. XForwarded Remote Addr

XForwarded Remote Addr路由判断器接受一个来源列表(至少1个),这些来源地址IPv4或IPv6字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。
此路由器基于HTTP头X-Forwarded-For过滤请求。
可以与反向代理一起使用,例如负载平衡器或web应用程序防火墙,其中只有当请求来自这些反向代理使用的受信任IP地址列表时才允许请求。

spring:cloud:gateway:routes:- id: xforwarded_remoteaddr_routeuri: https://example.orgpredicates:- XForwardedRemoteAddr=192.168.1.1/24

如果X-Forwarded-For报头包含192.168.1.10,则匹配些路由。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/94067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThePASS研究院|以Safe为例,解码DAO国库管理

本研究文章由ThePASS团队呈现。ThePASS是一家开创性的DAO聚合器和搜索引擎&#xff0c;在为DAO提供洞察力和分析方面发挥着关键作用。 Intro 随着去中心化自治组织&#xff08;DAOs&#xff09;的发展&#xff0c;它们被赋予了越来越多的角色和期望。在这种巨幅增长的背景下&…

数据结构入门 — 队列

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…

华硕笔记本摄像头倒置怎么办?华硕笔记本摄像头上下颠倒怎么调整

笔记本电脑相较于台式电脑&#xff0c;更易携带&#xff0c;解决了很大一部分人的使用需求。但是笔记本电脑也存在很多不足&#xff0c;比如华硕笔记本电脑就经常会出现摄像头倒置的错误&#xff0c;出现这种问题要如何修复呢&#xff1f;下面就来看看详细的调整方法。 华硕笔记…

【目标检测】理论篇(2)YOLOv3网络构架及其代码实现

网络构架图&#xff1a; 代码实现&#xff1a; import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数&#xff0c;然后利用一个3x3卷…

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)

以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。

机器人中的数值优化(五)——信赖域方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

代码随想录笔记--字符串篇

目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 1--反转字符串 主要思路&#xff1a; 双指针算法&#xff0c;交换两个指针的字符&#xff1b; #include <iostream> #include <vector>class Solution { public:void…

SpringCloudAlibaba常用组件

SpringCloudAlibaba常用组件 微服务概念 1.1 单体、分布式、集群 单体 ⼀个系统业务量很⼩的时候所有的代码都放在⼀个项⽬中就好了&#xff0c;然后这个项⽬部署在⼀台服务器上就 好了。整个项⽬所有的服务都由这台服务器提供。这就是单机结构。 单体应⽤开发简单,部署测试…

js 正则表达式 验证 :页面中一个输入框,可输入1个或多个vid/pid,使用英文逗号隔开...

就是意思一个输入框里面&#xff0c;按VID/PID格式输入,VID和PID最大长度是4,最多50组 1、页面代码 <el-form ref"ruleForm" :model"tempSet" :rules"rules" label-position"right"> <!-- 最多 50组&#xff0c;每组9个字符…

栈和队列篇

目录 一、栈 1.栈的概念及结构 1.1栈的概念 1.2栈的结构示意图 2.栈的实现 2.1支持动态增长的栈的结构 2.2压栈&#xff08;入栈&#xff09; 2.3出栈 2.4支持动态增长的栈的代码实现 二、队列 1.队列的概念及结构 1.1队列的概念 1.2队列的结构示意图 2.队列的实…

自动化运维工具-------Ansible(超详细)

一、Ansible相关 1、简介 Ansible是自动化运维工具&#xff0c;基于Python开发&#xff0c;分布式,无需客户端,轻量级&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能&#xff0c;ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是a…

说说IO多路复用

分析&回答 IO多路复用 I/O multiplexing 这里面的 multiplexing 指的其实是在单个线程通过记录跟踪每一个Sock(I/O流)的状态(对应空管塔里面的Fight progress strip槽)来同时管理多个I/O流。直白点说&#xff1a;多路指的是多个socket连接&#xff0c;复用指的是复用一个…