文章目录
- 网关作用
- 工作原理
- [predicates 断言](#predicates 断言)
-
- [1. 写法](#1. 写法)
- [2. 断言机制](#2. 断言机制)
- [3. 自定义断言](#3. 自定义断言)
- [filters 过滤器](#filters 过滤器)
-
- [1. RewritePath GatewayFilter Factory(路径重写)](#1. RewritePath GatewayFilter Factory(路径重写))
- [2. 默认 filter](#2. 默认 filter)
- [3. Global Filter全局过滤器](#3. Global Filter全局过滤器)
- [4. 自定义过滤器](#4. 自定义过滤器)
- 跨域

网关作用
官方文档:https://docs.spring.io/spring-cloud-gateway/reference/4.3/index.html

Spring Cloud Gateway:
- Server WebFlux ------
spring-cloud-starter-gateway - Server MVC ------ spring-cloud-starter-gateway-mvc(性能较差)
工作原理

yaml
spring:
profiles:
active: dev
application:
name: easylive-cloud-gateway
cloud:
gateway:
routes:
#视频模块
- id: video
uri: lb://easylive-cloud-web
predicates:
- Path=/web/**
filters:
- StripPrefix=1
#互动服务
- id: interact
uri: lb://easylive-cloud-interact
predicates:
- Path=/interact/**
filters:
- StripPrefix=1
spring-cloud-gateway下的配置:
- id:服务唯一标识
- uri:服务路由地址(
lb表示负载均衡) - predicates:断言,判断什么时候路由到该服务
- filters:过滤条件
- order:顺序,值越小,优先级越高
predicates 断言
1. 写法
短写法:

长写法:

2. 断言机制

3. 自定义断言
可以仿照 QueryRoutePredicateFactory 编写一个自定义断言配置。

自定义断言类的类名中 RoutePredicateFactory 之前就是就是配置文件中要写入的断言名 name 。

filters 过滤器

1. RewritePath GatewayFilter Factory(路径重写)
RewritePath GatewayFilter Factory 路径重写 filter:

2. 默认 filter
对所有路径均有效的过滤器。
3. Global Filter全局过滤器
java
@Component
@Slf4j
public class GatewayGlobalRequestFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取请求的URI
String rawpath = exchange.getRequest().getURI().getRawPath();
// 判断请求的URI是否是内部API
if (rawpath.indexOf(Constants.INNER_API_PREFIX) != -1) {
throw new BusinessException(ResponseCodeEnum.CODE_404);
}
log.info("这个是全局过滤器, {}" , rawpath);
// 继续执行下一个过滤器
return chain.filter(exchange);
}
@Override
public int getOrder() {
// 设置过滤器的优先级,数字越小优先级越高
return 0;
}
}
4. 自定义过滤器
仿照实现 GatewayFilterFactory 接口的某个 FilterFactory 实现。

跨域
跨域(Cross-Origin Resource Sharing,简称 CORS )是一种安全策略,用于限制一个域的网页如何与另一个域的资源进行交互。这是浏览器实现的同源策略(Same-Origin Policy)的一部分,旨在防止恶意网站通过一个域的网页访问另一个域的敏感数据。
由于浏览器实施的同源策略(Same Origin Policy),这是一种基本的安全协议,它确保了浏览器的稳定运行。没有同源策略,浏览器的许多功能可能无法正常工作。整个Web体系建立在同源策略之上,浏览器是这一策略的具体实现。该策略禁止来自不同域的JavaScript脚本与另一个域的资源进行交互。所谓同源,指的是两个页面必须具有相同的协议(protocol)、域名(host)和端口号(port)。
请求是能正常的发出去的,后端也正常的响应了,浏览器是把响应给拦截了,所以会出现:has been blocked by CORS policy: Response to preflight request does not pass access control check
-
单体项目解决跨域:
(1)在 Controller 上添加
@CrossOrigin注解。(2)编写 CrossFilter。
-
微服务解决跨域
微服务场景下,如果要对每一个服务单独编写跨域逻辑,比较繁琐。
Gateway 网关对接前端入口,由 Gateway 处理跨域,所有请求经过网关,网关处理后,所有的响应都允许跨域。

服务端通过在响应头中添加某些信息,告知浏览器哪些来源可以访问,浏览器就不再拦截响应。
