spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Cookie=username,yehongzhi
使用POSTMAN发送带有Cookie里username=yehongzhi的请求 。
文章插图
Header Route Predicate带有指定请求头的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Header=X-Id, d+
使用POSTMAN发送请求头带有X-Id的请求 。文章插图
Host Route Predicate带有指定Host的请求会匹配该路由 。
spring:cloud:gateway:routes:- id: user_getListuri: http://localhost:8080/user/getListpredicates:- Host=**.yehongzhi.com
使用POSTMAN发送请求头带有Host=www.yehongzhi.com的请求 。文章插图
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方式发送请求 。文章插图
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地址,发送请求 。文章插图
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, 2
RemoteAddr Route Predicate从指定的远程地址发起的请求可以匹配该路由 。spring:cloud:gateway:routes:- id: user_1uri: http://localhost:8080/user/getListpredicates:- RemoteAddr=192.168.1.4
使用浏览器请求 。文章插图
组合使用
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 。文章插图
自定义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,这是一个约定的配置 。
推荐阅读
- 记一次 .NET 某招聘网后端服务 内存暴涨分析
- 中考志愿服务的四大技巧
- 网关就是路由器?错了,区别很多
- 使用MobaXterm管理远程Linux服务器
- 服务器搭建网站时,是选http还是https?
- Django项目部署到服务器
- 想要管理Linux服务器,先搞清楚它的目录结构
- 为什么微服务要有独立数据库
- 95598水费查询网?95598水费网上查询自来水服务热线
- 三星空调售后服务维修中心河西区在哪-,西安三星冰箱售后维修电话-