基于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请求的不同属性。可以将多个路由判断器与逻辑和语句组合在一起。
| 名称 | 说明 |
|---|---|
| After | After路由接受一个日期参数,匹配在指定日期时间之后发生的请求。 |
| Before | Before路由接受一个日期参数,匹配在指定日期时间之前发生的请求。 |
| Between | Between路由接受两个参数datetime1和datetime2,匹配在datetime1之后和datetime2之前发生的请求。 |
| Cookie | Cookie路由接受两个参数,Cookie名称和regexp(一个Java正则表达式),匹配具有给定名称且其值与正则表达式匹配的cookie。 |
| Header | Header路由接受两个参数:Header名称和regexp(一个Java正则表达式),匹配与具有给定名称且其值与正则表达式匹配的hearder。 |
| Host | Host路由接受一个参数:域名列表,匹配列表中的域名地址。 |
| Method | Method路由接受一个Http方法(GET、POST…)参数,该参数是一个或多个HTTP方法。 |
| Path | Path路由判断器接受两个参数:Spring PathMatcher模式列表和一个名为matchTrailingSlash的可选标志(默认为true)。 |
| Query | Query路由器接受两个参数:一个必需的参数和一个可选的regexp(它是一个Java正则表达式)。 |
| RemoteAddr | RemoteAddr路由器接受一个来源列表(至少1个),这些来源地址是IPv4或IPv6字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)。 |
| Weight | Weight路由器接受两个参数:group和Weight (int型),权重按组计算。 |
| 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地址列表时才允许请求。 |
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,则匹配些路由。
相关文章:
基于Spring Gateway路由判断器实现各种灰度发布场景
文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…...
mysql57、mysql80 目录结构 之 Windows
查看mysql 数据存储的位置 /bin:存储可执行文件,主要包含客户端和服务端启动程序,如mysql.exe、mysqld.exe等 /docs:存放一些文档 /include:用于放置一些头文件,如:mysql.h、mysqld_error.h 等 …...
Mac操作系统Safari 17全新升级:秋季推出全部特性
苹果的内置浏览器可能是Mac上最常用的应用程序(是的,甚至比Finder、超级Mac Geeks还要多)。因此,苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中,Safari可以帮助你提高工作效…...
UDP通信、本地套接字
#include <sys/types.h> #include <sys/socket > ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);- 参数:- sockfd : 通信的fd- buf : 要发送的数据- len : 发送数据的长度…...
ChatGPT提示与技巧分享:如何作出更好的提示2023年8月
对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT,成为AI工具专家的技巧。 毫无疑问,ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具(如智能对联、经典语录生…...
网络安全(自学黑客)一文全解
目录 特别声明:(文末附资料笔记工具) 一、前言 二、定义 三、分类 1.白帽黑客(White Hat Hacker) 2.黑帽黑客(Black Hat Hacker) 3.灰帽黑客(Gray Hat Hacker) 四…...
Vue中ElementUI结合transform使用时,发现弹框定位不准确问题
在近期开发中,需要将1920*1080放到更大像素大屏上演示,所以需要使用到transform来对页面进行缩放,但是此时发现弹框定位出错问题,无法准备定位到实际位置。 查看element-ui官方文档无果后,打算更换新的框架进行开发&am…...
(一)连续随机量的生成-基于分布函数
连续随机量的生成-基于分布函数 1. 概率积分变换方法(分布函数)2. Python编程实现指数分布的采样 1. 概率积分变换方法(分布函数) Consider drawing a random quantity X X X from a continuous probability distribution with …...
【springboot】Spring Cache缓存:
文章目录 一、导入Maven依赖:二、实现思路:三、代码开发: 一、导入Maven依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…...
数学建模-建模算法(4)
python虽然不是完全为数学建模而生的,但是它完整的库让它越来越适合建模了。 - 线性规划:使用scipy.optimize.linprog()函数 python from scipy.optimize import linprogc [-1, 4] A [[-3, 1], [1, 2]] b [6, 4] x0_bounds (None, None) x1_bound…...
python之函数返回数据框
1.原始文件 ##gff-version 3 Chr1A IWGSC_v2.1 gene 40098 70338 33 - . IDTraesCS1A03G0000200;previous_idTraesCS1A02G000100;primconfHC;NameTraesCS1A03G0000200;cdsCDS_OK;mappingfullMatchWithMissmatches Chr1A IWGSC_v2.1 mRN…...
电子商务安全体系架构技术方面
技术方面是本文所要阐述的主要方面,因为它能够依靠企业自 身的努力来达到令人满意的安全保障效果。目前,关于电子商务安全体系的研究比 较多,有基于层次的体系,也有基于对象的体系,还有基于风险管理的体系࿰…...
新安装IDEA 常用插件、设置
新安装IDEA 常用插件、设置 mybatiscodeHelperProRestfulToolkit-fixJrebelmybatis log freepojo to jsonGrep ConsoleMaven HelperCamelCaseCamelCase常用设置 mybatiscodeHelperPro mapper.xml 编码校验 sql 生成,代码生成 RestfulToolkit-fix URI 跳转到对应的…...
ChromeOS 的 Linux 操作系统和 Chrome 浏览器分离
导读科技媒体 Ars Technica 报道称,谷歌正在将 ChromeOS 的浏览器从操作系统中分离出来 —— 让它变得更像 Linux。虽然目前还没有任何官方消息,但这项变化可能会在本月的版本更新中推出。 据介绍,谷歌将该项目命名为 "Lacros"——…...
哔哩哔哩 B站 bilibili 视频倍速设置 视频倍速可自定义
目录 一、复制如下代码 二、在B站视频播放页面进入控制台 三、将复制的代码粘贴到下方输入框,并 回车Enter 即可 四、然后就可以了 一、复制如下代码 (该代码用于设置倍速为3,最后的数值是多少就是多少倍速,可以带小数点&#…...
Lazada商品详情接口 获取Lazada商品详情数据 Lazada商品价格接
一、引言 随着电子商务的迅速发展和普及,电商平台之间的竞争也日趋激烈。为了提供更好的用户体验和更高效的后端管理,Lazada作为东南亚最大的电商平台之一,开发了一种商品详情接口(Product Detail API)。该接口允许第…...
路由攻击(ospf attack)及C/C++代码实现
开放式最短路径优先(OSPF)是应用最广泛的域内路由协议之一。不幸的是,它有许多严重的安全问题。OSPF上的伪造是可能导致路由循环和黑洞的最关键的漏洞之一。 大多数已知的OSPF攻击基于伪造攻击者控制的路由器的链路状态通告(LSA&…...
nginx配置站点强制开启https
当站点域名配置完SSL证书后,如果要强制开启HTTPS,可以在站点配置文件中加上: #HTTP_TO_HTTPS_START if ($server_port !~ 443){rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END 附上完整的配置完SSL证书,强制…...
Jacoco XML 解析
1 XML解析器对比 1. DOM解析器: ○ 优点:易于使用,提供完整的文档树,可以方便地修改和遍历XML文档。 ○ 缺点:对大型文档消耗内存较多,加载整个文档可能会变慢。 ○ 适用场景:适合小型XML文档…...
【面试题】JDK(工具包)、JRE(运行环境和基础库)、JVM(java虚拟机)之间的关系?
【面试题】JDK、JRE、JVM之间的关系? JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。 JRE(Java Runtime Environment):Java运行时环境&…...
Windows使用Powershell自动安装SqlServer2025服务器与SSMS管理工具
下载地址: https://www.microsoft.com/zh-cn/evalcenter/evaluate-sql-server-2025 安装结果: 安装前准备: 1.下载mssql server 2025安装器 2.下载iso镜像 3.下载好SSMS安装程序,并放到iso同目录下...
注意力机制:多头注意力机制、分组查询注意力机制、多查询注意力机制理论+代码
文章目录导语1.注意力机制2.多头注意力机制3.多查询注意力机制4.分组查询注意力机制5.三者对比导语 注意力机制作为transformer体系中最核心的方法,是NLP、LLM等都绕不开的一部分,多头注意力机制是transformer模型提出的“基石”,分组查询注…...
Marshall新款Milton ANC头戴式耳机来袭:音质续航皆优,售价229美元!
Marshall推出新款Milton ANC头戴式耳机Marshall推出了最新款头戴式耳机——Milton ANC。这款耳机在音质、耐用性和电池续航方面都毫不妥协,售价为229美元。耳机特点与升级Marshall宣布推出全新的头戴式耳机Milton ANC。它承诺在不牺牲电池续航的前提下,带…...
使用TaotokenCLI工具一键配置开发环境与模型密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken CLI工具一键配置开发环境与模型密钥 在接入大模型进行开发时,手动配置API密钥、Base URL和模型ID是常见的…...
VMware虚拟机安装及配置
密码 # 设置 root 用户密码 sudo passwd root修改国内镜像源 在 Ubuntu 24.04 之前,Ubuntu 的软件源配置文件路径为 /etc/apt/sources.list;从 Ubuntu 24.04 开始,Ubuntu 的软件源配置文件变更为 DEB822 格式,路径为 /etc/apt/so…...
1987年5月10日晚上23-24点出生性格、运势和命运
出生在下午13-15点这一时段,从心理发展角度来看,最大的性格红利是“社交直觉”。这类人往往在很小的时候就展现出一种能力:能快速识别他人的情绪,并自然地调整自己的行为以促进和谐。这并非玄学,而是因为下午出生婴儿的…...
Autosar Crypto Driver配置避坑指南:从CryptoPrimitive到CryptoKeyType,手把手教你配出安全又高效的加密服务
AUTOSAR Crypto Driver实战配置:从算法选型到密钥管理的安全工程实践 在汽车电子系统开发中,加密服务已成为保障车载通信安全的核心组件。AUTOSAR标准定义的Crypto Driver模块为开发者提供了统一的加密接口,但实际配置过程中,工程…...
如何免费解锁网易云音乐无损音质:5个步骤掌握Netease_url终极工具
如何免费解锁网易云音乐无损音质:5个步骤掌握Netease_url终极工具 【免费下载链接】Netease_url 网易云无损解析 项目地址: https://gitcode.com/gh_mirrors/ne/Netease_url 还在为网易云音乐的无损音质限制而烦恼吗?想要轻松获取高品质音乐资源却…...
设计师私藏的11个纹理Prompt原子模块(仅限本周开放下载:含PBR贴图映射表+光照反射系数速查卡)
更多请点击: https://intelliparadigm.com 第一章:纹理Prompt原子模块的设计哲学与底层逻辑 纹理Prompt原子模块并非简单拼接关键词的字符串生成器,而是以认知建模为根基、以可组合性为约束、以语义保真度为校验目标的结构化表达系统。其设计…...
如何用NVIDIA Profile Inspector解锁显卡隐藏性能:终极配置指南
如何用NVIDIA Profile Inspector解锁显卡隐藏性能:终极配置指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款强大的显卡驱动深度配置工具,能够…...
