一、Spring Cloud Gateway
1.1、概述
1.2、 Zuul1.x官网
https://github.com/Netflix/zuul/wiki
1.3、Gateway官网
https://spring.io/projects/spring-cloud-gateway/#overview
1.4、Gateway源码架构
1.5、已经有了Zuul为什么又出现了Gateway
1.6、常用功能
1.7、微服务架构中网关的位置
1.8、三大核心概念
1.8.1、路由(Route)
1.8.2、断言(Predicate)
1.8.3、过滤器(Filter)
1.9、工作流程
1.9.1、核心逻辑
1.9.2、工作流程
1.10、断言工厂配置(Route Predicate Factories)
1.10.1、概述
1.10.2、(内置)基于Datetime类型的断言工厂
1.10.3、(内置)基于远程地址的断言工厂
1.10.4、(内置)基于Cookie的断言工厂
1.10.5、(内置)基于Header的断言工厂
1.10.6、(内置)基于Host的断言工厂
1.10.7、(内置)基于Method请求方法的断言工厂
1.10.8、(内置)基于Path请求路径的断言工厂
1.10.9、(内置)基于Query请求参数的断言工厂
1.10.10、(内置)基于路由权重的断言工厂
1.10.11、(自定义)基于权限的断言工厂
/**
* @Author : 一叶浮萍归大海
* @Date: 2024/1/4 9:38
* @Description: 自定义断言工厂
* 功能:校验用户的权限,如果用户是已授权用户则放行,否则失败!
*/
@Component
public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {
public static final String AUTHED_USER = "admin";
public AuthRoutePredicateFactory() {
super(AuthRoutePredicateFactory.Config.class);
}
public List<String> shortcutFieldOrder() {
return Collections.singletonList("name");
}
public Predicate<ServerWebExchange> apply(final AuthRoutePredicateFactory.Config config) {
return new GatewayPredicate() {
public boolean test(ServerWebExchange serverWebExchange) {
if (AUTHED_USER.equals(config.getName())) {
return true;
}
return false;
}
};
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Validated
public static class Config {
private String name;
}
}
1.11、过滤器工厂配置(局部)
1.11.1、内置
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories.html
1.11.2、自定义
/**
* @Author : 一叶浮萍归大海
* @Date: 2024/1/4 10:28
* @Description: 自定义过滤器
*/
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {
public AuthGatewayFilterFactory() {
super(AuthGatewayFilterFactory.Config.class);
}
public List<String> shortcutFieldOrder() {
return Arrays.asList("value");
}
public GatewayFilter apply(final AuthGatewayFilterFactory.Config config) {
return new GatewayFilter(){
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
/**
* (1)name参数为空:成功
* (2)name参数不为空:获取name参数,值不等于value就失败,否则成功
*/
String name = exchange.getRequest().getQueryParams().getFirst("name");
if (StringUtils.isNotBlank(name)) {
if (name.equals(config.getValue())) {
return chain.filter(exchange);
} else {
exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
return exchange.getResponse().setComplete();
}
}
return chain.filter(exchange);
}
};
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Config {
private String value;
}
}
1.12、全局过滤器(Global Filter)配置
1.12.1、概览
1.12.2、局部过滤器 vs 全局过滤器
1.13、统一处理跨域
1.13.1、官网(配置方式)
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/cors-configuration.html
1.13.2、代码方式
/**
* @Author : 一叶浮萍归大海
* @Date: 2024/1/4 12:53
* @Description:
*/
@Configuration
public class MyCorsConfig {
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}