一、什么是网关
1.网关相当于一个网络请求的中转站,这里以淘宝为例。假如淘宝的商品相关功能和用户相关功能分别在不同的服务器上,拥有不同的网址假设是: https://good.tb.com 和 https://user.tb.com
但用户不能分别访问这两个网址使用相关服务。所以我们需要一个统一路由管理的中转站,当用户使用商品服务,他就会自动的将用户的请求转发给https://good.tb.com,用户请求亦是如此。
二、什么是gateway
1.gateway简介
gateway提供了一个建立在Spring生态系统之上的API网关,包括Spring 6、Spring Boot 3 和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为其提供跨领域的关注,如:安全、监控/指标和容错。
三、gateway的使用
1.创建网关模块引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:这里引入那nacos服务发现依赖是为了将geteway交给nacos管理
2.编写gateway配置文件
在application.yml文件写入如下配置
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848
启动服务
可以发现,getaway服务已经注册了
增加路由配置
spring:
cloud:
gateway:
routes:
- id: user-service #路由id,可任意命名,但必须保持唯一
uri: lb://userservice #目的uri
predicates: #断言配置,用于匹配请求,这里是以 /user/.... 的请求路由到上面的目的uri
- Path=/user/**
filters: #路由过滤器配置 给匹配本路由下的请求 添加一个请求头: X-Request-red:blue
- AddRequestHeader=X-Request-red, blue
- id: order-service #同上
uri: lb://orderservice
predicates:
- Path=/order/**
filters:
- AddRequestHeader=X-Request-red, blue
特别注意: Path=/user/** Path的P是大写的,是大写的
重启服务,访问 http://localhost:10010/order/103
可以看到我们已经通过网关访问到我们注册的订单服务了,这样最基本的网关就搭建完成了。
3.gateway的过滤器
过滤器主要负责对请求的修饰加工以及筛选功能
官方中文文档:相关教程
上面我们已经配置了路由过滤器,但总有些配置是所有路由都需要的,这时候我们就需要使用默认过滤器,他是对所有路由都生效的配置。具体配置如下:
spring:
cloud:
gateway:
default-filters:
- AddResponseHeader=X-Response-Default-Red, Default-Blue
这里的意思是给所有的请求添加响应头 X-Response-Default-Red:Default-Blue
以上两种方式配置的过滤器是按照注册的顺序进行优先级排序的,简单了说就是按编写的先后顺序执行的。优先级的起始值是1,逐步递增
出此之外,我们还可以通过编写类的形式自定义全局路由 GlobalFilter。代码如下
@Order(-3) // 数字越小越优先
@Component
public class LoginFilter implements GlobalFilter {
@Override
/**
* exchange: 用于存放请求的容器
* chain: 过滤器串,gateway的多个过滤器是串联在一起的,这个对象就是存放管理这个串的
*/
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//拿到请求
ServerHttpRequest request = exchange.getRequest();
//获取请求参数
MultiValueMap<String, String> queryParams = request.getQueryParams();
//获取key为name 的参数
String name = queryParams.getFirst("name");
if(name.equals("admin")){
//放行
return chain.filter(exchange);
}
//设置身份验证未通过的状态码:401
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//终结请求
return exchange.getResponse().setComplete();
}
}
1.这个过滤器的功能就是检查请求是key为name 的参数的值是否是 admin, 如果是则正常放行,如果不是则验证未通过,设置状态码为401并终结请求。
2. @Order(-3) 这个注解配置了这个过滤器的优先级,值越小越优先
那么这样就出现了一个问题,如果我同是编写了以上三种过滤器,并且order值都想同,又该如何排序呢?
答案是: 当order一致时, default-filters > 路由过滤器 > 全局过滤器
4. CORS配置
这个配置是为了解决前端浏览器访问时的跨域问题,有时候我们在前端开发的过程中会发现请求回报出一个403状态码,这就是服务端拒绝了请求。这时候我们就要进行CORS配置,允许我们自己的客户端访问。如下
全局的CORS配置如下
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true #解决option(询问)请求被拦截问题
cors-configurations:
'[/**]':
allowedOrigins: #可跨域的网站
- "http://127.0.0.1:5173" #我发起请求的地址
allowedMethods: #可跨域的请求方式
- "GET"
- "POST"
- "DELETE"
- "UPDATE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许携带的请求头信息
allowCredentials: true #允许携带cookie
maxAge: 360000 #本次跨域验证成功后有效期
add-to-simple-url-handler-mapping: true
这个配置的用处是:
客户端在发送ajax请求时,ajax会先发送一个询问请求,问一下后端是否让我访问,不配置的话可能会导致ajax拿不到结果
除了全局的配置,我们还可以配置单个路由的相关配置
spring:
cloud:
gateway:
routes:
- id: cors_route
uri: lb://userservice
predicates:
- Path=/user/**
metadata:
cors
allowedOrigins: '*' #任意地址均可访问
allowedMethods:
- GET
- POST
allowedHeaders: '*'
maxAge: 30
完成以上配置后我们重新发起请求
可以看出浏览器已经可以通过ajax正常发起请求了
四、总结
以上就是gateway的基本使用了,新人作者,还有不足,欢迎大佬多多补充,多多关照哈~拜拜↑拜拜↓拜拜↑