路由是什么
即,告诉gateway,什么路径的请求,要转发给哪个微服务
路由规则配置
新建路由配置文件
spring:
cloud:
gateway:
routes:
- id: order-route
uri: lb://service-order
predicates:
- Path=/api/order/**
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
解释 id:路由id uri:转发微服务 predicatee:指定要转发的路径 /api/order/** 即会转发到service-order下的 /api/order/** http://localhost/api/order/readDb会转发到service-order下的/api/order/readDb
路由工作原理
路由生效优先级从上到下,也就是说,先配置的路由会覆盖后面的路由,可以通过order属性指定优先级,order越小,优先级越高
spring:
cloud:
gateway:
routes:
- id: order-route
uri: lb://service-order
predicates:
- Path=/api/order/**
order: 0
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
order: 1
断言
即判断请求是否符合规则,符合规则才会转发
断言长短写法
断言的短写法 Path即是一种断言机制 断言名=value
predicates:
- Path=/api/order/**
断言的长写法
断言长写法有两个参数,name即断言名,args即断言参数
predicates:
- name: Path
args:
patterns: /api/order/**
所有的断言机制都由RoutePredicateFactory接口提供,其不同的实现即不同断言机制
RoutePredicateFactory之前的即断言机制
而arg参数则取决于断言实现中的config
查看官网查阅参数作用
示例
spring:
cloud:
gateway:
routes:
- id: order-route
uri: lb://service-order
predicates:
- name: Path
args:
patterns: /api/order/**
order: 1
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
order: 2
- id: bing-route
uri: https://www.bing.com/
predicates:
- name: Path
args:
patterns: /search
- name: Query
args:
param: q
regexp: haha
order: 0
当一个断言指定了多个断言机制,需要同时满足才可路由’
自定义断言工厂
package com.atguigu.gateway.predicate;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.cloud.gateway.handler.predicate.QueryRoutePredicateFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
@Component
public class VipRoutePredicateFactory extends AbstractRoutePredicateFactory<VipRoutePredicateFactory.Config> {
public VipRoutePredicateFactory() {
super(Config.class);
}
// 断言方法
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
// localhost/search?q=haha&user=leifengyang
ServerHttpRequest request = serverWebExchange.getRequest();
String first = request.getQueryParams().getFirst(config.param);
return StringUtils.hasText(first) && first.equals(config.value);
}
};
}
//短写法的参数顺序
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("param", "value");
}
/**
* 可以配置的参数
*/
@Validated
public static class Config {
@NotEmpty
private String param;
@NotEmpty
private String value;
public @NotEmpty String getParam() {
return param;
}
public void setParam(@NotEmpty String param) {
this.param = param;
}
public @NotEmpty String getValue() {
return value;
}
public void setValue(@NotEmpty String value) {
this.value = value;
}
}
}
spring:
cloud:
gateway:
routes:
- id: order-route
uri: lb://service-order
predicates:
- name: Path
args:
patterns: /api/order/**
order: 1
- id: product-route
uri: lb://service-product
predicates:
- Path=/api/product/**
order: 2
- id: bing-route
uri: https://www.bing.com/
predicates:
- name: Path
args:
patterns: /search
- name: Query
args:
param: q
regexp: haha
- name: Vip
args:
param: user
value: chenxin
# - Vip=user,chenxin
order: 0