Gateway

Posted mty072788

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gateway相关的知识,希望对你有一定的参考价值。

Gateway网关是我们服务的守门神,所有微服务的统一入口。
网关的核心功能特性:
请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。

简单使用(网关本身也是一种服务,需要注册到注册中心,才能从注册中心发现其他在注册中心的服务)

  1. 引依赖 spring-cloud-starter-gateway spring-cloud-starter-alibaba-nacos-discovery
  2. 启动类
  3. 配置文件:
点击查看代码
spring:
  cloud:
    gateway:
      routes:  #路由
        - id: #路由id,自定义,唯一即可。  这里的  "-" ,代表的数组或者集合(反正就是多个的意思),因为路由规则可以有多个
          uri: lb://user-server   # "lb",负载均衡,后面跟服务名称
          predicates: #路由断言,按照以下路径匹配,只要符合要求就路由到 uri
            - Path=/user/**    # "-" 代表有多个该属性(这里是 Path),  - Path=/user/**。 **注意大小写,  Path**  。断言规则只是字符串,符合yaml的写法
**本地配置文件(bootstarp.yaml) 只配置了连接远程配置文件(Nacos 的 gateway-dev.yaml )。 就算本地文件写了 spring.cloud.nacos.. , 在远程配置文件里要配置网关 ,而网关 gateway在 spring.cloud下,也要在重写一遍。 即远程网关配置 spring.cloud.gateway.....**

全局过滤器
gateway包括 route 和 filter。用户要访问服务,发请求到网关,然后根据路由断言匹配到设置的服务,但在这之前必须要经过 过滤器的过滤处理。
网关提供了31种过滤器,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
自定义全局过滤器的方式是 实现 GlobalFilter接口,然后在实现方法 Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) 中编写自定义逻辑(登录状态,权限校验,请求限流等)
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain)
处理当前请求,有必要的话通过@link GatewayFilterChain将请求交给下一个过滤器处理
@param exchange 请求上下文,里面可以获取Request、Response等信息
@param chain 用来把请求委托给下一个过滤器
@return @code Mono 返回标示当前过滤器业务结束

**请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,一般优先规则是 默认>路由>全局。
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
**

关于跨域问题, 解决方案推荐 CORS 即可

nacos+gateway服务的配置

参考技术A 1、pom文件中引入的依赖

gateway包:网关服务的主要依赖

alibaba-nacos-discovery包:nacos的发现注册功能组件,在子服务启动类添加注解@EnableDiscoveryClient,就可以把服务注册到nacos中。

alibaba-nacos-config包:nacos的配置功能组件,添加后服务可以动态的从nacos中读取配置。

2、配置文件

配置组件的数据应该配在bootstrap.yml文件,而不是application.yml当中。因为两者的加载时机不同,bootstrap在程序引导阶段读取,而application在加载配置阶段读取。因为配置文件需要在加载配置阶段之前获取,所以bootstrap中写入引用配置的nacos地址,命名空间,还有dataId的参数。

在application中配入路由的断言规则,和注册发现的nacos服务地址。

3、跨域配置。

创建过滤器CorsWebFilter,并添加@Bean注解,让服务启动时创建此类。

以上是关于Gateway的主要内容,如果未能解决你的问题,请参考以下文章

gateway内置路由断言工厂

API网关对比zuul.1,zuul.2,gateway

SpringCloud集成Gateway

微服务服务网关----Gateway

浅谈Spring Cloud Gateway技术

Spring Cloud —— Gateway 服务网关