Skip to content

gateway网关

一、介绍

SpringCloud Gateway是Spring官方出品,基于Spring5+Reactor技术开发的网关,性能强劲基于Reactor+WebFlux、功能多样,基于springboot2.x, 直接可以jar包方式运行

官网地址:https://spring.io/projects/spring-cloud-gateway

二、依赖

                 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

三、配置文件

route组成部分

  • id:路由的ID

  • uri:匹配路由的转发地址

  • predicates:配置该路由的断言,通过PredicateDefinition类进行接收配置。

  • order:路由的优先级,数字越小,优先级越高。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes: #数组形式
        - id: cloud-order
          #uri: http://127.0.0.1:8000  #想要转发到的地址,输入ip表示不接入注册中心的时候
          uri: lb://cloud-order  # 从nacos获取名称转发,lb是负载均衡轮训策略
          order: 1 #优先级,数字越小优先级越高
          predicates: #断言 配置哪个路径才转发
            - Path=/order-server/**
          filters: #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1  #去掉第一层前缀
      discovery:
        locator:
          enabled: true  #开启网关拉取nacos的服务

四、交互流程

  1. 客户端向Spring Cloud Gateway发出请求

  2. 如果网关处理程序映射确定请求与路由匹配

  3. 则将其发送到网关Web处理程序

  4. 通过特定过滤器链运行,前置处理-后置处理

五、断言

Predicate 来源于Java8,接受输入参数,返回一个布尔值结果,Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则, 如转发的判断条件,SpringCloud Gateway支持多种方式,常见如:Path、Query、Method、Header等。支持多个Predicate请求的转发是必须满足所有的Predicate后才可以进行路由转发

predicates:
  #指定地址才能访问
  - Host=**.spring.io
  #path列表作为参数,使用Spring的PathMatcher匹配path,可以设置可选变量
  #其中的segment变量可以通过下面方式获取:
    #PathMatchInfo variables = exchange.getAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE);
    #Map<String, String> uriVariables = variables.getUriVariables();
    #String segment = uriVariables.get("segment");
  - Path=/user/{segment},/user/{segment}
  #通过HTTP的method来匹配路由
  - Method=GET
  #指定header匹配,一个header的name,一个是正则匹配的value
  - Header=X-Request-Id, \d+    #指定请求头才能访问
  #通过一个或两个参数来匹配路由,一个是查询的name,一个是查询的正则value,只有一个参数表示只要请求带有参数即可,有两个表示要有这个参数,并且值要匹配第二个值
  - Query=aa, tes.
  #使用的是时间作为匹配规则,只要当前时间大于设定时间,路由才会匹配请求
  - After=2020-12-25T12:00:47.789+08:00
  ##使用的是时间作为匹配规则,只要当前时间小于设定时间,路由才会匹配请求
  - Before=2020-12-25T12:00:47.789+08:00
  #使用两个时间作为匹配规则,只要当前时间大于第一个设定时间,并小于第二个设定时间,路由才会匹配请求。
  - Between=2018-12-25T14:33:47.789+08:00, 2018-12-26T14:33:47.789+08:00

六、过滤器

过滤器生命周期

  • PRE: 这种过滤器在请求被路由之前调用,一般用于鉴权、限流等

  • POST:这种过滤器在路由到微服务以后执行,一般用于修改响应结果,比如增加header信息、打点结果日志

网关过滤器分类,

  • 局部过滤器GatewayFilter:应用在某个路由上,每个过滤器工厂都对应一个实现类,并且这些类的名称必须以 GatewayFilterFactory 结尾。顶级接口 GatewayFilterFactory

  • 全局过滤器:作用全部路由上。顶级接口 GlobalFilter

七、自定义全局过滤器

package com.lcy.cloud.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;

import reactor.core.publisher.Mono;

/**
 * @Description 用户token过滤器
 * @Author lcy
 * @Date 2021/8/1 11:34
 */
@Component
public class UserTokenFilter implements GlobalFilter, Ordered {

    @Override public Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain){
        String token = exchange.getRequest().getHeaders().getFirst("token");
        //处理逻辑
        return chain.filter(exchange);
    }

    @Override public int getOrder(){
        return 0;
    }
}