目录
1.网关是啥:
2.网关的作用:
3.编辑网关实现:
3.2.导入依赖:
3.3.配置yml
5.1路由过滤器:
6.默认过滤器
7.全局过滤器:
8.过滤器总结:
9.过滤器链:
9.1排序的规则是什么呢?
10.网关解决跨域问题:
1.网关是啥:
网关英文名称为Gateway,又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
2.网关的作用:
3.网关实现:
3.1.我们先创建网关模块
3.2.导入依赖:
<!-- nacos服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
3.3.配置yml
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848
gateway:
routes:
- id: user-service #路由标识 必须唯一
uri: lb://userservice #路由目标地址 lb:负载均衡的缩写
predicates: #理由断言,判断请求是否符合规则
- Path=/user/** #路径以/user 开头的 都服务
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
解读一下上面的配置:
10010是我们配置的网关端口
又配置了nacos,把gateway注册到注册中心了
gateway的配置信息,当前端访问
都可以正常的放行。
predicates配置的路由断言规则,符合的都被代理到uri
gateway配置的uri的userservice和orderservice,是我们之前早已注册到注册中心的实例。
大致流程如下:
4.gateway断言
断言:是路由的规则
路由工厂:读取用户配置的断言规则,把其解析成判断条件,对请求进行判断
我们上面就用了Path断言。
官方路由工厂文档:
Spring Cloud Gateway 中文文档 (springdoc.cn)https://springdoc.cn/spring-cloud-gateway/#gateway-request-predicates-factoriesSpring提供了11中基本的Predicate工厂:
5.GatewayFilter(路由过滤器):
网关提供的一种过滤器,对进入网关的请求和微服务返回的响应做处理
官方文档:
5.1路由过滤器:
过滤器在其中可以做什么:
可以对你的请求和响应,添加个请求头了,查看一下响应体了等等如此的操作
Spring提过了31种不同的过滤器工厂:
如果我们想给所有路由都加上过滤器,可以使用:
6.默认过滤器
gateway:
routes:
- id: user-service #路由标识 必须唯一
uri: lb://userservice #路由目标地址 lb:负载均衡的缩写
predicates: #理由断言,判断请求是否符合规则
- Path=/user/** #路径以/user 开头的 都服务
# filters:
# - AddRequestHeader=Truth,you is good boy!
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
default-filters:
- AddRequestHeader=Truth,you is good boy!
这样就可以拿到我们添加的请求头了
但上述过滤器的逻辑都是固定的,我们引入一个全局过滤器(实现GlobalFilter接口),可以自定义逻辑处理请求和响应
7.全局过滤器:
举一个例子:
如何实现:
@Component
@Order(-1)
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
ServerHttpRequest request = exchange.getRequest();
MultiValueMap<String, String> queryParams = request.getQueryParams();
String authorization = queryParams.getFirst("authorization");
//判断authorization值
if("admin".equals(authorization)) {
//放行
return chain.filter(exchange);
}
//拦截
//设置状态码 401:未登录
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//拦截请求
return exchange.getResponse().setComplete();
}
}
@Order值越小,该过滤器优先级越高,越先执行
结果如下:
8.过滤器总结:
Gateway网关的过滤器分为两种,一种是局部过滤器,一种是全局过滤器。
过滤器,顾名思义,就是过滤一些请求,在这里,全局过滤器的作用是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现
9.过滤器链:
请求进入网关会碰到三类过滤器:
GatewayFilter,DefaultFilter,GloableFilter
请求路由后,会将三者合并到一个过滤器链(集合)中,排序后依次执行每个过滤器.
9.1排序的规则是什么呢?
- 每一个过滤器都必须指定一个 int 类型的 order 值,order 值越小,优先级越高,执行顺序越靠前。
- GlobalFilter 通过实现 Ordered 接口,或者使用 @Order 注解来指定 order 值,由我们自己指定。
- gatewayFilter和 defaultFilter 的 order 由 Spring 指定,默认是按照声明顺序从1递增。
- 如果三种过滤器的 order 值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter 的顺序执行。
10.网关解决跨域问题:
啥是跨域:
解决方法参考: