springcloud gateway自定義斷言規(guī)則詳解,以后綴結(jié)尾進行路由
springcloud gateway自定義斷言規(guī)則,后綴結(jié)尾進行路由
因工作需要,需要使用springcloud gateway ,以.html結(jié)尾的進行路由進行websocket轉(zhuǎn)發(fā)。
gateway自帶的8種路由規(guī)則都不能滿足,故需要自定義斷言規(guī)則。
1.新建一個路由斷言工廠ExtCheckRoutePredicateFactory
@Component
public class ExtCheckRoutePredicateFactory extends AbstractRoutePredicateFactory<ExtCheckRoutePredicateFactory.Config> {
public ExtCheckRoutePredicateFactory() {
super(Config.class);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new Predicate<ServerWebExchange>() {
@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結(jié)尾,則匹配此路由
2.修改gateway配置
gateway:
routes:
- id: abc
uri: http://localhost:8080
predicates:
- name: ExtCheck
ExtCheck即是我們新建斷言工廠的前綴名,自動識別的。
這時運行發(fā)現(xiàn),系統(tǒng)根本找不到我們自定義的斷言類。
需要第三步
3.修改gateway源碼,將自定義斷言類加到系統(tǒng) predicates里
@Bean
public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,
List<GatewayFilterFactory> gatewayFilters,
List<RoutePredicateFactory> predicates,
RouteDefinitionLocator routeDefinitionLocator,
ConfigurationService configurationService) {
predicates.add(new ExtCheckRoutePredicateFactory());
return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates,
gatewayFilters, properties, configurationService);
}
再次運行,成功根據(jù).html后綴轉(zhuǎn)發(fā),done!
Gateway自定義路由斷言工廠類
application.yml文件
server:
port: 7000
spring:
zipkin:
base-url: http://127.0.0.1:9411/ #zipkin server的請求地址
discoveryClientEnabled: false #讓nacos把它當成一個URL,而不要當做服務(wù)名
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中獲取服務(wù)信息
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<AgeRoutePredicateFactory.Config> {
//構(gòu)造函數(shù)
public AgeRoutePredicateFactory() {
super(Config.class);
}
//讀取配置文件的中參數(shù)值 給他賦值到配置類中的屬性上
public List<String> shortcutFieldOrder() {
//這個位置的順序必須跟配置文件中的值的順序?qū)?yīng)
return Arrays.asList("minAge", "maxAge");
}
//斷言邏輯
public Predicate<ServerWebExchange> apply(Config config) {
return new Predicate<ServerWebExchange>() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
//1 接收前臺傳入的age參數(shù)
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;
}
};
}
//配置類,用于接收配置文件中的對應(yīng)參數(shù)
@Data
@NoArgsConstructor
public static class Config {
private int minAge;//18
private int maxAge;//60
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot+mybatis-plus實現(xiàn)內(nèi)置的CRUD使用詳解
這篇文章主要介紹了springboot+mybatis-plus實現(xiàn)內(nèi)置的CRUD使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請求流程介
Spring Cloud Gateway旨在為微服務(wù)架構(gòu)提供一種簡單有效的、統(tǒng)一的 API 路由管理方式。Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系中的網(wǎng)關(guān),它不僅提供統(tǒng)一的路由方式,并且基于 Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全、監(jiān)控/埋點和限流等2022-10-10
使用Servlet Filter實現(xiàn)系統(tǒng)登錄權(quán)限
這篇文章主要為大家詳細介紹了使用Servlet Filter實現(xiàn)系統(tǒng)登錄權(quán)限,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10
Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法
這篇文章主要介紹了Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法,需要的朋友可以參考下2014-03-03
Elasticsearch進行深度分頁的詳細指南(避免踩坑+報錯)
這篇文章主要為大家詳細介紹了使用Elasticsearch進行深度分頁時會員踩的坑以及報錯的相關(guān)解決方法,感興趣的小伙伴可以跟隨小編一起學習一下2025-04-04
SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié)(附源碼下載地址)
這篇文章主要介紹了SSH框架網(wǎng)上商城項目第30戰(zhàn)之項目總結(jié),并附源碼下載地址,感興趣的小伙伴們可以參考一下2016-06-06

