一、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
- OPTIONS
allowed-origins: "*" # 允许的请求来源,*表示允许所有
exposed-headers: # 暴露的响应头列表
- Authorization
- Content-Type
allow-credentials: true # 是否允许凭证传递,true表示允许