暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringCloud学习笔记——新服务网关Gateway断言

CodeWu 2021-01-05
368

断言工厂

新服务网关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路由定位器
*/
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- After=UTC时间格式字符串
- Path=/user/**

BeforeRoutePredicateFactory

用于断言服务在配置时间点前生效。

配置类方式创建

 /**
* 当前系统时间前1分钟内执行断言操作
* @param routeLocatorBuilder
* @return路由定位器
*/
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Before=UTC时间格式字符串
- Path=/user/**

BetweenRoutePredicateFactory

用于请求断言服务在时间区间范围内生效。

配置类方式创建

 /**
* 当前系统时间1分钟后2分钟内执行断言操作
* @param routeLocatorBuilder
* @return
*/
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Before=UTC时间格式字符串1,UTC时间格式化字符串2
- Path=/user/**

CookieRoutePredicateFactory

Cookie路由断言工厂用于判定某个Cookie参数是否满足某个正则表达式,满足时才去匹配路由。

配置类方式创建

@Configuration
public class GatewayCookieRoutePredicateConfig {
/**
* 根据Cookie参数进行Cookie路由断言
* @param builder
* @return 路由定位器
*/
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Cookie=cookies_id,user.*
- Path=/user/**

HeaderRoutePredicateFactory

判定某个请求头参数是否满足正则表达式,满足时才会去匹配路由。

配置类方式创建

@Configuration
public class GatewayHeaderRoutePredicateConfig {
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Header=header_id,^[0-9]*$
- Path=/user/**

HostRoutePredicateFactory

一个正常的网址往往需要提供主机(Host)名称或IP地址才能进行访问,Host路由断言工厂用于限制主机名称的断言。

配置类方式创建

@Configuration
public class GatewayHostRoutePredicateConfig {
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Host=**.host.com:8001,**.myhost.com:8001
- Path=/user/**

MethodRoutePredicateFactory

Method路由断言工厂用来判断HTTP的请求类型。

配置类方式创建

@Configuration
public class GatewayMethodRoutePredicateConfig {
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Method=GET
- Path=/user/**

PathRoutePredicateFactory

Path路由断言工厂通过URI路径判断是否匹配。

配置类方式创建

@Configuration
public class GatewayPathRoutePredicateConfig {
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Path=/user/info/{id},/user/userList

QueryRoutePredicateFactory

Query路由断言工厂是对请求参数的判定,分别对请求参数是否存在和请求参数值进行判定。

配置类方式创建

@Configuration
public class GatewayQueryRoutePredicateConfig {
/**
*
* @param builder
* @return
*/
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Path=/user/**
- Query=queryParam,^[0-9]*$
# - Query=queryParam

RemoteAddrRoutePredicateFactory

用于断言远程服务器地址。

配置类方式创建

@Configuration
public class GatewayRemoteAddrRoutePredicateConfig {
@Bean
public 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-route
uri:localhost://8100/user
predicates:
- Path=/user/**
- RemoteAddr=192.168.0.1/10,192.168.0.1/32

WeightRoutePredicateFactory

用于根据权重进行断言和服务路由。

配置类方式创建

@Configuration
public class GatewayWeightRoutePredicateConfig {
@Bean
public 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-route1
uri:localhost://8100/user
predicates:
- Path=/user/**
- Weight=user_group,80
- id:user-weight-route2
uri:localhost://8200/user
predicates:
- Path=/user/**
- Weight=user_group,20


文章转载自CodeWu,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论