spring cloud gateway配置
当有多个微服务项目时,就需要在前端配置多个http链接,这是件很麻烦的事情。此时,可以使用spring cloud gateway进行路由转发。spring cloud gateway是一个建立在Spring生态系统之上的API网关,在eureka注册微服务后,前端只需要把http请求发送到gateway微服务即可,gateway会自动进行请求转发和修改。
一、添加依赖和配置
要想使用该网关,需要在pom.xml里添加依赖文件:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
添加后,要在application.yaml里进行相关配置,eureka client配置如下:
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eurekainstance:instance-id: my-servicepefer-ip-address: true
gateway路由配置如下:
spring:cloud:gateway:routes:- id: after_routeuri: lb://my-service #eureka注册时使用的服务名(即spring.application.name)predicates:Path=/api/order/**
- id:id是每个路由的唯一标识符,用于唯一标识一个路由规则,确保在多个路由配置中每个路由都是独立的。
- uri:指定了这个路由的目标URI,即所有匹配这个路由的请求都会被转发到lb://my-service。
- predicates:定义判断条件,决定哪些请求会匹配当前路由。
二、CORS配置
跨域资源共享(Cross-Origin Resource Sharing,CORS)是浏览器实现的一种安全机制,用于控制不同源(域名、协议、端口)之间的资源访问权限。其核心目的是在保护用户数据安全的前提下,允许合法的跨域请求。
- 为什么要配置CORS
默认情况下,浏览器会阻止网页向不同源的服务器发起跨域请求(如 Ajax、Fetch 请求),以防止恶意网站窃取用户数据。所以需要配置后才可以正常访问其他微服务。 - 工作原理
当有跨域请求时,http会自动添加http头,服务器会返回对应的响应头,检查响应头是否允许该请求。 - 请求头类型
- 简单请求:
浏览器会自动添加Origin头,直接向服务器发起请求,服务器返回Access-Control-Allow-Origin响应头。浏览器会检查 Access-Control-Allow-Origin 是否包含当前源。若允许,则返回数据;否则拦截响应。
简单请求定义如下:
请求方法为 GET、POST 或 HEAD。
请求头仅包含安全字段(如 Accept、Content-Type 等)。
Content-Type 为 text/plain、multipart/form-data 或 application/x-www-form-urlencoded。 - 预检请求:
如使用的不是简单请求,而是使用 PUT、DELETE 方法,或自定义请求头,浏览器会先发送一个OPTIONS请求,询问服务器是否允许跨域,允许跨域才会向服务器发送请求。OPTIONS请求包含以下信息:
- 简单请求:
Origin: http://请求链接
Access-Control-Request-Method: 请求方法
Access-Control-Request-Headers: X-Custom-Header
- 微服务CORS配置
spring cloud gateway需要单独配置为微服务,CORS就是在该微服务进行设置:
springcloudgatewayglobalcors: #表示这些CORS规则将应用于所有路由。cors-configurations:'[/**]': #哪些路径适用此CORS配置。/**表示所有路径allowed-origins: - "http://localhost:8120" #http://localhost:8120发起的http请求allowed-methods: #允许该请求使用哪些请求方法- GET- POST- PUT- OPTIONS #必须包含,因为 OPTIONS 请求通常用于预检请求(preflight request),用于检查服务器是否允许跨域请求。allowed-headers: "*" #允许的请求头,*表示所有请求头allow-credentials: true #允许发送凭证(如 cookies 和 HTTP 认证信息)。
配置完成后,向链接http://gateway ip:端口号/api/order/发起请求即可