引入依赖

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

配置代理地址 

server:
  port: 80
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      routes:
      - id: baidu
        uri: https://www.baidu.com
        predicates:
        - Path=/baidu
        filters:
        #请求路径截取的功能@value截取几位
        - StripPrefix=1


当你请求http://localhost/baidu时转发https://www.baidu.com

 Eureka和Geteway合用

添加eureka依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>1.4.6.RELEASE</version>
            <!--因为和geteway中web冲突-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

配置代理服务信息

server:
  port: 80
spring:
  application:
    name: spring-cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
      - id: spring-producer
        uri: lb://spring-cloud-producer
        predicates:
        - Path=/spring-producer/**
        filters:
        #请求路径截取的功能@截取一位
        - StripPrefix=1

当你请求http://localhost/spring-producer/test时转发http://localhost/spring-cloud-producer/test

附录:

server:
  port: 8080
eureka:
  client:
    service-url:
 #指定注册中心的地址,以便使用服务发现功能
      defaultZone: http://localhost:8000/eureka/       
logging:
  level:
 #调整相 gateway 包的 log 级别,以便排查问题
    org.springframework.cloud.gateway: debug          
spring:
  cloud:
    gateway:
     discovery:
        locator:
 #是否与服务注册于发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为 false,设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能
         enabled: true
      routes:
 #我们自定义的路由 ID,保持唯一
       - id: cookie_route
  #目标服务地址
         uri: http://baidu.com
  #格式为:lb://应用注册服务名
         uri: lb://spring-cloud-producer
 

基于 Filter(过滤器):Spring Cloud Gateway 的 Filter 的生命周期不像 Zuul 的那么丰富,它只有两个:“pre” 和 “post”。
PRE: 这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等
Spring Cloud Gateway 的 Filter 分为两种:GatewayFilter 与 GlobalFilter。GlobalFilter 会应用到所有的路由上,而 GatewayFilter 将应用到单个路由或者一个分组的路由上

 
 
 
 
        filters:                         
 #AddRequestParameter 这样就会给匹配的每个请求添加上foo=bar的参数和值;证明网关在转发的过程中已经通过 filter 添加了设置的参数和值。
         - AddRequestParameter=foo, bar
 #StripPrefix Filter StripPrefix Filter 是一个请求路径截取的功能,我们可以利用这个功能来做特殊业务的转发;
这个配置的例子表示,当请求路径匹配到/name/**会将包含name和后边的字符串接去掉转发, StripPrefix=2就代表截取路径的个数,这样配置后当请求/name/bar/foo后端匹配到的请求路径就会变成http://www.baidu.com/foo
 
 
         - StripPrefix=2
 #PrefixPath Filter 的作用和 StripPrefix 正相反,是在 URL 路径前面添加一部分的前缀
         - PrefixPath=/mypath
 #限速路由器 限速在高并发场景中比较常用的手段之一,可以有效的保障服务的整体稳定性,Spring Cloud Gateway 提供了基于 Redis 的限流方案。所以我们首先需要添加对应的依赖包spring-boot-starter-data-redis-reactive
filter 名称必须是 RequestRateLimiter
redis-rate-limiter.replenishRate:允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity:令牌桶的容量,允许在一秒钟内完成的最大请求数
key-resolver:使用 SpEL 按名称引用 bean
根据请求参数中的 user 字段来限流
@Bean KeyResolver userKeyResolver()
{ return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user")); }
请求 IP 地址来限流;
@Bean KeyResolver ipKeyResolver()
{ return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName()); }
 
 
 
 
 
 
 
 
 
 
 
         - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20
             key-resolver: "#{@userKeyResolver}"
 #熔断路由器 Spring Cloud Gateway 也可以利用 Hystrix 的熔断特性,在流量过大时进行服务降级,添加上依赖 spring-cloud-starter-netflix-hystrix
配置后,gateway 将使用 myCommandName 作为名称生成 HystrixCommand 对象来进行熔断管理。
 
         - Hystrix=myCommandName
 #熔断路由器 如果想添加熔断后的回调内容。需要添加一些配置,fallbackUri: forward:/incaseoffailureusethis配置了 fallback 时要会调的路径,当调用 Hystrix 的 fallback 被调用时,请求将转发到/incaseoffailureuset这个 URI。
 
         - name: Hystrix
          args:
            name: fallbackcmd
            fallbackUri: forward:/incaseoffailureusethis
 #重试路由器 RetryGatewayFilter 是 Spring Cloud Gateway 对请求重试提供的一个 GatewayFilter Factory;Retry GatewayFilter 通过这四个参数来控制重试机制: retries, statuses, methods, 和 series;
retries:重试次数,默认值是 3 次

statuses:HTTP 的状态返回码,取值请参考:org.springframework.http.HttpStatus
methods:指定哪些方法的请求需要进行重试逻辑,默认值是 GET 方法,取值参考:org.springframework.http.HttpMethod
series:一些列的状态码配置,取值参考:org.springframework.http.HttpStatus.Series。符合的某段状态码才会进行重试逻辑,默认值是 SERVER_ERROR,值是 5,也就是 5XX(5 开头的状态码),共有5 个值
 
 
 
 
 
 
         - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY
 Predicate 介绍:Predicate 来源于 Java 8,是 Java 8 中引入的一个函数,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。可以用于接口请求参数校验、判断新老数据是否有变化需要进行更新操作。
Spring Cloud Gateway 中 Spring 利用 Predicate 的特性实现了各种路由匹配规则,有通过 Header、请求参数等不同的条件来进行作为条件匹配到对应的路由。Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理。
 
 
 
         predicates:
 通过时间匹配:Predicate 支持设置一个时间,在请求进行转发的时候,可以通过判断在这个时间之前或者之后进行转发。
示例:比如我们现在设置只有在2019年1月1日才会转发到我的网站,在这之前不进行转发,我就可以这样配置:
提示:Spring 是通过 ZonedDateTime 来对时间进行的对比,ZonedDateTime 是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类,ZonedDateTime 支持通过时区来设置时间,中国的时区是:Asia/Shanghai。
提示:After Route Predicate 是指在这个时间之后的请求都转发到目标地址。示例是指,请求时间在 2018年1月20日6点6分6秒之后的所有请求都转发到地址http://baidu.com。+08:00是指时间和UTC时间相差八个小时,时间地区为Asia/Shanghai。
提示:Before Route Predicate 刚好相反,在某个时间之前的请求的请求都进行转发。
提示:除过在时间之前或者之后外,Gateway 还支持限制路由请求在某一个时间段范围内,可以使用 Between Route Predicate 来实现。
 
 
 
 
 
 
 
         - Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]
         - After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
         - Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]
 通过 Cookie 匹配:Cookie Route Predicate 可以接收两个参数,一个是 Cookie name ,一个是正则表达式,路由规则会通过获取对应的 Cookie name 值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。测试数据:baidu=kee.e
 
         - Cookie=baidu, kee.e
 通过 Header 属性匹配:Header Route Predicate 和 Cookie Route Predicate 一样,也是接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。测试数据:X-Request-Id:666666 或者 X-Request-Id:neo
 
         - Header=X-Request-Id, \d+
 通过 Host 匹配:Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用.号作为分隔符。它通过参数中的主机地址作为匹配规则。测试数据:www.baidu.com 或者 www.baidu.com
 
         - Host=**.baidu.com
 通过请求方式匹配:可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。
         - Method=GET
 通过请求路径匹配:Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。 测试数据:/foo/1 或者 /foo/bar 
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder)
{return builder.routes() .route("path_route", r -> r.path("/about") .uri("http://www.baidu.com"))  .build();}

示例:上面配置了一个 id 为 path_route 的路由,当访问地址http://localhost:8080/about时会自动转发到地址:http://www.baidu.com/about
 
 
 
         - Path=/foo/{segment}
 通过请求参数匹配:Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。测试数据:- Query=smile 只要请求中包含 smile 属性的参数即可匹配路由; - Query=keep, pu. 只要当请求中包含 keep 属性并且参数值是以 pu 开头的长度为三位的字符串才会进行匹配和路由
 
         - Query=keep, pu.
 通过请求 ip 地址进行匹配:Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最小大小为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。测试数据:请求的远程地址是 192.168.1.10,则此路由将匹配
 
         - RemoteAddr=192.168.1.1/24
Logo

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

更多推荐