spring cloud gateway: api网关

zuul已经不在维护
简单介绍:
    zuul 在springcloud刚推出时承担着api网关的作用,作为微服务架构中的服务提供了统一访问入口,客户端都是通过网关经行路由访问服务,而不是直接访问服务。网关有点类似于web开发中
的拦截器与过滤器,但又不同于拦截器与过滤器。它不仅能实现拦截器与过滤器的功能,还具有负载均衡、校验过滤、服务容错和服务聚合的功能。
(注:过滤器在进入service前执行,拦截器在dispartservlet之后controller之气执行)

目录

简介

    gateway是目前较流行的路由网关,不仅具有zuul的功能特性,还提供了一些更加强大的功能特性。
特性:
    ①动态路由能够匹配任何请求属性
    ②可以对路由进行指定的断言(Predicate)和过滤器(filter)
    ③具有服务发现的功能
    ④请求限流功能与路径重写

依赖

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

启动时可能还会出现如下情况:
在这里插入图片描述

请将web依赖去除即可

配置路由

第一种方式yml文件配置方式

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: target  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:11000
          predicates:
            - Path=/getRibbon/**, /success/**

第二种Java bean配置方式

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator targetRouteLocator(RouteLocatorBuilder builder){
        return builder
                .routes().route("target", r -> r.path("/getRibbon/**", "/success/**")
                .uri("http://localhost:11000")).
                build();
    }
}

示例

原需要访问的url

在这里插入图片描述

配置gateway后访问的url

在这里插入图片描述

    经过gateway路由后可以访问到需要访问的接口。

各种路由设置

指定路径的请求会匹配

          predicates:
            - Path=/getRibbon/**, /success/**

指定时间后

          predicates:
            - Path=/getRibbon/**, /success/**
            - After=2020-10-08T16:30:00+08:00[Asia/Shanghai]

指定时间前

          predicates:
            - Path=/getRibbon/**, /success/**
            - Before=2020-10-08T16:30:00+08:00[Asia/Shanghai]

指定时间段内

          predicates:
            - Path=/getRibbon/**, /success/**
            - Between=2020-10-08T16:30:00+08:00[Asia/Shanghai],2020-10-09T16:30:00+08:00[Asia/Shanghai]

指定cookie的匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Cookie=username,zxf

指定header的匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Header=token,1234567890

指定host的匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Host=**.baidu.com

指定method类型匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Method=GET

指定method类型匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Method=GET

指定查询参数的匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - Query=username

指定远程地址发起的请求的匹配

          predicates:
            - Path=/getRibbon/**, /success/**
            - RemoteAddr=192.168.190.128

权重路由

        - id: target1  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://127.0.0.1:11000
          predicates:
            - Path=/getRibbon/**, /success/**
            - Weight=group1,6 #60%的请求路由到此路径下
        - id: target1  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://127.0.0.1:12000
          predicates:
            - Path=/getRibbon/**, /success/**
            - Weight=group1,4 #40%的请求路由到此路径下

给请求添加参数过滤器

- id: target  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://127.0.0.1:11000
          predicates:
            - Path=/getRibbon/**, /success/**
          filters:
            - AddRequestParameter=id,12121212 # 相当于给请求添加了一个参数名为id,值为12121212的请求参数

开启服务降级功能

引入服务容错依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
配置
- id: target  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://127.0.0.1:11000
          filters:
            - name: Hystrix
              args:
                name: fallbackcmd
                fallbackUri: forward:/fallback

开启限流过滤器(RequestRateLimiter)功能

引入限流过滤器(RequestRateLimiter)依赖与redis依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
     <groupId>org.springframework.data</groupId>
     <artifactId>spring-data-redis</artifactId>
</dependency>
配置
routes:
        - id: target  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://127.0.0.1:11000
          filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1 # 每秒允许处理的请求数量
                redis-rate-limiter.burstCapacity: 2 # 每秒最大处理的请求数量
                key-resolver: "#{@ipKeyResolver}" # 限流策略
          predicates:
            - Method=GET # 必须存在
      redis:
        host: 192.168.137.130
效果图示

多次对同一个接口进行请求,返回HTTP ERROR 429

在这里插入图片描述
控制台打印日志
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