一、Spring cloud gateway介绍
Spring Cloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor等技术构建的API网关服务。它旨在为微服务架构中的应用程序提供统一的路由服务,同时还具有过滤、流量控制、安全性、监控等功能。
主要功能和特性:
-
动态路由:Spring Cloud Gateway可以根据特定的路由规则将请求动态路由到不同的目标服务,使得网关可以灵活适应不同的后端服务。
-
过滤器:可以通过预定义的过滤器或自定义过滤器来对请求进行修改、验证、日志记录等处理,以确保请求的安全性和可靠性。
-
负载均衡:支持基于负载均衡的路由策略,可以将请求平衡地分发到多个实例中,提高系统的性能和可用性。
-
限流:可以配置限流策略,对请求进行限制,防止突发流量对系统造成影响,保护后端服务的稳定性。
-
熔断:通过集成Hystrix等熔断器,可以实现对后端服务的熔断和降级,防止由于后端服务不可用而导致的系统崩溃。
-
重试:支持在请求失败时进行重试,提高系统的健壮性和可靠性。
-
安全性:可以集成Spring Security等安全框架,对请求进行认证和授权,保护系统的安全性。
-
监控:提供了丰富的监控和统计功能,可以实时查看网关的运行状态、请求流量等信息,帮助进行系统调优和故障排查。
二、跨域概念说明
跨域(Cross-Origin)指的是在 Web 应用程序中,当一个资源(如脚本、样式表、图像等)来自于不同的域、协议或端口时,发生了跨域访问。例如,如果一个网页的源代码来自 http://domain1.com
,而它加载的一个 JavaScript 文件来源于 http://domain2.com
,那么这就属于跨域访问。
三、Gateway解决跨域问题的方法
1、创建全局过滤器解决
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Configuration
public class CorsFilter {@Bean@Order(Ordered.HIGHEST_PRECEDENCE)public GlobalFilter corsFilter() {return (exchange, chain) -> {ServerWebExchange.Builder webExchangeBuilder = exchange.mutate();webExchangeBuilder.request(exchange.getRequest()).response(exchange.getResponse());webExchangeBuilder.response(exchange.getResponse().mutate().header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE, OPTIONS").header("Access-Control-Allow-Headers", "Content-Type").build());return chain.filter(webExchangeBuilder.build());};}
}
2、通过配置解决Gateway跨域问题
spring:cloud:gateway:globalcors: # 全局跨域配置cors-configurations: # 跨域配置列表'[/**]': # 匹配所有路径allowed-headers: "*" # 允许的请求头,*表示允许所有allowed-methods: # 允许的请求方法列表- GET- POST- PUT- DELETE- OPTIONSallowed-origins: "*" # 允许的请求来源,*表示允许所有exposed-headers: # 暴露的响应头列表- Authorization- Content-Typeallow-credentials: true # 是否允许凭证传递,true表示允许