• Spring Cloud 框架 -- Spring Cloud Gateway


    Spring Cloud Gateway 介绍

    特点:

    • 限流

    • 路径重写

    • 动态路由

    • 集成 Spring Cloud DiscoveryClient

    • 集成 Hystrix 断路器

    和 zuul 对比:

    • zuul 是 Netflix 公司的开源产品,Spring Cloud Gateway 是 Spring 家族中的产品,可以和 Spring 家族中其他组件更好的融合。

    • zuul1 不支持长连接,例如 websocket

    • Spring Cloud Gateway 支持限流

    • Spring Cloud Gateway 基于 Netty 来开发,实现了异步和非阻塞,占用资源更小,性能强于 zuul。

    Spring Cloud Gateway 的基本用法

    Spring Cloud Gateway 支持两种不同的用法:

    • 编码式

    • properties / yml 配置

    编码式

    首先创建一个 Spring Boot 项目,仅添加 Spring Cloud Gateway 模块:

    项目创建成功后,在项目启动类上配置一个 RouteLocator 这样一个 Bean ,就可以实现请求转发:

    @SpringBootApplication
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    
        @Bean
        RouteLocator routeLocator(RouteLocatorBuilder builder){
            return builder.routes()
                    .route("you", r ->
                            r.path("/get").uri("http://httpbin.org"))
                    .build();
        }
    }
    

    这里利用了一个现成的接口 http://httpbin.org, 直接将 get 请求转发到这上面去。

    运行 gateway 项目。

    访问 http://localhost:8080/get, 如下图:

    如上,实现了请求转发。

    properties 配置

    注释掉启动类中的 Bean ,在 properties 配置如下:

    spring.cloud.gateway.routes[0].id=you
    spring.cloud.gateway.routes[0].uri=http://httpbin.org
    spring.cloud.gateway.routes[0].predicates[0]=Path=/get
    

    启动 gateway,访问http://localhost:8080/get,效果和上面一样。

    yml 配置

    在 resources 目录下, 新建 application.yml 文件,写入下面配置:

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

    删除原有配置文件 application.properties ,重启项目,访问 http://localhost:8080/get, 效果和上面一样。

    Spring Cloud Gateway 结合微服务

    首先给 gateway 添加依赖, 将之注册到 eureka 上。

    加依赖:

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

    加配置

    spring:
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true # 开启自动代理
      application:
        name: gateway
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:1111/eureka
    logging:
      level:
        org.springframework.cloud.gateway: debug
    

    接下来,就可以通过 gateway 访问到其他注册到 eureka 上的服务了,访问方式和 zuul 一样。

    先打开 eureka 后台 http://localhost:1111/,查看服务注册情况:

    再访问http://localhost:8080/PROVIDER/hello, 效果如下:

    注意:eureka 服务是区分大小写的,记得使用 PROVIDER 而不是 provider。

    Predicate

    用来声明匹配规则。

    通过时间匹配

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: http://httpbin.org
              predicates:
                - After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
    

    这个配置,表示,请求时间在 2021-01-01T01:01:01+08:00[Asia/Shanghai] 时间之后,才会被路由。

    除了 After 之外,还有两个关键字:

    • Before: 表示在某个时间点之前进行请求转发

    • Between:表示在两个时间点之间进行请求转发,两个时间点用 , 隔开

    也可以通过请求方式匹配,就是请求方法:

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: http://httpbin.org
              predicates:
                - Method=GET
    

    这个配置,表示只给 GET 请求进行路由。访问http://localhost:8080/get,如下图:

    通过请求路径匹配

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

    这个配置表示,路径满足 /get 这个规则,就会进行转发,如http://localhost:8080/get

    通过参数进行匹配:

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: http://httpbin.org
              predicates:
                - Query=name
    

    表示,请求中一定要有 name 参数才会进行转发,否则不会进行转发。

    也可以指定参数和参数的值。

    例如,参数的 key 为 name ,value 必须要以 java 开始:

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: http://httpbin.org
              predicates:
                - Query=name,java.*
    

    多种匹配方式可以组合使用:

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: http://httpbin.org
              predicates:
                - Query=name,java.*
                - Method=GET
                - After=2021-01-01T01:01:01+08:00[Asia/Shanghai]
    
    

    Filter

    Spring Cloud Gateway 中的过滤器分为两大类:

    • GatewayFilter: 局部路由

    • GlobalFilter: 全局路由

    如,AddRequestParameter 过滤器的使用:

    spring:
      cloud:
        gateway:
          routes:
            - id: you
              uri: lb://provider
              filters:
                - AddRequestParameter=name,you
              predicates:
                - Method=GET
    

    这个过滤器就是在请求转发路由的时候,自动额外添加参数。

    访问http://localhost:8080/hello2,效果如下:

    每天学习一点点,每天进步一点点。

  • 相关阅读:
    判断某个目录下半小时内是否有新文件
    centos 多路径下挂载磁盘目录
    rac多路径下添加lun
    FFmpeg笔记
    FFmpeg报错大全
    Eclipse 安装C语言开发环境
    乱码
    FreeSql提示“【主库】状态不可用,等待后台检查程序恢复方可使用。”错误
    JetBrains Rider安装说明
    博客园终于可以使用了
  • 原文地址:https://www.cnblogs.com/youcoding/p/13462812.html
Copyright © 2020-2023  润新知