一 predict案例场景
1.1 说明
本博客所有案例操作,都在上篇博客的基础上进行:
springcloud第4季 springcloud-gateway网关的功能作用_cloud gateway干嘛的-CSDN博客
1.2 案例前提准备
1. 启动zipkin服务
2.启动consul服务
3.启动3个应用服务
二 precdict断言操作案例
2.1 设置时间判断约束
1.配置如下
2.访问
3.修改限制时间
4.再次访问
2.2 断言其他场景
1.设置cookie;
2.设置header属性
3.设置域名
4.设置参数
- #- Cookie=username,zzyy # - Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式 #- Host=**.atguigu.com #- Query=username, \d+ # 要有参数名username并且值还要是整数才能路由 #- RemoteAddr=192.168.124.1/24 # 外部访问我的IP限制,最大跨度不超过32,目前是1~24它们是 CIDR 表示法。
5.截图如下:
2.3 自定义断言的案例
2.3.1 实现原理
1.新建类名xxx,需要以RoutePredicateFactory结尾,并继承AbstractRoutePredicateFactory类。
2.重写apply方法
3.新建apply方法所需要的静态内部类MyRoutePredicateFactory.Config.
这个Config类就是我们的路由断言规则。
4.从参数构造方法,内部调用super
5.重写apply方法第二版
2.3.2 实施步骤
2.3.2.1 工程配置
1.消费端
2.fegin接口
3.网关
a)自定义过滤断言
package com.jurf.ms.gateway6666.config;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
/**
* @auther zzyy
* @create 2023-12-31 11:11
* 需求说明:自定义配置会员等级userTpye,按照钻/金/银和yml配置的会员等级,以适配是否可以访问
*/
@Component
public class MyJurfRoutePredicateFactory extends AbstractRoutePredicateFactory<MyJurfRoutePredicateFactory.Config>
{
public MyJurfRoutePredicateFactory()
{
super(Config.class);
}
//这个Config类就是我们的路由断言规则,重要
@Validated
public static class Config
{
@Setter@Getter@NotEmpty
private String cityName; //钻/金/银和yml配置的会员等级
}
@Override
public List<String> shortcutFieldOrder() {
return Collections.singletonList("cityName");
}
@Override
public Predicate<ServerWebExchange> apply(Config config)
{
return new Predicate<ServerWebExchange>()
{
@Override
public boolean test(ServerWebExchange serverWebExchange)
{
//检查request的参数里面,userType是否为指定的值,符合配置就通过
//http://localhost:9527/pay/gateway/get/1?cityName=sz
String userType = serverWebExchange.getRequest().getQueryParams().getFirst("cityName");
if (userType == null) {
return false;
}
//如果说参数存在,就和config的数据进行比较
if(userType.equalsIgnoreCase(config.getCityName())){
return true;
}
return false;
}
};
}
}
b)配置文件: key为自定义断言类的前缀,值为请求参数值。
4.提供者
2.3.2.2 工程测试
1.启动consul
2.启动zipkin
3.启动各个服务
4.请求地址: