当前位置:   article > 正文

SpringCloud Alibaba 2021微服务实战十一 Springcloud alibaba整合gateway应用之路由_springcloud alibaba 2021 gateway

springcloud alibaba 2021 gateway

SpringCloud Alibaba 2021微服务实战十一 Springcloud alibaba整合gateway

 

1.前言

之前学习了nacos,sentinel,并对sentinel进行了持久化改造。现在轮到了gateway了

本文使用版本为

  • SpringCloud 版本2020.0.2
  • spring-cloud-starter-gateway版本3.0.2
  • spring-boot-starter版本2.4.4

2.gateWay简介

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul 网关。网关作为流量的,在微服务系统中有着非常作用。 注:由于不是Sevlet容器,所以他不能打成war包, 只支持SpringBoot2.X不 支持1.x.

该项目提供了一个用于在Spring WebFlux之上构建API网关的库。 Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域的关注点,例如:安全性,监视/指标和弹性。

特征

  • 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上

  • 能够匹配任何请求属性上的路由。

  • 谓词和过滤器特定于路由。

  • 断路器集成。

  • Spring Cloud DiscoveryClient集成

  • 易于编写的谓词和过滤器

  • 请求速率限制

  • 路径改写

网关作用: 路由转发、权限校验、限流控制等作用

没有网关:

 

使用网关:

概念

什么是路由? 路由是构建网关的基本模块,由ID,目标URI,一系列的断言和过滤器组成,如果断言为true,则匹配该路由 什么是断言? 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由 什么是过滤? 值得是Spring框架中GatewayFilter的实例,使用过滤器,可以使请求在被路由前/后进行修改

Route(路由):路由是网关的基本单元,由ID、URI、一组Predicate、一组Filter组成,根据Predicate进行匹配转发。

源码

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5. package org.springframework.cloud.gateway.route;
  6. import java.net.URI;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.Objects;
  12. import javax.validation.Valid;
  13. import javax.validation.ValidationException;
  14. import javax.validation.constraints.NotEmpty;
  15. import javax.validation.constraints.NotNull;
  16. import org.springframework.cloud.gateway.filter.FilterDefinition;
  17. import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
  18. import org.springframework.util.StringUtils;
  19. import org.springframework.validation.annotation.Validated;
  20. @Validated
  21. public class RouteDefinition {
  22. private String id;
  23. @NotEmpty
  24. @Valid
  25. private List<PredicateDefinition> predicates = new ArrayList();
  26. @Valid
  27. private List<FilterDefinition> filters = new ArrayList();
  28. @NotNull
  29. private URI uri;
  30. private Map<String, Object> metadata = new HashMap();
  31. private int order = 0;
  32. public RouteDefinition() {
  33. }
  34. public RouteDefinition(String text) {
  35. int eqIdx = text.indexOf(61);
  36. if (eqIdx <= 0) {
  37. throw new ValidationException("Unable to parse RouteDefinition text '" + text + "', must be of the form name=value");
  38. } else {
  39. this.setId(text.substring(0, eqIdx));
  40. String[] args = StringUtils.tokenizeToStringArray(text.substring(eqIdx + 1), ",");
  41. this.setUri(URI.create(args[0]));
  42. for(int i = 1; i < args.length; ++i) {
  43. this.predicates.add(new PredicateDefinition(args[i]));
  44. }
  45. }
  46. }
  47. public String getId() {
  48. return this.id;
  49. }
  50. public void setId(String id) {
  51. this.id = id;
  52. }
  53. public List<PredicateDefinition> getPredicates() {
  54. return this.predicates;
  55. }
  56. public void setPredicates(List<PredicateDefinition> predicates) {
  57. this.predicates = predicates;
  58. }
  59. public List<FilterDefinition> getFilters() {
  60. return this.filters;
  61. }
  62. public void setFilters(List<FilterDefinition> filters) {
  63. this.filters = filters;
  64. }
  65. public URI getUri() {
  66. return this.uri;
  67. }
  68. public void setUri(URI uri) {
  69. this.uri = uri;
  70. }
  71. public int getOrder() {
  72. return this.order;
  73. }
  74. public void setOrder(int order) {
  75. this.order = order;
  76. }
  77. public Map<String, Object> getMetadata() {
  78. return this.metadata;
  79. }
  80. public void setMetadata(Map<String, Object> metadata) {
  81. this.metadata = metadata;
  82. }
  83. public boolean equals(Object o) {
  84. if (this == o) {
  85. return true;
  86. } else if (o != null && this.getClass() == o.getClass()) {
  87. RouteDefinition that = (RouteDefinition)o;
  88. return this.order == that.order && Objects.equals(this.id, that.id) && Objects.equals(this.predicates, that.predicates) && Objects.equals(this.filters, that.filters) && Objects.equals(this.uri, that.uri) && Objects.equals(this.metadata, that.metadata);
  89. } else {
  90. return false;
  91. }
  92. }
  93. public int hashCode() {
  94. return Objects.hash(new Object[]{this.id, this.predicates, this.filters, this.uri, this.metadata, this.order});
  95. }
  96. public String toString() {
  97. return "RouteDefinition{id='" + this.id + '\'' + ", predicates=" + this.predicates + ", filters=" + this.filters + ", uri=" + this.uri + ", order=" + this.order + ", metadata=" + this.metadata + '}';
  98. }
  99. }

