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

这篇具有很好参考价值的文章主要介绍了基于Spring Gateway路由判断器实现各种灰度发布场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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: app
  uri: lb://app-service
  predicates:
    - Path=/app/**
  filters:
    - StripPrefix=1

访问10次,两个服务分别占50%流量。
基于Spring Gateway路由判断器实现各种灰度发布场景,持续交付,java,spring,gateway,java

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

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

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

基于Spring Gateway路由判断器实现各种灰度发布场景,持续交付,java,spring,gateway,java

1.2 按人群划分实现的灰度

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

1.2.1 通过Header信息实现灰度

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

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

基于Spring Gateway路由判断器实现各种灰度发布场景,持续交付,java,spring,gateway,java

1.2.2 通过Query信息实现灰度

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

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

基于Spring Gateway路由判断器实现各种灰度发布场景,持续交付,java,spring,gateway,java

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

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

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

基于Spring Gateway路由判断器实现各种灰度发布场景,持续交付,java,spring,gateway,java

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_route
        uri: https://example.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

2.5. Header

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

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

2.6. Host

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

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

2.7. Method

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

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

2.8. Path

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

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - Query=green

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

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - 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_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - 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_route
        uri: https://example.org
        predicates:
        - XForwardedRemoteAddr=192.168.1.1/24

如果X-Forwarded-For报头包含192.168.1.10,则匹配些路由。文章来源地址https://www.toymoban.com/news/detail-684899.html

到了这里,关于基于Spring Gateway路由判断器实现各种灰度发布场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Gateway基于Nacos动态路由实现

    客户端请求,首先会被 Gateway Handler Mapping 处理,用以在  路由表  中查找一个与请求匹配的  路由 , 然后将请求交由  Web Handler  处理, Web Handler  维护了一个过滤器链,链式执行这些过滤器,这些过滤器在逻辑上存在两个执行阶段  pre   与  post   Nacos 致力于帮助您发现

    2024年02月06日
    浏览(24)
  • Spring Cloud 2022.x版本使用gateway和nacos实现动态路由和负载均衡

    Spring Cloud Alibaba官方:https://sca.aliyun.com/zh-cn/ Spring Cloud官网:https://spring.io/projects/spring-cloud Spring Cloud与Spring Cloud Alibaba版本对应说明:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain 下载地址:https://github.com/alibaba/nacos/releases 下载编译压缩并解压:nacos-server-2.2.3.zip。 1.1、

    2024年02月11日
    浏览(29)
  • 基于spring gateway 的静态资源缓存实现

    由于子项目比较多,子项目都是通过嵌套的方式实现的。就会导致子页面加载比较慢,影响客户体验 实现思路(AI搜的--!): 1、通过spring boot缓存实现静态资源缓存 2、在gateway过滤器,对静态资源进行缓存 直接上代码:

    2024年02月03日
    浏览(23)
  • 基于Spring-cloud-gateway实现全局日志记录

    最近项目在线上运行出现了一些难以复现的bug需要定位相应api的日志,通过nginx提供的api请求日志难以实现,于是在gateway通过全局过滤器记录api请求日志。 接受到用户请求后,经过全局过滤器,检验是否开启相应的日志配置及相应的黑白名单配置 在gateway前置处理如记录当前

    2024年02月11日
    浏览(46)
  • Istio入门体验系列——基于Istio的灰度发布实践

    导言:灰度发布是指在项目迭代的过程中用平滑过渡的方式进行发布。灰度发布可以保证整体系统的稳定性,在初始发布的时候就可以发现、调整问题,以保证其影响度。作为Istio体验系列的第一站,本文基于Istio的流量治理机制,针对最简单的几种业务场景进行了实践,为后

    2024年02月12日
    浏览(23)
  • springcloud+nacos实现灰度发布

    灰度发布实体 灰度发布上下文信息 灰度过滤器设置灰度上下文信息 灰度路由规则 gateway网关需要引入的pom 常量 服务路由规则 需要传递灰度版本号,所以需要把灰度版本请求参数传递下去,以及解决Hystrix的线程切换导致参数无法传递下的问题 使用TransmittableThreadLocal可以跨线

    2024年02月12日
    浏览(23)
  • 使用 KubeSphere 实现微服务的灰度发布

    今天来说一说,在 KubeSphere 中两个 \\\" 小姐姐 \\\" 如何来回切换,这是什么意思哩?其实就是互联网产品中常用的灰度发布方式。 互联网产品需要快速迭代上线,既要保证新功能运行正常,又要保证质量,一旦出现问题可以很快控制局面,就需要设计一套灰度发布系统。用大白话

    2024年02月20日
    浏览(33)
  • Spring Boot中使用thymeleaf以及各种取值,判断,选择,截取等方式

    Spring Boot支持FreeMarker、Groovy、Thymeleaf和Mustache四种模板解析引擎,官方推荐使用Thymeleaf。 spring-boot-starter-thymeleaf 在Spring Boot中使用Thymeleaf只需在pom中加入Thymeleaf的starter即可: 在Spring Boot 1.5.9.RELEASE版本中,默认的Thymeleaf版本为2.1.6.RELEASE版本,这里推荐使用3.0以上版本。在pom中

    2024年02月10日
    浏览(32)
  • 【Kubernetes】第十篇 - 灰度发布的介绍与实现

    前几篇,已经介绍了环境搭建、Deployment 部署对象、Service 服务、Ingress 路由转发; 本篇,介绍灰度发布的实现; 灰度发布,也叫金丝雀发布;是一种应用的发布方式; 金丝雀发布的命名:金丝雀对瓦斯气体非常敏感,矿工在下井前会先向井里放一只金丝雀,如果金丝雀不叫

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包