Gateway网关(九)

发布时间 2024-01-10 16:43:34作者: DAYTOY-105

1 网关作用介绍

1.1 为什么需要网关

网关功能:

  • 对用户请求做身份认证、权限校验;
  • 将用户请求路由到微服务,并实现负载均衡;
  • 对用户请求做限流。

 

1.2 网关的技术实现

在SpringCloud中网关的实现包括两种:

  • gateway;
  • zuul

Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

2 快速入门

2.1 搭建网关服务(是个独立的微服务)

搭建网关服务的步骤:

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

  2.编写路由配置及nacos地址;

 lb:LoadBalance;

 总:

网关搭建步骤:

  1. 创建项目,引入nacos服务发现和gateway依赖;
  2. 配置application.yml,包括服务基本信息、nacos地址、路由

路由配置包括:

  1. 路由id:路由的唯一标识;
  2. 路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡;
  3. 路由断言(predicates):判断路由的规则;
  4. 路由过滤器(filters):对请求或响应做处理。

3 路由断言工厂

3.1 路由断言工厂Route Predicate Factory

网关路由可以配置的内容包括:

  • 路由id:路由唯一标示;
  • uri:路由目的地,支持lb 和 http两种;
  • predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地;
  • filters:路由过滤器,处理请求或响应。

路由断言工厂的作用(解析):

  • 我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件;
  • 例如Path=/user/**是按照路径匹配,这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的;
  • 像这样的断言工厂在SpringCloudGateway还有十几个。
  • 总:路由断言工厂的作用是读取路由的判断规则,而后把它解析成对应的判断条件,等请求进来做判断。

Spring提供了11中基本的Predicate工厂:

4 路由的过滤器配置

4.1 路由过滤器 GatewayFilter

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

4.2 过滤器工厂 GatewayFilterFactory

Spring提供了31种不同的路由过滤器工厂。例如:

  •  过滤器的作用:
    • 对路由的请求或响应做加工处理,比如添加请求头;
    • 配置在路由下的过滤器只对当前路由的请求生效;
  • defaultFilters的作用:对所有路由都生效的过滤器

5 全局过滤器 GlobalFilter

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样;

区别在于GatewayFilter通过配置定义,处理逻辑是固定的。而GlobalFilter的逻辑需要自己写代码实现。

定义方式是实现GlobalFilter接口;

 总:

  • 全局过滤器的作用:对所有路由都生效的过滤器,并且可以自定义处理逻辑;
  • 实现全局过滤器的步骤:
    • 实现GlobaFilter接口;
    • 添加@Order注解或实现Ordered接口;
    • 编写处理逻辑。

6 过滤器执行顺序

请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter

请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器。

  • 路由过滤器、DefaultFilter、全局过滤器的执行顺序:
    • order值越小,优先级越高;
    • 当order值一样时,顺序是DefaultFilter最先,然后是局部的路由过滤器,最后是全局过滤器。

7 网关的cors跨域配置

7.1 跨域问题处理

跨域:域名不一致就是跨域,主要包括:

  • 域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com;
  • 域名相同,端口不同:localhost:8080 和 localhost:8081

跨域问题浏览器禁止请求的发起者服务端发生跨域ajax请求,请求被浏览器拦截的问题。

解决方案:CORS