目录:

一、介绍

网关主要是起到对微服务的保护功能,实现流量转发、负载均衡等功能。

网关技术的实现。

二、搭建网关服务步骤

1. 创建gateway module,引入SpringCloudGateway依赖和nacos的服务发现依赖。

```xml

org.springframework.cloud

spring-cloud-starter-gateway

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

org.springframework.cloud

spring-cloud-starter-loadbalancer

```

2. 创建启动类。

您好,您的问题是关于Spring Cloud Gateway的路由规则配置。以下是一些参考资料:

- Spring Cloud Gateway中如何配置路由规则

- 最全的spring cloud gateway总结

- 手把手教你用 Spring Cloud Gateway 实现网关功能(一)-路由转发基础篇

请求头的作用主要体现在以下几个方面:

1. 传递请求的附加信息:请求头可以携带一些客户端相关的信息,如用户代理(User-Agent)、接受的内容类型(Accept)、身份验证凭证(Authorization)等。这些信息可以帮助服务器更好地理解和处理请求。

2. 控制缓存行为:通过请求头中的Cache-Control字段,客户端可以告知服务器如何处理响应的缓存,包括是否使用缓存、缓存的有效期等。

3. 进行身份验证:请求头中的Authorization字段常用于传递身份验证凭证,如基本认证(Basic Authentication)或令牌(Token)。服务器可以根据这些凭证对请求进行身份验证,以确定是否允许访问受保护的资源。

4. 控制请求体的格式:Content-Type字段指定了请求体中数据的格式类型,如JSON、表单数据等。服务器可以根据Content-Type来正确解析请求体中的数据。

5. 提供跳转来源信息:Referer字段指示了当前请求是从哪个URL页面发起的,可以帮助服务器识别请求的来源。

通过请求头,客户端可以向服务器提供更多的信息,以便服务器能够根据这些信息做出相应的处理和响应。同时,服务器也可以使用请求头来控制和管理请求的行为,确保通信的顺利进行。

响应头(Response Header)是在HTTP协议中用于描述服务器响应的元数据。它是服务器在响应客户端请求时发送给客户端的一部分响应信息,包含了服务器的相关配置和响应内容的描述。响应头通常包含以下几个部分:

1. 状态码(Status Code):表示服务器对请求的处理结果的状态码,如200表示成功、404表示未找到资源等。

2. 状态消息(Status Message):对状态码的文本描述,如200的状态消息是"OK"。

3. 协议版本(Protocol Version):指定了服务器使用的HTTP协议版本。

4. Content-Type(内容类型):指定了服务器返回的响应内容的类型。

5. Content-Length(内容长度):指定了响应内容的长度。

6. ETag(实体标记):用于实体的缓存控制,客户端可以通过该标记判断资源是否改变。

7. Location(重定向地址):用于重定向响应,客户端可以根据该字段的值重新发送请求。

8. Set-Cookie:用于设置cookie信息。

响应头的作用是让服务器能够向客户端传递一些额外的信息,以控制或者说明响应的方式、内容和缓存等。客户端根据响应头中的信息进行相应的处理,如解析响应内容、处理重定向、保存Cookie等。响应头的具体内容可以根据实际需求进行定制和扩展。

2. 路由的过滤器配置

GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

3. 路由过滤器的种类

相关资料:

以第一个为例,eg:修改gateway服务的application.yml文件生效,当前filters写在userservice路由下,因此仅仅对访问userservice的请求有效。

```yaml

spring:

cloud:

gateway:

routes:

- id: user-service

uri: lb://userservice

predicates:

- Path=/user/**

filters: # 过滤器

- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头

```

写到default下,对所有路由都生效。

```yaml

spring:

cloud:

gateway:

routes:

- id: user-service

uri: lb://userservice

predicates:

- Path=/user/**

default-filters: # 默认过滤项

- AddRequestHeader=Truth, Itcast is freaking awesome!

```

五、全局过滤器实现步骤:

1. 实现GlobalFilter接口;

2. 添加@Order注解或实现Ordered接口,数字越小优先级越大;

3. 编写处理逻辑。

以下是重构后的内容:

```java

import org.springframework.cloud.gateway.filter.GatewayFilterChain;

import org.springframework.cloud.gateway.filter.GlobalFilter;

import org.springframework.core.Ordered;

import org.springframework.core.annotation.Order;

import org.springframework.http.HttpStatus;

import org.springframework.http.server.reactive.ServerHttpRequest;

import org.springframework.stereotype.Component;

import org.springframework.util.MultiValueMap;

import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

// @Order(-1) //越小优先级越高

@Component

public class AuthorizeFilter implements GlobalFilter, Ordered {

@Override

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain){

//1、获取请求参数

ServerHttpRequest request = exchange.getRequest();

MultiValueMap params = request.getQueryParams();

//2、获取参数中的authorization

String auth = params.getFirst("authorization");

//3、判断参数值是否等于admin

//3.1、是,放行

if("admin".equals(auth)){

return chain.filter(exchange);

}

//3.2 否,拦截

//3.2.1 设置状态码

exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);

//3.2.2 拦截请求

return exchange.getResponse().setComplete();

}

@Override

public int getOrder() {

return -1;

}

}

```

六、执行顺序

在进行浏览器测试时,需要注意的是,只有后面加上了`authorization=admin`才能正常访问。

七、跨域问题处理

跨域资源共享(CORS)是一个常见的网络问题,需要在gateway服务的`application.yml`文件中进行配置。具体操作如下:

1. 在`application.yml`文件中,添加以下配置:

```yaml

spring:

cloud:

gateway:

# ...

globalcors:

add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题

corsConfigurations: '[/**]':

allowedOrigins: # 允许哪些网站的跨域请求

- 'http://localhost:8090'

allowedMethods: # 允许的跨域ajax的请求方式

- 'GET'

- 'POST'

- 'DELETE'

- 'PUT'

- 'OPTIONS'

allowedHeaders: '*' # 允许在请求中携带的头信息

allowCredentials: true # 是否允许携带cookie

maxAge: 360000 # 这次跨域检测的有效期(s)

```

通过以上配置,可以解决跨域问题,使得浏览器测试效果正常。