Spring Cloud GateWay 工作流程如下所示

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。此处理程序运行时通过特定于请求的筛选链发送请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前或之后执行逻辑。执行所有“预”过滤逻辑,然后发出代理请求。在发出代理请求后,将执行“post”过滤器逻辑。

 

然后让我们先通过几个小demo先了解一下gateway的大概使用,然后我们在深入了解更多相关知识,这样比较容易理解。

pom

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  8. </dependency>

yml

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. uri: lb://payment-service
  18. #uri: http://localhost:8070
  19. predicates:
  20. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  21. #- After=2017-01-20T17:42:47.789-07:00[America/Denver]
  22. #- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Cookie=username,zzyy
  24. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  25. #- Host=**.atguigu.com
  26. #- Method=GET
  27. #- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  28. # 过滤
  29. #filters:
  30. # - AddRequestHeader=X-Request-red, blue
  31. #- id: payment_route2
  32. # uri: http://localhost:8001
  33. # predicates:
  34. #Path=/payment/lb/** #断言,路径相匹配的进行路由

启动类

  1. package com.liu.learn;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient
  7. public class GatewayApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(GatewayApplication.class, args);
  10. }
  11. }

理解  predicates:断言,加入访问路径符合/payment/get/** 格式便会转发到uri配置的服务下

uri: lb://payment-service 例如我们访问

http://localhost:9090/payment/get/31 便会转发到http://localhost:8070/payment/get/31 提供服务。

下面详细介绍:断言

 

至此我们应该对gateway的使用方法有个大体的了解和印象了,然后让我们继续学习相关知识。

断言(Predicate)

开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
也就是我们进行路由跳转的条件。官方文档:
https://docs.spring.io/spring-cloud-gateway/docs/3.0.2/reference/html/#gateway-request-predicates-factories

在之前我们的配置中使用了如下Path 这样一种断言。

- Path=/payment/get/**

 

但是实际上我们还有好多种断言,我们可以通过官方文档查询到,可以看我下面的连接,但是最好自己去官网找到自己响应版本的文档看(以后版本会不会出新的断言),并且官方文档有响应的例子以及解释。
https://docs.spring.io/spring-cloud-gateway/docs/3.0.2/reference/html/#gateway-request-predicates-factories
在我们的gateway服务启动时候,控制台业务打印出来我们断言的方式。
左图官方文档,右图启动控制台信息。

image.pngimage.png

Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分。 Spring Cloud Gateway包括许多内置的路由断言工厂。所有这些谓词都与HTTP请求的不同属性匹配。您可以将多个路由断言工厂与逻辑和语句结合使用。

断言种类:

After

该断言匹配在指定日期时间之后发生的请求。

- After=2021-04-20T17:42:47.789-07:00[America/Denver]

Before

该断言匹配在指定日期时间之前发生的请求。

- Before=2021-06-20T17:42:47.789-07:00[America/Denver]

Between 该断言匹配在两个指定日期时间之间发生的请求。

- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2021-01-21T17:42:47.789-07:00[America/Denver]

Cookie

该断言采用两个参数,即cookie名称和一个regexp(这是Java正则表达式)。该断言匹配具有给定名称且其值与正则表达式匹配的cookie。

- Cookie=chocolate, ch.p

Header

该断言采用两个参数,header名称和一个regexp(这是Java正则表达式)。该断言与具有给定名称的header匹配,该header的值与正则表达式匹配。

- Header=X-Request-Id, \d+

Host

该断言采用一个参数:主机名模式列表。该模式是带有的Ant样式的模式。作为分隔符。

该断言匹配与模式匹配的Host标头。

- Host=**.somehost.org,**.anotherhost.org

Method

该断言采用方法参数,该参数是一个或多个参数:要匹配的HTTP方法。

- Method=GET,POST

Path

该断言采用两个参数:Spring PathMatcher模式列表和一个称为matchTrailingSlash的可选标志(默认为true)。

- Path=/red/{segment},/blue/{segment}

Query

该断言采用两个参数:必需的参数和可选的regexp(这是Java正则表达式)。如果请求包含匹配配置的查询参数,则路由匹配。

- Query=green

RemoteAddr

该断言采用sources列表(最小大小为1),这些源是CIDR标记(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,而16是子网掩码) )。

- RemoteAddr=192.168.1.1/24

ReadBody

文档中没写这个,但是启动的时候控制台显示了,RoutePredicateFactory的实现类ReadBodyRoutePredicateFactory写了一点注释。断言可读取主体并应用用户提供的断言在主体上运行。

主体被缓存在内存中,因此后续对断言的调用无需再次反序列化。

Weight

文档中没写这个,但是启动的时候控制台显示了,RoutePredicateFactory的实现类WeightRoutePredicateFactory也没写啥注释

 

下面对各个断言进行介绍:

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. uri: lb://payment-service
  18. #uri: http://localhost:8070
  19. predicates:
  20. - Path=/payment/get/** # 断言,路径相匹配的进行路由
uri: lb://payment-service 此处服务名一定不要包含字母 大小写 - 横杠以外的字符

先来解释下route的组成部分:

  • id:路由的ID
  • uri:匹配路由的转发地址
  • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

在上面的配置中,当访问http://localhost:9090/payment/get/21

时就会被自动转发到http://localhost:8070/payment/get/31, 这里要注意完全匹配Path的值时才会进行路由转发。

此处可为

  1. uri: lb://payment-service
  2. #uri: http://localhost:8070 若写为lb格式,服务名为注册中心服务名,若 多个服务可以负载均衡,底下的为服务器地址写死的,但此处写死更容易讲解

 

Before 方式匹配转发

当部署有访问时间限制的接口时,我们可以通过Before Predicate来完成某一个时间点之前允许访问,过时后则不允许转发请求到具体的服务,配置如下所示:

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. - Before=2022-01-20T17:42:47.789-07:00[America/Denver]

官网:

Example 2. application.yml

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: before_route
  6. uri: https://example.org
  7. predicates:
  8. - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

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

 在上面配置中,我们允许2022-01-20日凌晨之前通过路由转发到

http://localhost:8070进行处理

通过查看org.springframework.cloud.gateway.handler.predicate.BeforeRoutePredicateFactory源码我们发现,Spring Cloud GatewayBefore断言采用的ZonedDateTime进行匹配时间,这里要注意存在时区的问题,需要配置[Asia/Shanghai]作为中国时区。

After 方式匹配转发

After PredicateBefore配置使用一致,匹配某一个时间点之后允许路由转发

Between 方式匹配转发

那如果是一个时间段内允许请求转发,通过BeforeAfter组合配置也可以完成,不过Spring Cloud Gateway还是提供了Between方式,如下所示:

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: payment_route
  6. uri: lb://payment-service
  7. predicates:
  8. - Between=2019-04-29T00:00:00+08:00[Asia/Shanghai], 2019-05-01T00:00:00+08:00[Asia/Shanghai]

 

在上面配置中,允许在2019-04-29日凌晨后 & 2019-05-01凌晨之前请求转发

Cookie 方式匹配转发

Spring Cloud Gateway 还提供了根据Cookie值的方式匹配转发请求,如果请求中所携带的Cookie值与配置的Predicate匹配,那么就可以被允许转发到指定地址,如下所示:

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. #- Path=/payment/get/** # 断言,路径相匹配的进行路由
  22. #- After=2021-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Before=2022-01-20T17:42:47.789-07:00[America/Denver]
  24. - Cookie=username,liu
  25. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  26. #- Host=**.atguigu.com
  27. #- Method=GET
  28. #- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  29. # 过滤
  30. #filters:
  31. # - AddRequestHeader=X-Request-red, blue
  32. #- id: payment_route2
  33. # uri: http://localhost:8001
  34. # predicates:
  35. #Path=/payment/lb/** #断言,路径相匹配的进行路由

 

测试Cookie方式转发:

curl http://localhost:9090 --cookie "username=liu"

通过上面方式我们是可以成功转发请求的,如果我们修改Cookie的值,就会导致无法转发,出现错误。

 

Header 方式匹配转发

Spring Cloud Gateway可以根据发送请求的Header信息进行匹配转发,加入我们可以根据X-Request-Id的值进行匹配,如下所示:

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. #- Path=/payment/get/** # 断言,路径相匹配的进行路由
  22. #- After=2021-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Before=2022-01-20T17:42:47.789-07:00[America/Denver]
  24. #- Cookie=username,liu
  25. - Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  26. #- Host=**.atguigu.com
  27. #- Method=GET
  28. #- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  29. # 过滤
  30. #filters:
  31. # - AddRequestHeader=X-Request-red, blue
  32. #- id: payment_route2
  33. # uri: http://localhost:8001
  34. # predicates:
  35. #Path=/payment/lb/** #断言,路径相匹配的进行路由

 

在上面配置中,如果X-Request-Id的值为数字,那么就可以转发

 

Host 方式匹配转发

Spring Cloud Gateway可以根据Host主机名进行匹配转发,如果我们的接口只允许**.liuliu.com域名进行访问,那么配置如下所示:

 

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. #- Path=/payment/get/** # 断言,路径相匹配的进行路由
  22. #- After=2021-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Before=2022-01-20T17:42:47.789-07:00[America/Denver]
  24. #- Cookie=username,liu
  25. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  26. - Host=**.baidu.com
  27. #- Method=GET
  28. #- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  29. # 过滤
  30. #filters:
  31. # - AddRequestHeader=X-Request-red, blue
  32. #- id: payment_route2
  33. # uri: http://localhost:8001
  34. # predicates:
  35. #Path=/payment/lb/** #断言,路径相匹配的进行路由
  1. 1. curl http://localhost:9090 -H "Host: baidu.com" // 匹配
  2. 2. curl http://localhost:9090 -H "Host: api.baidu.com" // 匹配
  3. 3. curl http://localhost:9090 -H "Host: admin.baidu.com" // 匹配
  4. 3. curl http://localhost:9090 -H "Host: biiiii.com" // 不匹配

 

请求方式 方式匹配转发

Rest请求风格的接口内往往会存在多种请求方式的接口,如果我们的接口只允get请求访问,那么配置如下所示:

 

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. #- Path=/payment/get/** # 断言,路径相匹配的进行路由
  22. #- After=2021-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Before=2022-01-20T17:42:47.789-07:00[America/Denver]
  24. #- Cookie=username,liu
  25. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  26. #- Host=**.baidu.com
  27. - Method=GET
  28. #- Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  29. # 过滤
  30. #filters:
  31. # - AddRequestHeader=X-Request-red, blue
  32. #- id: payment_route2
  33. # uri: http://localhost:8001
  34. # predicates:
  35. #Path=/payment/lb/** #断言,路径相匹配的进行路由

发送GET请求测试:

请求参数 方式匹配转发

Spring Cloud GateWay还支持根据指定的参数进行匹配,Query方式的Predicate也有两种方式匹配情况,如下所示:

  1. server:
  2. port: 9090
  3. spring:
  4. application:
  5. name: @artifactId@
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: 172.17.169.81:8848
  10. gateway:
  11. discovery:
  12. locator:
  13. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称j进行路由
  14. routes:
  15. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  16. #匹配后提供服务的路由地址
  17. #uri: http://localhost:8070/payment/get/31
  18. uri: lb://payment-service
  19. #uri: http://localhost:8070
  20. predicates:
  21. #- Path=/payment/get/** # 断言,路径相匹配的进行路由
  22. #- After=2021-01-20T17:42:47.789-07:00[America/Denver]
  23. #- Before=2022-01-20T17:42:47.789-07:00[America/Denver]
  24. #- Cookie=username,liu
  25. #- Header=X-Request-Id, \d+ #请求头要有X-Request-Id属性,并且值为正数
  26. #- Host=**.baidu.com
  27. #- Method=GET
  28. - Query=username, \d+ # 要有参数名username并且值还要是正整数才能路由
  29. # 过滤
  30. #filters:
  31. # - AddRequestHeader=X-Request-red, blue
  32. #- id: payment_route2
  33. # uri: http://localhost:8001
  34. # predicates:
  35. #Path=/payment/lb/** #断言,路径相匹配的进行路由

 断言就讲解这么多下一讲,讲解过滤器

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/301511
推荐阅读
相关标签
  

闽ICP备14008679号