
断言工厂
在新服务网关Gateway初识的Gateway执行流程章节中,提到过Gateway接受到服务调用请求后,会根据服务调用请求PATH与配置文件中配置的断言类型进行匹配,通过RoutePredicateHandlerMapping转发至不同类型的断言处理类进行具体的断言处理。
断言工厂分类如下:
类型 | 断言类 | 断言类描述 |
DateTime | AfterRoutePredicateFactory | 服务调用请求在配置时间后生效 |
BeforeRoutePredicateFactory | 服务调用请求在配置时间前生效 | |
BetweenRoutePredicateFactory | 服务调用请求在配置时间范围内生效 | |
Cookie | CookieRoutePredicateFactory | 携带的cookie信息满足配置值生效 |
Header | HeaderRoutePredicateFactory | 携带的Header信息满足配置值生效 |
Host | HostRoutePredicateFactory | 携带的Host信息满足配置值生效 |
Method | MethodRoutePredicateFactory | 携带Method信息满足配置值生效 |
Path | PathRoutePredicateFactory | 请求路径满足配置值生效 |
Query | QueryRoutePredicateFactory | 请求参数满足配置值生效 |
RemoteAddr | RemoteAddrRoutePredicateFactory | 请求地址满足配置值生效 |
Weight | WeightRoutePredicateFactory | 根据权重路由至不同的服务实例 |
AfterRoutePredicateFactory
用于断言服务调用请求在配置时间点后生效。
配置类方式创建
/*** 当前系统时间2分钟内执行断言操作* @param routeLocatorBuilder* @return路由定位器*/@Beanpublic RouteLocator customAfterRouteLocator(RouteLocatorBuilder routeLocatorBuilder){//获取当前系统时间并设置服务路由2分钟后失效ZonedDateTime dateTime= LocalDateTime.now().plusMinutes(2).atZone(ZoneId.systemDefault());/*** 为Gateway路由构建器创建路由规则* id:请求路径* after:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为After时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return routeLocatorBuilder.routes().route("/user/**",r->r.after(dateTime).uri("localhost://8100/user")).build();}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-after-routeuri:localhost://8100/userpredicates:- After=UTC时间格式字符串- Path=/user/**
BeforeRoutePredicateFactory
用于断言服务在配置时间点前生效。
配置类方式创建
/*** 当前系统时间前1分钟内执行断言操作* @param routeLocatorBuilder* @return路由定位器*/@Beanpublic RouteLocator custorBeforeRouteLocator(RouteLocatorBuilder routeLocatorBuilder){//获取当前系统时间ZonedDateTime dateTime=LocalDateTime.now().plusMinutes(1).atZone(ZoneId.systemDefault());/*** 为Gateway路由构建器创建路由规则* id:请求路径* before:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为before时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return routeLocatorBuilder.routes().route("/user/**",r->r.before(dateTime).uri("localhost://8100/user")).build();}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-before-routeuri:localhost://8100/userpredicates:- Before=UTC时间格式字符串- Path=/user/**
BetweenRoutePredicateFactory
用于请求断言服务在时间区间范围内生效。
配置类方式创建
/*** 当前系统时间1分钟后2分钟内执行断言操作* @param routeLocatorBuilder* @return*/@Beanpublic RouteLocator custorBetweenRouteLocator(RouteLocatorBuilder routeLocatorBuilder){//获取当前系统时间ZonedDateTime dateTime=LocalDateTime.now().plusMinutes(1).atZone(ZoneId.systemDefault());//获取当前系统时间ZonedDateTime dateTime2=LocalDateTime.now().plusMinutes(2).atZone(ZoneId.systemDefault());/*** 为Gateway路由构建器创建路由规则* id:请求路径* between:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为before时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return routeLocatorBuilder.routes().route("/user/**",r->r.between(dateTime,dateTime2).uri("localhost://8100/user")).build();}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-between-routeuri:localhost://8100/userpredicates:- Before=UTC时间格式字符串1,UTC时间格式化字符串2- Path=/user/**
CookieRoutePredicateFactory
Cookie路由断言工厂用于判定某个Cookie参数是否满足某个正则表达式,满足时才去匹配路由。
配置类方式创建
@Configurationpublic class GatewayCookieRoutePredicateConfig {/*** 根据Cookie参数进行Cookie路由断言* @param builder* @return 路由定位器*/@Beanpublic RouteLocator customCookieRouteLocator(RouteLocatorBuilder builder){/*** 为Gateway路由构建器创建路由规则* id:请求路径* cookie:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为cookie并且cookies_id参数值为user.*时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.cookie("cookies_id","user.*").uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-cookie-routeuri:localhost://8100/userpredicates:- Cookie=cookies_id,user.*- Path=/user/**
HeaderRoutePredicateFactory
判定某个请求头参数是否满足正则表达式,满足时才会去匹配路由。
配置类方式创建
@Configurationpublic class GatewayHeaderRoutePredicateConfig {@Beanpublic RouteLocator customHeaderRouteLocator(RouteLocatorBuilder builder){String regexString="^[0-9]*$";//是否全由数字组成/*** 为Gateway路由构建器创建路由规则* id:请求路径* header:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为header并且header_id参数值为数字时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.header("header_id",regexString).uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-header-routeuri:localhost://8100/userpredicates:- Header=header_id,^[0-9]*$- Path=/user/**
HostRoutePredicateFactory
一个正常的网址往往需要提供主机(Host)名称或IP地址才能进行访问,Host路由断言工厂用于限制主机名称的断言。
配置类方式创建
@Configurationpublic class GatewayHostRoutePredicateConfig {@Beanpublic RouteLocator customHostRouteLocator(RouteLocatorBuilder builder){//与host文件配置信息相同String hostName1="**.host.com:8001";String hostName2="**.myhost.com:8001";/*** 为Gateway路由构建器创建路由规则* id:请求路径* host:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为host并且host参数值能够与hostName1及hostName2匹配时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.host(hostName1,hostName2).uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-host-routeuri:localhost://8100/userpredicates:- Host=**.host.com:8001,**.myhost.com:8001- Path=/user/**
MethodRoutePredicateFactory
Method路由断言工厂用来判断HTTP的请求类型。
配置类方式创建
@Configurationpublic class GatewayMethodRoutePredicateConfig {@Beanpublic RouteLocator customMethodRouteLocator(RouteLocatorBuilder builder){/*** 为Gateway路由构建器创建路由规则* id:请求路径* method:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为method并且请求方式为GET时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.method(HttpMethod.GET).uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-method-routeuri:localhost://8100/userpredicates:- Method=GET- Path=/user/**
PathRoutePredicateFactory
Path路由断言工厂通过URI路径判断是否匹配。
配置类方式创建
@Configurationpublic class GatewayPathRoutePredicateConfig {@Beanpublic RouteLocator customPathRouteLocator(RouteLocatorBuilder builder){String path1="/user/info/{id}";String path2="/user/userList";return builder.routes().route("/user/**",r->r.path(path1,path2).uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-path-routeuri:localhost://8100/userpredicates:- Path=/user/info/{id},/user/userList
QueryRoutePredicateFactory
Query路由断言工厂是对请求参数的判定,分别对请求参数是否存在和请求参数值进行判定。
配置类方式创建
@Configurationpublic class GatewayQueryRoutePredicateConfig {/**** @param builder* @return*/@Beanpublic RouteLocator customQueryParamRouteLocator(RouteLocatorBuilder builder){String regexStr="^[0-9]*$";//0-9的数字组成查询参数内容/*** 为Gateway路由构建器创建路由规则* id:请求路径* query:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为query并且queryParam参数值为数字组成时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.query("queryParam",regexStr).uri("localhost://8100/user")).build();/*** 为Gateway路由构建器创建路由规则* id:请求路径* query:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为query并且queryParam参数值存在时服务调用请求转发至用户服务的服务实例localhost://8100/user*///return builder.routes().route("/user/**",//r->r.query("queryParam").uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-query-routeuri:localhost://8100/userpredicates:- Path=/user/**- Query=queryParam,^[0-9]*$# - Query=queryParam
RemoteAddrRoutePredicateFactory
用于断言远程服务器地址。
配置类方式创建
@Configurationpublic class GatewayRemoteAddrRoutePredicateConfig {@Beanpublic RouteLocator customRemoteAddrRouteLocator(RouteLocatorBuilder builder){String remoteAddr1="192.168.0.1/10";String remoteAddr2="192.168.0.1/32";/*** 为Gateway路由构建器创建路由规则* id:请求路径* remoteAddr:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/**时,断言类型为remoteAddr并且服务实例地址与参数值属于同一个网段时服务调用请求转发至用户服务的服务实例localhost://8100/user*/return builder.routes().route("/user/**",r->r.remoteAddr(remoteAddr1,remoteAddr2).uri("localhost://8100/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-remoteAddr-routeuri:localhost://8100/userpredicates:- Path=/user/**- RemoteAddr=192.168.0.1/10,192.168.0.1/32
WeightRoutePredicateFactory
用于根据权重进行断言和服务路由。
配置类方式创建
@Configurationpublic class GatewayWeightRoutePredicateConfig {@Beanpublic RouteLocator customWeightRouteLocator(RouteLocatorBuilder builder){String groupName="user_group";//分组名称String path="/user/info/{param}";//请求路径/*** 为Gateway路由构建器创建路由规则* id:请求路径* path:断言类型* weight:断言类型* uri:服务实例调用地址*本例中的路由规则:当服务请求路径为/user/info/{id}时,断言类型为Weight时分组名称相同权重不同,路由到不同端口的服务实例执行服务调用操作*/return builder.routes().route("user_info_v1",r1->r1.path(path).and().weight(groupName,80).uri("localhost://8100/user")).route("user_info_v2",r2->r2.path(path).and().weight(groupName,20).uri("localhost://8200/user")).build();}}
配置文件方式创建
spring:cloud:gateway:routes:- id:user-weight-route1uri:localhost://8100/userpredicates:- Path=/user/**- Weight=user_group,80- id:user-weight-route2uri:localhost://8200/userpredicates:- Path=/user/**- Weight=user_group,20




