首先创建一个网关服务,添加对应的依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
然后修改网关的application.yml
spring:
cloud:
gateway:
routes:
-id: item #路由id,必须唯一
uri: lb:://item-service #lb表示负载均衡,后面的是转发的目标服务
predicates: #路由断言,判断请求是否符合以下规则,符合就转发
-Path: /items/**,/search/**
order: 0 #优先级,数字越小优先级越高
filters: #拦截器
路由断言有很多种类型,不多赘述,这里就写一个最常用的path路径匹配,其他查阅资料即可
主要是拦截器部分
①全局过滤器
不需要在yml文件里配置,定义之后直接生效,对全局起作用
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !"admin-token".equals(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return -1; // 越小越先执行
}
}
②自定义局部过滤器 (需要自定义过滤器工厂)
@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterConfig> {
public LogGatewayFilterFactory() {
super(LogGatewayFilterConfig.class);
}
@Override
public GatewayFilter apply(LogGatewayFilterConfig config) {
return (exchange, chain) -> {
System.out.println("日志过滤器触发: " + config.getMessage());
if (config.isShowParams()) {
System.out.println("请求参数:" + exchange.getRequest().getQueryParams());
}
return chain.filter(exchange);
};
}
}
application.yml使用
spring:
cloud:
gateway:
routes:
- id: test_route
uri: http://localhost:8080
predicates:
- Path=/test/**
filters:
- name: LogGatewayFilter
args:
message: "正在访问 test 接口"
showParams: true