前言:核心API
一、需求:拦截请求,打印日志
1.加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2.创建自定义过滤器 工厂
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractNameValueGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
@Slf4j
@Component
//自定义过滤器工厂的名字要以GatewayFilterFactory结尾,只需在前面加个前缀,并把前缀配到配置文件里
public class PreLogGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory {
@Override
public GatewayFilter apply(NameValueConfig config) {
return ((exchange, chain) -> {
//配置上写的参数用config.getName(),config.getValue()来拿
//config.getName()拿到的是a,config.getValue()拿到的是b
log.info("请求进来了,参数:{},{}",config.getName(),config.getValue());
//Request.mutate后可以修改请求,需改后build()
ServerHttpRequest modifiedRequest = exchange.getRequest().mutate().build();
//把修改后的Request给Exchange
ServerWebExchange modifiedExchange = exchange.mutate().request(modifiedRequest).build();
//继续下一个过滤器
return chain.filter(modifiedExchange);
});
}
}
3.加配置
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
discovery:
locator:
enabled: true #让gateway在nacos上找微服务
routes:
- id: before_route
uri: lb://user-center #lb :nacos上的微服务
predicates:
- MyTimeBetween=上午9:00,下午11:00 #指定一个路由规则,这里的MyTimeBetween是自定义的,可以使用spring-cloud-gateway自带的。
filters:
- PreLog=a,b #写前缀即可,后面是传给工厂的参数
4.验证
通过gateway访问微服务,前提是请求路径需要满足routes的谓词,才会走到这个工厂里。
http://localhost:8040/users/1