gateway学习笔记

76 阅读5分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

0 环境

  • 操作系统:win10
  • 编辑器:idea
  • springcloud版本:H版

1 简介

Spring Cloud Gateway使用的是Spring Boot和Spring Webflux提供的Netty底层环境,不能和传统的Servlet容器一起使用,也不能打包成一个WAR包。

  • 特点
    • 路径重写
    • 动态路由
    • 限流
    • 集成springcloud DiscoveryClient
    • 集成hystrix断路器
  • 对比
    • gateway是spring家族的 可以与spring家族的其他组件无缝融合
    • zuul不支持长连接(websocket)
    • gateway占用资源资源更新且性能强于zuul(异步+非阻塞)
    • 限流

2 概念

  • 概念了解
    • Route --> 网关的基础元素(组成 ---> ID + URI + 断言 + 过滤器) 一个请求到达网关了 由gateway Handler Mapping通过断言进行路由匹配(mapping) 当断言为真 匹配路由(场景: 下班了 我走到了大门口 我奔着某某栋方向走去 但保安手拿温度枪 气势汹汹的拦住了我(断言) 测了一下温度 看了一下通行证 戴口罩的 确定你没毛病 进去吧 就这样回到某栋某室)
    • predicate
      • java8中函数 匹配HTTP请求(匹配条件)
    • filter
      • 在请求发送前/后进行一些业务处理

3 gateway基本用法

3.1 创建springboot项目(gateway)

在这里插入图片描述

3.2 添加依赖

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

3.3 yml配置

我们访问目标地址httpbin.org 在这里插入图片描述

spring:
  cloud:
    gateway:
      routes:
        - id: hi
          uri: http://httpbin.org
          predicates:
            - Path=/get

-不建议properties这样配置(繁琐) 在这里插入图片描述

3.4 启动类配置bean

和yml配置效果是一样的()

/*    @Bean
    RouteLocator routeLocator(RouteLocatorBuilder builder){
        // 可以添加多个
        return builder.routes()
                // 访问网址 http://httpbin.org/get
                // 通过网关后访问 http://localhost:8080/get
                .route("hi", r -> r.path("/get").uri("http://httpbin.org"))
                .build();
    }*/

3.5 启动gateway

在这里插入图片描述

4 结合微服务

还是延用以前的eureka server和provider以及gateway 后面说启用就是这三个启动类的启动/重启

4.1 yml配置

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 开启自动代理
          enabled: true
          # 服务id为true --> 这样小写服务就可访问了
          #lower-case-service-id: true
  application:
    name: gateway

eureka:
  client:
    service-url:
      #      defaultZone: http://localhost:1234/eureka
      defaultZone: http://localhost:8761/eureka

#日志
logging:
  level:
    org.springframework.cloud.gateway:
      debug

4.2 启用

  • 访问 http://localhost:8080/provider/hello 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述
  • 小写服务 在这里插入图片描述 #启用它设为true即可 lower-case-service-id: true
    spring:
      cloud:
        gateway:
          discovery:
            locator:
              # 开启自动代理
              enabled: true
              # 服务id为true --> 这样小写服务就可访问了
              lower-case-service-id: true
      application:
        name: gateway
    
    eureka:
      client:
        service-url:
          #      defaultZone: http://localhost:1234/eureka
          defaultZone: http://localhost:8761/eureka
    
    #日志
    logging:
      level:
        org.springframework.cloud.gateway:
          debug
    
  • 重启eureka server和consumer以及gateway 在这里插入图片描述
  • 这时访问大写服务会报错 在这里插入图片描述

4 断言

4.1 时间断言

  • Before --> 请求时间在某个时间点之前 才会被路由
  • After --> 请求时间在某个时间点之后 才会被路由
  • Between --> 请求时间在2个时间点之间(两个时间点,分开)
spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: http://www.baidu.com
          # 时间断言
          predicates:
            - Before=2020-03-31T08:38:47+08:00

