初探spring-cloud-gateway
引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>配置代理地址server:port: 80spring:applica.
·
引入依赖
<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”。 | |||||||||||||||||||
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 |
更多推荐
已为社区贡献4条内容
所有评论(0)