zoukankan      html  css  js  c++  java
  • 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,效果如下:

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

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/youcoding/p/13462812.html
Copyright © 2011-2022 走看看