-
在Spring Boot中整合Spring Cloud Gateway是一个常见的需求,尤其是当需要构建一个微服务架构的应用程序时。Spring Cloud Gateway是Spring Cloud生态系统中的一个项目,它提供了一个API网关,用于处理服务之间的请求路由、安全、监控和限流等功能。
-
使用
- 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
- 进行配置
server: port: 9527 spring: application: name: cloud-gateway cloud: nacos: server-addr: localhost:8848 # nacos 地址 gateway: routes: - id: user_service #路由的ID,没有固定规则但要求唯一,建议配合服务名 uri: lb://user_service #匹配后提供服务的路由地址 predicates: - Path=/users/** # 断言,路径相匹配的进行路由 filters: # 过滤器配置 - AddRequestHeader=token, test # 添加请求头
-
多种配置
-
Predicate 断⾔条件
-
路由过滤器
-
默认过滤器配置
spring: cloud: gateway: routes: - id: user-service uri: lb://userservice predicates: - Path=/user/** default-filters: # 默认过滤器配置 - AddRequestHeader=token, test # 添加请求头
-
-
自定义全局路由过滤器: order数值越大优先级越低, 负的越多, 优先级越高
@Component public class GateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 1.获取请求参数 //1.这里的request并不是servlet中的request //2.返回值是一个多键的map集合、也就是说这个map集合的键可以重复 MultiValueMap<String, String> params = exchange.getRequest().getQueryParams(); // 2.获取userName参数 String userName = params.getFirst("userName"); // 3.校验 if ("root".equals(userName)) { // 放行 return chain.filter(exchange); } // 4.拦截 // 4.1.禁止访问,设置状态码 exchange.getResponse().setStatusCode(500); // 4.2.结束处理 return exchange.getResponse().setComplete(); } @Override public int getOrder() { return -1; } }
-
设置order值的两种方式
- 实现Ordered接口,并且重写getOrder方法
@Component public class GateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { } @Override public int getOrder() { return -1; } }
- 使用@Order注解
@Order(-1) @Component public class GateWayFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { } }
-
过滤路由过滤器的执行顺序: 默认过滤器 → 当前路由过滤器 → 全局过滤器
-
网关的跨域(请求位置和被请求位置不同源就会发生跨域)问题:浏览器会禁止请求的发起者与服务端发生跨域AJAX请求
- 解决方案:CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
spring: cloud: gateway: globalcors: # 全局的跨域配置 add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题 # options请求 就是一种询问服务器是否浏览器可以跨域的请求 # 如果每次跨域都有询问服务器是否浏览器可以跨域对性能也是损耗 # 可以配置本次跨域检测的有效期maxAge # 在maxAge设置的时间范围内,不去询问,统统允许跨域 corsConfigurations: '[/**]': allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090" allowedMethods: # 允许的跨域ajax的请求方式 - "GET" - "POST" - "DELETE" - "PUT" - "OPTIONS" allowedHeaders: "*" # 允许在请求中携带的头信息 allowCredentials: true # 允许在请求中携带cookie maxAge: 360000 # 本次跨域检测的有效期(单位毫秒) # 有效期内,跨域请求不会一直发option请求去增大服务器压力