springcloud组件gateway断⾔(Predicate)
Spring Cloud Gateway是SpringCloud的全新⼦项⽬,该项⽬基于Spring5.x、SpringBoot2.x技术版本进⾏编写,意在提供简单⽅便、可扩展的统⼀API 路由管理⽅式。
概念解释:
Route(路由):路由是⽹关的基本单元,由ID、URI、⼀组Predicate、⼀组Filter组成,根据Predicate进⾏匹配转发。
Predicate(谓语、断⾔):路由转发的判断条件,⽬前SpringCloud Gateway⽀持多种⽅式,常见如:Path、Query、Method、Header等。
Filter(过滤器):过滤器是路由转发请求时所经过的过滤逻辑,可⽤于修改请求、响应内容。
开始使⽤
Spring Cloud Gateway⽬前有两种⽅式进⾏配置:
通过@Bean注解RouteLocator ⽅法返回值
route的组成部分springcloud和springboot
id:路由的ID
uri:匹配路由的转发地址
predicates:配置该路由的断⾔,通过PredicateDefinition类进⾏接收配置。
order:路由的优先级,数字越⼩,优先级越⾼。
Spring Cloud Gateway Predicates
每⼀个Predicate的使⽤,你可以理解为:当满⾜这种条件后才会被转发,如果是多个,那就是都满⾜的情况下被转发。
Path ⽅式匹配转发
我们在l配置⽂件内添加对应的路由配置,如下所⽰
spring:
application:
name: spring-cloud-gateway-sample
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
# 匹配路径转发
- Path=/api-boot-datasource-switch.html
# 端⼝号
server:
port: 9090
在上⾯的配置中,当访问localhost:9090/api-boot-datasource-switch.html时就会被⾃动转发到blog.yuqiyu/api-boot-datasource-switch.html,这⾥要注意完全匹配Path的值时才会进⾏路由转发
,对应的RouteLocator⽅式该怎么进⾏配置
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
utes()
.route("blog", r ->
r.path("/api-boot-datasource-switch.html").uri("blog.yuqiyu"))
.build();
}
id:blog
path:/api-boot-datasource-switch.html
uri:blog.yuqiyu
Host ⽅式匹配转发
Spring Cloud Gateway可以根据Host主机名进⾏匹配转发,如果我们的接⼝只允许**.yuqiyu域名进⾏访问,那么配置如下所⽰:spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Host=**.yuqiyu
对应的RouteLocator⽅式该进⾏配置
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return  utes()
.route(r -> r.host("**.yuqiyu")
.uri("blog.yuqiyu")
.
order(1)
.id("blog")
)
.build();
}
组合⽰例
相同的Predicate也可以配置多个,请求的转发是必须满⾜所有的Predicate后才可以进⾏路由转发,组合使⽤⽰例如下所⽰:spring:
cloud:
gateway:
routes:
- id: blog
uri: blog.yuqiyu
predicates:
- Method=GET
- Host=**.yuqiyu
- Path=192.168.1.56/24
对应的RouteLocator⽅式该进⾏配置
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return  utes()
.route(r -> r.host("**.yuqiyu")
.and().path("/api-boot-datasource-switch.html")
.
and().method("GET")
.uri("blog.yuqiyu")
.order(1)
.id("blog")
)
.build();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。