Spring Cloud Gateway網(wǎng)關(guān)中的過濾器
一、網(wǎng)關(guān)服務(wù)的搭建
Spring Cloud Gateway 和 nacos 不一樣,我們必須自己搭建工程,首先創(chuàng)建一個新的 Spring Boot 項(xiàng)目
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mall-parent</artifactId>
<groupId>com.company</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-gateway</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- 網(wǎng)關(guān) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--負(fù)載均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
在配置文件 application.yaml 中編寫路由規(guī)則
server:
port: 8080
spring:
application:
name: gateway
cloud:
nacos:
server-addr: 192.168.150.101:8848
gateway:
routes:
- id: product # 路由規(guī)則id,自定義,唯一
uri: lb://product-service # 路由的目標(biāo)服務(wù),lb代表負(fù)載均衡,會從注冊中心拉取服務(wù)列表
predicates: # 路由斷言,判斷當(dāng)前請求是否符合當(dāng)前規(guī)則,符合則路由到目標(biāo)服務(wù)
- Path=/product/**,/search/** # 這里是以請求路徑作為判斷規(guī)則
- id: cart
uri: lb://cart-service
predicates:
- Path=/carts/**
filters: # 在這里可以配置過濾器
- AddRequestHeader=key, value # 逗號之前是HTTP請求頭的key,逗號之后是value
- id: user
uri: lb://user-service
predicates:
- Path=/users/**,/addresses/**
最后,啟動項(xiàng)目即可
二、GatewayFilter 路由過濾器
@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {
@Override
public GatewayFilter apply(Object config) {
return new GatewayFilter() {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 獲取請求
ServerHttpRequest request = exchange.getRequest();
// 編寫過濾器邏輯
System.out.println("過濾器執(zhí)行了");
// 放行
return chain.filter(exchange);
}
};
}
}
注意:該類的名稱一定要以 GatewayFilterFactory 為后綴
三、GlobalFilter 全局過濾器
自定義GlobalFilter則簡單很多,直接實(shí)現(xiàn)GlobalFilter即可,而且也無法設(shè)置動態(tài)參數(shù)
@Component
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 編寫過濾器邏輯
System.out.println("未登錄,無法訪問");
// 放行
// return chain.filter(exchange);
// 攔截
ServerHttpResponse response = exchange.getResponse();
response.setRawStatusCode(401);
return response.setComplete();
}
@Override
public int getOrder() {
// 過濾器執(zhí)行順序,值越小,優(yōu)先級越高
return 0;
}
}

浙公網(wǎng)安備 33010602011771號