目录
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
断言:配置方式
一、application.yml
server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_routh #路由id无固定规则,要求唯一 # uri: http://localhost:8001 #提供服务的路由地址 uri: lb://cloud-payment-service #动态路由 predicates: - Path=/payment/get/** #断言,路径相匹配的进行路由 - id: payment_routh2 # uri: http://localhost:8001 uri: lb://cloud-payment-service predicates: - Path=/payment/lb/** - After=2022-05-19T15:34:01.420+08:00[Asia/Shanghai] #生效时间 # - Before= 之前 # - Between= 之间 # - Cookie=username,ppp #是否带上cookie # - Header=X-Request-Id, \d+ #请求头要有X-Request-Id并且值为正整数 # - Method=Get 请求为get时候允许访问 # - Host=**.test.com 需要带着 test.com # - Query=username, \d+ 需要携带username参数并且值为正数 eureka: instance: hostname: cloud-gateway-service client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:7001/eureka
二、配置类
@Configuration
public class GateWayConfig {
@Bean
public RouteLocator customerRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
routes.route("paths1",
r->r.path("/guonei")
.uri("https://news.baidu.com/guonei")).build();
return routes.build();
}
}
过滤Filter
实现两个接口:
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
//自定义过滤器
@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("this is MyLogGatewayFilter" + new Date());
//是否携带参数uname
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if (uname == null) {
log.info("用户名为空");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
} else {
return chain.filter(exchange);
}
}
//加载过滤器的顺序,越小越高
@Override
public int getOrder() {
return 0;
}
}