springcloud gateway自定义断言规则详解,以后缀结尾进行路由

网友投稿 1204 2022-12-02

springcloud gateway自定义断言规则详解,以后缀结尾进行路由

springcloud gateway自定义断言规则详解,以后缀结尾进行路由

目录springcloud gateway自定义断言规则,后缀结尾进行路由1.新建一个路由断言工厂ExtCheckRoutePredicateFactory2.修改gateway配置3.修改gateway源码,将自定义断言类加到系统 predicates里Gateway自定义路由断言工厂类application.yml文件路由断言工厂配置类

springcloud gateway自定义断言规则,后缀结尾进行路由

因工作需要,需要使用springcloud gateway ,以.html结尾的进行路由进行websocket转发。

gateway自带的8种路由规则都不能满足,故需要自定义断言规则。

1.新建一个路由断言工厂ExtCheckRoutePredicateFactory

@Component

public class ExtCheckRoutePredicateFactory extends AbstractRoutePredicateFactory {

public ExtCheckRoutePredicateFactory() {

super(Config.class);

}

@Override

public Predicate apply(Config config) {

return new Predicate() {

@Override

public boolean test(ServerWebExchange serverWebExchange) {

String url=serverWebExchange.getRequest().getURI().toString();

if(url.endsWith(".html")){

return true;

}

return false;

}

};

}

public static class Config{

private String name;

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

}

}

如果以.html结尾,则匹配此路由

2.修改gateway配置

gateway:

routes:

- id: abc

uri: http://localhost:8080

prJvagPkcneXedicates:

- name: ExtCheck

ExtCheck即是我们新建断言工厂的前缀名,自动识别的。

这时运行发现,系统根本找不到我们自定义的断言类。

需要第三步

3.修改gateway源码,将自定义断言类加到系统 predicates里

@Bean

public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,

List gatewayFilters,

List predicates,

RouteDefinitionLocator routeDefinitionLocator,

ConfigurationService configurationService) {

predicates.add(new ExtCheckRoutePredicateFactory());

return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates,

gatewayFilters, properties, configurationService);

}

再次运行,成功根据.html后缀转发,done!

Gateway自定义路由断言工厂类

application.yml文件

server:

port: 7000

spring:

zipkin:

base-url: http://127.0.0.1:9411/ #zipkin server的请求地址

discoveryClientEnabled: false #让nacos把它当成一个URL,而不要当做服务名

sleuth:

sampler:

probability: 1.0 #采样的百分比

application:

name: api-gateway

cloud:

nacos:

discovery:

server-addr: localhost:8848 # 将gateway注册到nacos

gateway:

discovery:

locator:

enabled: true # 让gateway从nacos中获取服务信息

routes:

- id: product_route

uri: lb://service-product

order: 1

predicates:

- Path=/product-serv/**

filters:

- StripPrefix=1

- id: order_route

uri: lb://service-order

order: 1

predicates:

- Path=/order-serv/**

- Age=18,60

filters:

- StripPrefix=1

路由断言工厂配置类

import lombok.Data;

import lombok.NoArgsConstructor;

import org.apache.commons.lang3.StringUtils;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;

import org.springframework.stereotype.Component;

import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;

import java.util.List;

import java.util.function.Predicate;

//这是一个自定义的路由断言工厂类,要求有两个

//1 名字必须是 配置+RoutePredicateFactory

//2 必须继承AbstractRoutePredicateFactory<配置类>

@Component

public class AgeRoutePredicateFactory extends AbstractRoutePredicateFactory {

//构造函数

public AgeRoutePredicateFactory() {

super(Config.class);

}

//读取配置文件的中参数值 给他赋值到配置类中的属性

public List shortcutFieldOrder() {

//这个位置的顺序必须跟配置文件中的值的顺序对应

return Arrays.asList("minAge", "maxAge");

}

//断言逻辑

public Predicate apply(Config config) {

return new Predicate() {

@Override

public boolean test(ServerWebExchange serverWebExchange) {

//1 接收前台传入的age参数

String ageStr = serverWebExchange.getRequest().getQueryParams().getFirst("age");

//2 先判断是否为空

if (StringUtils.isNotEmpty(ageStr)) {

//3 如果不为空,再进行路由逻辑判断

int age = Integer.parseInt(ageStr);

if (age < config.getMaxAge() && age > config.getMinAge()) {

return true;

} else {

return false;

}

}

return false;

}

};

}

//配置类,用于接收配置文件中的对应参数

@Data

@NoArgsConstructor

public static class Config {

private int minAge;//18

private int maxAge;//60

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用代码向网站提交数据
下一篇:JS中找到鼠标点击的坐标
相关文章

 发表评论

暂时没有评论,来抢沙发吧~