• gateway学习笔记


    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配置

    我们访问目标地址http://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 添加额外的参数
    作者:以罗伊
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    为什么用strlcpy取代strncpy
    linux系统调用和库函数调用的区别
    VC、PE和天使投资是什么意思?有什么区别?
    AWS使用心得:当初我曾错过的那些宝贵经验
    bzoj 2208: [Jsoi2010]连通数
    android学习笔记(5)Activity生命周期学习
    Nginx 进程间通信
    手写一个节点大小平衡树(SBT)模板,留着用
    JavaFX学习之道:JavaFX之TableView
    Docker 命令行和后台參数
  • 原文地址:https://www.cnblogs.com/my-ordinary/p/12567302.html
Copyright © 2020-2023  润新知