服务网关Gateway怎么玩?( 二 )


spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Cookie=username,yehongzhi使用POSTMAN发送带有Cookie里username=yehongzhi的请求 。

服务网关Gateway怎么玩?

文章插图
 
Header Route Predicate带有指定请求头的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Header=X-Id, d+使用POSTMAN发送请求头带有X-Id的请求 。
服务网关Gateway怎么玩?

文章插图
 
Host Route Predicate带有指定Host的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Host=**.yehongzhi.com使用POSTMAN发送请求头带有Host=www.yehongzhi.com的请求 。
服务网关Gateway怎么玩?

文章插图
 
Path Route Predicate发送指定路径的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Path=/user/getList直接在浏览器输入该地址http://localhost:9201/user/getList,即可访问 。
Method Route Predicate发送指定方法的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Method=POST用POSTMAN以POST方式发送请求 。
服务网关Gateway怎么玩?

文章插图
 
Query Route Predicate带指定查询参数的请求可以匹配该路由 。
spring:cloud:gateway:routes:- id: user_query_byNameuri: http://localhost:8080/user/query/byNamepredicates:- Query=name在浏览器输入http://localhost:9201/user/query/byName?name=tom地址,发送请求 。
服务网关Gateway怎么玩?

文章插图
 
Weight Route Predicate使用权重来路由相应请求,以下配置表示有80%的请求会被路由到localhost:8080,20%的请求会被路由到localhost:8081 。
spring:cloud:gateway:routes:- id: user_1uri: http://localhost:8080predicates:- Weight=group1, 8- id: user_2uri: http://localhost:8081predicates:- Weight=group1, 2RemoteAddr Route Predicate从指定的远程地址发起的请求可以匹配该路由 。
spring:cloud:gateway:routes:- id: user_1uri: http://localhost:8080/user/getListpredicates:- RemoteAddr=192.168.1.4使用浏览器请求 。
服务网关Gateway怎么玩?

文章插图
 
组合使用spring:cloud:gateway:routes:- id: user_1uri: http://localhost:8080/user/getListpredicates:- RemoteAddr=192.168.1.4- Method=POST- Cookie=username,yehongzhi- Path=/user/getList使用POSTMAN发起请求,使用POST方式,uri是/user/getList,带有Cookie,RemoteAddr 。
服务网关Gateway怎么玩?

文章插图
 
自定义Predicate如果我们需要自定义Predicate,怎么玩呢?其实很简单,看源码,有样学样,需要继承AbstractRoutePredicateFactory类 。
下面举个例子,需求是token值为abc的则匹配路由,怎么写呢,请看代码:
@Componentpublic class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> {public static final String TOKEN_KEY = "tokenValue";public TokenRoutePredicateFactory() {//当前类的Config类,会利用反射创建Config并赋值,在apply传回来super(TokenRoutePredicateFactory.Config.class);}@Overridepublic List<String> shortcutFieldOrder() {//"tokenValue"跟Config的接收字段一致return Arrays.asList(TOKEN_KEY);}@Overridepublic Predicate<ServerWebExchange> apply(Config config) {//这里获取的config对象就是下面自定义的Config对象return new Predicate<ServerWebExchange>() {@Overridepublic boolean test(ServerWebExchange exchange) {MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();//获取请求参数String value = https://www.isolves.com/it/wl/zs/2021-11-01/params.getFirst("token");//请求参数和配置文件定义的token进行对比,相等则返回truereturn config.getTokenValue() != null && config.getTokenValue().equals(value);}};} //用来接收配置文件定义的值public static class Config {private String tokenValue;public String getTokenValue() {return tokenValue;}public void setTokenValue(String tokenValue) {this.tokenValue = tokenValue;}}}这里需要注意的一点是类名必须是RoutePredicateFactory结尾,前面的则作为配置名 。比如TokenRoutePredicateFactory的配置名则为Token,这是一个约定的配置 。


推荐阅读