在这里插入图片描述 若是改为Before=2020-03-24T08:38:47+08:00 在这里插入图片描述

4.2 路径断言

一开始的path=get也是 就不在重复添加

spring:
  cloud:
    gateway:
      routes:
        # 路径断言 访问指定地址http://www.w3school.com.cn/tcpip/*
        # 也就是localhost:8080/tcpip/*
        - id: w3c_route
          uri: http://www.w3school.com.cn
          predicates:
            - Path=/tcpip/{segment}
  • 访问成功 在这里插入图片描述
  • 非该路径 访问失败 在这里插入图片描述

4.3 query断言

spring:
  cloud:
    gateway:
      routes:
        # 默认参数
        - id: query_route
          uri: http://httpbin.org
          predicates:
            # 可以指定参数和值 ?name=1开头的值 才允许访问
            - Query=name,1.*
  • 未加参数 在这里插入图片描述
  • 加参数1开头 成功 在这里插入图片描述 在这里插入图片描述
  • 加参数2开头 失败 在这里插入图片描述

4.4 Method断言

  • yml配置
spring:
  cloud:
    gateway:
      routes:
        - id: method_route
          uri: http://httpbin.org
          # 该网站post请求405 --> 没有post 只能用get测试 用post测试get请求404就对了
          predicates:
            - Method=GET
  • post请求时 404(若是post方法 405说明该网站没有post请求) 成功的截图就是一开始的那张不在粘贴了 在这里插入图片描述

4.5 断言组合使用

spring:
  cloud:
    gateway:
      routes:
        # 组合使用
        - id: many_route
          uri: http://httpbin.org
          predicates:
            # 可以指定参数和值 ?name=1开头的值
            - Query=name,1.*
            - Method=GET
            - After=2020-03-01T08:38:47+08:00

在这里插入图片描述

4.6 自定义路由断言

  • 配置自定义断言工厂
// 自定义路由断言工厂
// 命名需要以RoutePredicateFactory结尾 比aRoutePredicateFactory 那么yml在使用时a就是断言工厂的名字
@Component
public class CheckAuthRoutePredicateFactory extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.User> {

    public CheckAuthRoutePredicateFactory() {
        super(User.class);
    }

    // 自定义配置类
    @Override
    public Predicate<ServerWebExchange> apply(User config) {
        return exchange -> {
            System.out.println("进入apply:" + config.getName());
            if (config.getName().equals("kitty")){
                return true;
            }
            return false;
        };
    }

    public static class User{
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
  • yml配置
spring:
  cloud:
    gateway:
      routes:
        # 自定义断言工厂 -name就是之前以xxxRoutePredicateFactory的xxxx为断言工厂名
        - id: customer_route
          uri: http://httpbin.org
          predicates:
          - name: CheckAuth
            args:
              name: kitty
  • 当参数name=kitty与自定义断言工厂的getName一致时 在这里插入图片描述
  • 当参数name=kitty与自定义断言工厂的getName不一致时 在这里插入图片描述

5 过滤器

gateway过滤器分类 - GlobalFilter - GatewayFilter

5.1 AddRequestParameter过滤器

在请求添加时 自动添加额外参数 在这里插入图片描述

6 小结

  • 基本配置 启动类bean或是在yml中配置routes xxx
  • 学习了服务整合时 eureka server和provider以及gateway 依赖的添加 yml配置 连接服务 开启自动代理以及访问时服务大小写的设置 日志的设置
  • 断言的学习
    • path断言 --> url匹配
    • query断言 --> 参数匹配(自定义参数过滤规则) 类似?name=xxx
    • method断言 --> 匹配HTTP的方法
    • 时间断言 --> 之前/之后/之间
    • 组合断言 --> 之前的这些断言有机的组合
    • 自定义断言 --> 需要继承extends AbstractRoutePredicateFactory 在yml配置自定义工厂进行匹配
  • 过滤器的学习 中的AddRequestParameter 添加额外的参数