GateWay使用
首先创建一个网关服务,添加对应的依赖
<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 {@Overridepublic 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);}@Overridepublic int getOrder() {return -1; // 越小越先执行}
}
②自定义局部过滤器 (需要自定义过滤器工厂)
@Component
public class LogGatewayFilterFactory extends AbstractGatewayFilterFactory<LogGatewayFilterConfig> {public LogGatewayFilterFactory() {super(LogGatewayFilterConfig.class);}@Overridepublic 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_routeuri: http://localhost:8080predicates:- Path=/test/**filters:- name: LogGatewayFilterargs:message: "正在访问 test 接口"showParams: true