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
目前有两种方式进行配置:
application.yml
配置文件方式- 通过@Bean注解
RouteLocator
方法返回值
route
的组成部分
id
:路由的IDuri
:匹配路由的转发地址predicates
:配置该路由的断言,通过PredicateDefinition
类进行接收配置。- order:路由的优先级,数字越小,优先级越高。
Spring Cloud Gateway Predicates
每一个Predicate
的使用,你可以理解为:当满足这种条件后才会被转发
,如果是多个,那就是都满足的情况下被转发。
Path 方式匹配转发
我们在application.yml
配置文件内添加对应的路由配置,如下所示
spring: application: name: spring-cloud-gateway-sample cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: # 匹配路径转发 - Path=/api-boot-datasource-switch.html # 端口号 server: port: 9090
在上面的配置中,当访问http://localhost:9090/api-boot-datasource-switch.html
时就会被自动转发到http://blog.yuqiyu.com/api-boot-datasource-switch.html
,这里要注意完全匹配Path
的值时才会进行路由转发
,对应的 RouteLocator
方式该怎么进行配置
@Bean public RouteLocator routeLocator(RouteLocatorBuilder builder) { return builder.routes() .route("blog", r -> r.path("/api-boot-datasource-switch.html").uri("http://blog.yuqiyu.com")) .build(); } id:blog path:/api-boot-datasource-switch.html uri:http://blog.yuqiyu.com
Host 方式匹配转发
Spring Cloud Gateway
可以根据Host
主机名进行匹配转发,如果我们的接口只允许**.yuqiyu.com
域名进行访问,那么配置如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: - Host=**.yuqiyu.com
对应的 RouteLocator
方式该进行配置
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.host("**.yuqiyu.com") .uri("http://blog.yuqiyu.com") .order(1) .id("blog") ) .build(); }
组合示例
相同的Predicate
也可以配置多个,请求的转发是必须满足所有的Predicate
后才可以进行路由转发,组合使用示例如下所示:
spring: cloud: gateway: routes: - id: blog uri: http://blog.yuqiyu.com predicates: - Method=GET - Host=**.yuqiyu.com - Path=192.168.1.56/24
对应的 RouteLocator
方式该进行配置
@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route(r -> r.host("**.yuqiyu.com") .and().path("/api-boot-datasource-switch.html") .and().method("GET") .uri("http://blog.yuqiyu.com") .order(1) .id("blog") ) .build(); }