SpringCloud:⽹关getway路由转发
Spring Cloud Gateway 是 Spring Cloud 的⼀个全新项⽬,该项⽬是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的⽹关,它旨在为微服务架构提供⼀种简单有效的统⼀的 API 路由管理⽅式。
Spring Cloud Gateway 作为 Spring Cloud ⽣态系统中的⽹关,⽬标是替代 Netflix Zuul,其不仅提供统⼀的路由⽅式,并且基于 Filter 链的⽅式提供了⽹关基本的功能,例如:安全,监控/指标,和限流。
相关概念:
Route(路由):这是⽹关的基本构建块。它由⼀个 ID,⼀个⽬标 URI,⼀组断⾔和⼀组过滤器定义。如果断⾔为真,则路由匹配。Predicate(断⾔):这是⼀个 Java 8 的 Predicate。输⼊类型是⼀个 ServerWebExchange。我们可以使⽤它来匹配来⾃ HTTP 请求的任何内容,例如 headers 或参数。
Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使⽤它修改请求和响应。
快速上⼿
添加项⽬需要使⽤的依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--将微服务provider注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
启动类
@EnableDiscoveryClient
@SpringBootApplication
public class GetwayApplication {
public static void main(String[] args){
SpringApplication.run(GetwayApplication.class, args);
}
}
先来测试⼀个最简单的请求转发。
server:
port:8080
spring:
cloud:
gateway:
routes:
cci指标详解-id: neo_route
uri: www.baidu
predicates:
- Path=/spring-cloud
动态路由服务器名转发
server:
port:9999
spring:
application:
name: api-gateway
cloud:
gateway:
discovery:
locator:
# 打开后只要注册过的服务可以通过服务名转发(服务名称⼩写,⽆需配置路由)
# ⽹关地址/服务名称/⽅法如(localhost:9999/producter-service/producter/list)
enabled:true
lower-case-service-id:true #服务名⼩写
⼏种匹配规则
Predicate ⽀持设置⼀个时间,在请求进⾏转发的时候,可以通过判断在这个时间之前或者之后进⾏转
发。⽐如我们现在设置只有在2019年1⽉1⽇才会转发到我的⽹站,在这之前不进⾏转发,我就可以这样配置:
spring:
cloud:
gateway:
routes:
-id: time_route
uri: ityouknow
predicates:
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
Spring 是通过 ZonedDateTime 来对时间进⾏的对⽐,ZonedDateTime 是 Java 8 中⽇期时间功能⾥,⽤于表⽰带时区的⽇期与时间信息的类,ZonedDateTime ⽀持通过时区来设置时间,中国的时区
历史朝代是:Asia/Shanghai。
Before Route Predicate 刚好相反,在某个时间之前的请求的请求都进⾏转发。我们把上⾯路由规则中的 After 改为 Before,如下:
spring:
cloud:
gateway:
routes:
-id: after_route
uri: ityouknow
predicates:
- Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]
除过在时间之前或者之后外,Gateway 还⽀持限制路由请求在某⼀个时间段范围内,可以使⽤ Between Route Predicate 来实现。
spring:
cloud:
gateway:
routes:
-id: after_route
uri: ityouknow
predicates:
- 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 值和正则表达式去匹配,如果匹配上就会执⾏路由,如果没有匹配上则不执⾏。
-id: cookie_route
uri: ityouknow
predicates:
- Cookie=ityouknow, kee.e
使⽤ curl 测试,命令⾏输⼊:
通过 Header 属性匹配
Header Route Predicate 和 Cookie Route Predicate ⼀样,也是接收 2 个参数,⼀个 header 中属性
名称和⼀个正则表达式,这个属性值和正则表达式匹配则执⾏。
spring:
cloud:
gateway:
routes:
-id: header_route
uri: ityouknow
predicates:
- Header=X-Request-Id, \d+
qq面板皮肤怎么弄使⽤ curl 测试,命令⾏输⼊:
通过 Host 匹配
Host Route Predicate 接收⼀组参数,⼀组匹配的域名列表,这个模板是⼀个 ant 分隔的模板,⽤.号作为分隔符。它通过参数中的主机地址作为匹配规则。
spring:
cloud:
gateway:
routes:
-id: host_route
uri: ityouknow
predicates:
- Host=**.ityouknow
使⽤ curl 测试,命令⾏输⼊:
通过请求⽅式匹配
可以通过是 POST、GET、PUT、DELETE 等不同的请求⽅式来进⾏路由。
spring:
cloud:
gateway:
routes:
-id: method_route
uri: ityouknow
predicates:
- Method=GET
使⽤ curl 测试,命令⾏输⼊:
返回 404 没有到,证明没有匹配上路由
通过请求路径匹配
Path Route Predicate 接收⼀个匹配路径的参数来判断是否⾛路由。
-id: host_route
uri: ityouknow
初中信息技术教学计划predicates:
- Path=/foo/{segment}
如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。
使⽤ curl 测试,命令⾏输⼊:
通过请求参数匹配
Query Route Predicate ⽀持传⼊两个参数,⼀个是属性名⼀个为属性值,属性值可以是正则表达式。
spring:
cloud:
gateway:
routes:
-id: query_route
uri: ityouknow
predicates:
- Query=smile
这样配置,只要请求中包含 smile 属性的参数即可匹配路由。
使⽤ curl 测试,命令⾏输⼊:
curl localhost:8080?smile=x&id=2
经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。
刀郎的全部歌曲 mp3
还可以将 Query 的值以键值对的⽅式进⾏配置,这样在请求过来时会对属性值和正则进⾏匹配,匹配上才会⾛路由。
spring:
cloud:
gateway:
routes:
-id: query_route
uri: ityouknow
predicates:
- Query=keep, pu.
这样只要当请求中包含 keep 属性并且参数值是以 pu 开头的长度为三位的字符串才会进⾏匹配和路由。
使⽤ curl 测试,命令⾏输⼊:
curl localhost:8080?keep=pub
测试可以返回页⾯代码,将 keep 的属性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进⾏路由。
通过请求 ip 地址进⾏匹配
Predicate 也⽀持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号(IPv4 或 IPv6 )字符串的列表(最⼩⼤⼩为1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是⼦⽹掩码)。
spring:
cloud:
gateway:
routes:
-
id: remoteaddr_route
uri: ityouknow
predicates:
- RemoteAddr=192.168.1.1/24
可以将此地址设置为本机的 ip 地址进⾏测试。
curl localhost:8080
果请求的远程地址是 192.168.1.10,则此路由将匹配。
组合使⽤
上⾯为了演⽰各个 Predicate 的使⽤,我们是单个单个进⾏配置测试,其实可以将各种 Predicate 组合起来⼀起使⽤。例如:
spring:
cloud:
gateway:
routes:
-id: host_foo_path_headers_to_httpbin泰坦尼克号电影简介
uri: ityouknow
predicates:
- Host=**.
- Path=/headers
- Method=GET
- Header=X-Request-Id, \d+
- Query=foo, ba.
- Query=baz
-
Cookie=chocolate, ch.p
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
各种 Predicates 同时存在于同⼀个路由时,请求必须同时满⾜所有的条件才被这个路由匹配。
⼀个请求满⾜多个路由的谓词条件时,请求只会被⾸个成功匹配的路由转发
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论