文章目录
- RoutePredicateFactories
- (SpringCloudGateway的路由断言规则测试)
RoutePredicateFactories
(SpringCloudGateway的路由断言规则测试)
1 基础配置
1.1 spring-cloud-gateway 版本 2.2.9.RELEASE
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.9.RELEASE</version>
1.2 gatewayserver/bootstrap.yml
server:
port: 13001
spring:
application:
name: gateway-service
profiles:
active: dev
cloud:
nacos:
#配置中心
config:
server-addr: localhost:8848
#扩展名 只能写成yaml
file-extension: yaml
1.3 要通过网关路由访问的实际 Consumer接口为 :localhost:11001/qme或 localhost:11002/qme
1.3.1 ProducerFeign
@FeignClient("producer-service")//生产者服务名称 spring.application.name
public interface ProducerFeign {
@RequestMapping("/api/feign/qme")
String qme();
}
1.3.2 ConsumerFeignController
@RestController
@RefreshScope //允许在此Controller中 动态识别 配置中心修改的配置
public class ConsumerFeignController {
@Value("${class.number}")
private String classNo;
@Resource
private ProducerFeign producerFeign;
@RequestMapping("/qme")
public String qme(){
System.out.println(classNo);
String result = producerFeign.qme();
return result;
}
}
1.3.3 ProducerFeignController
@RestController
@RequestMapping("/api/feign")
public class ProducerFeignController {
@Value("${server.port}")
private int port;
@RequestMapping("/qme")
public String qme(){
return new Date()+"-->"+port;
}
}
2 postman测试
2.1 PathRoutePredicateFactory
2.1.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Path=/consumer/** #允许带有consumer前缀的路径的请求通过网关进行路由
filters:
- StripPrefix=1 #过滤器除去path的第一个前缀
2.1.2 请求成功案例 -->
2.1.3 请求失败案例 -->
不加 /consumer/
2.2 MethodRoutePredicateFactory
2.2.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Method=POST #允许POST请求通过网关进行路由
2.2.2 请求成功案例 -->
2.2.3 请求失败案例 -->
2.3 QueryRoutePredicateFactory
2.3.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- RemoteAddr=192.168.0.1/24 #只要是本局域网内用户 均可请求网关进行路由
2.3.2 请求成功案例 -->
2.3.3 请求失败案例 -->
将具体ip替换为localhost则请求规则不匹配 请求失败
2.4 RemoteAddrPredicateFactory
2.4.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Query=answerMe, hi #允许带有键值对形式参数的请求通过网关进行路由 url?answerMe=hi
2.4.2 请求成功案例 -->
2.4.3 请求失败案例 -->
2.5 Before/After/Between RoutePredicateFactory
下面以BeforeRoutePredicate为例
2.5.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
#在这个断言的时间之前 允许请求通过网关路由
- Before=2023-07-14T21:24:47.789+08:00[Asia/Shanghai]
2.5.2 请求成功案例 -->
2.5.3 请求失败案例 -->
BetweenRoutePredicate
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
#在这个断言的时间段之内 允许请求通过网关路由
- Between=2023-07-14T15:35:47.789+08:00[Asia/Shanghai], 2023-07-14T16:35:47.789+08:00[Asia/Shanghai]
AfterRoutePredicate
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
#在这个断言的时间之后 允许请求通过网关路由
- After=2023-07-14T16:35:47.789+08:00[Asia/Shanghai]
2.6 CookieRoutePredicate
2.6.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Cookie=username, wn #允许带有符合键值对条件cookie的请求通过网关进行路由
2.6.2 请求成功案例 -->
2.6.3 请求失败案例 -->
2.7 HeaderRoutePredicate
2.7.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Header=token, 112233 #允许请求头中带有 token=112233 的请求通过网关进行路由
2.7.2 请求成功案例 -->
2.7.3 请求失败案例 -->
2.8 HostRoutePredicate
2.8.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes: #谓词工厂和网关过滤器
- id: consumer
uri: lb://consumer-service #内部协议 lb http:// 万能 适用于远程
predicates:
- Host=**.wn.com:13001 #允许 Host带端口为 xxx.wn.com:13001 的请求通过网关进行路由
2.8.2 请求成功案例 -->
2.8.3 请求失败案例 -->
2.9 WeighrRoutePredicateFactory
2.9.1 gateway-service-dev.yaml
spring:
cloud:
gateway:
routes:
- id: consumer_high
uri: http://localhost:11001
predicates:
- Weight=consumer, 8
- id: consumer_low
uri: http://localhost:11002
predicates:
- Weight=consumer, 2 #允许网关根据 权重设置 将请求 分流向不同节点
2.9.2 对进行微调便于观察
@RestController
@RefreshScope //允许在此Controller中 动态识别 配置中心修改的配置
public class ConsumerFeignController {
//@Value("${class.number}")
//private String classNo;
private int count;
@Resource
private ProducerFeign producerFeign;
@RequestMapping("/qme")
public String qme(){
System.out.println(count++);
// System.out.println(classNo);
String result = producerFeign.qme();
return result;
}
}
2.9.3 请求成功案例 -->
权重为8的节点接收到的请求次数
权重为2的节点接收到的请求次数