網(wǎng)關(guān)服務(wù)核心是將進(jìn)入的請求正確合理的路由到下層具體的服務(wù)進(jìn)行業(yè)務(wù)處理令漂,由此可見網(wǎng)關(guān)服務(wù)的核心就是路由信息的構(gòu)建。下面學(xué)習(xí)和閱讀下Spring-Cloud-Gateway的route數(shù)據(jù)模型
首先查看Route模型的代碼如下:
public class Route implements Ordered {
/**
* 路由編號
* ID 編號新娜,唯一
*/
private final String id;
/**
* 路由向的 URI
*
*/
private final URI uri;
/**
* 順序
* 當(dāng)請求匹配到多個路由時液荸,使用順序小的
*/
private final int order;
/**
* 謂語數(shù)組
* 請求通過 predicates 判斷是否匹配
*/
private final Predicate<ServerWebExchange> predicate;
/**
* 過濾器數(shù)組
*/
private final List<GatewayFilter> gatewayFilters;
}
由代碼可以看到一個路由應(yīng)該包含如下必要的信息:
- id:路由編號永品,唯一
- uri:路由向的 URI,對應(yīng)的具體業(yè)務(wù)服務(wù)的URL
- order:順序滚躯,當(dāng)請求匹配多個路由時,使用順序小的
- predicate: 請求匹配路由的斷言條件
- gatewayFilters: 當(dāng)前路由上存在的過濾器柳畔,用于對請求做攔截處理
Route模型是通過RouteDefinition(路由定義)模型構(gòu)建起來的馍管,接下來查看RouteDefinition
/**
* 路由定義實體信息,包含路由的定義信息
* @author Spencer Gibb
*/
@Validated
public class RouteDefinition {
/**
* 路由ID 編號薪韩,唯一
*/
@NotEmpty
private String id = UUID.randomUUID().toString();
/**
* 謂語定義數(shù)組
* predicates 屬性确沸,謂語定義數(shù)組
* 請求通過 predicates 判斷是否匹配。在 Route 里俘陷,PredicateDefinition 轉(zhuǎn)換成 Predicate
*/
@NotEmpty
@Valid
private List<PredicateDefinition> predicates = new ArrayList<>();
/**
*過濾器定義數(shù)組
* filters 屬性罗捎,過濾器定義數(shù)組。
* 在 Route 里拉盾,F(xiàn)ilterDefinition 轉(zhuǎn)換成 GatewayFilter
*/
@Valid
private List<FilterDefinition> filters = new ArrayList<>();
/**
* 路由指向的URI
*/
@NotNull
private URI uri;
/**
* 順序
*/
private int order = 0;
}
這個模型與上面的Route模型是不是很相似桨菜,它是對route的定義以及描述,Spring-Cloud-Gateway最終會通過RouteDefinition來構(gòu)建起Route實例信息捉偏。
細(xì)看RouteDefinition代碼會發(fā)現(xiàn)其中包含兩個數(shù)組分別是PredicateDefinition倒得,F(xiàn)ilterDefinition的數(shù)組。
- PredicateDefinition : 斷言條件(謂語)定義夭禽,構(gòu)建 Route 時霞掺,PredicateDefinition 轉(zhuǎn)換成 Predicate
- FilterDefinition : 過濾條件的定義,構(gòu)建Route 時讹躯,F(xiàn)ilterDefinition 轉(zhuǎn)換成 GatewayFilter
那么我們看下PredicateDefinition與FilterDefinition的代碼
- PredicateDefinition
/**
* 謂語定義,在 Route 里菩彬,PredicateDefinition將轉(zhuǎn)換成 Predicate
* @author Spencer Gibb
*/
@Validated
public class PredicateDefinition {
/**
* 謂語定義名字
* 通過 name 對應(yīng)到 org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory 的實現(xiàn)類。
* 例如: name=Query 對應(yīng)到 QueryRoutePredicateFactory
*/
@NotNull
private String name;
/**
* 參數(shù)數(shù)組
* 例如蜀撑,name=Host / args={"_genkey_0" : "iocoder.cn"} 挤巡,匹配請求的 hostname 為 iocoder.cn
*/
private Map<String, String> args = new LinkedHashMap<>();
}
PredicateDefinition 描述了構(gòu)建Predicate的必要條件
- name:名稱,Spring-Cloud-Gateway會根據(jù)name找到Predicate的構(gòu)建工廠類
- args:參數(shù)酷麦,構(gòu)建Predicate的參數(shù)
- FilterDefinition
/**
* 過濾器定義矿卑,在 Route 里,F(xiàn)ilterDefinition將轉(zhuǎn)換成 GatewayFilter
* @author Spencer Gibb
*/
@Validated
public class FilterDefinition {
/**
* 過濾器定義名字
* 通過 name 對應(yīng)到 org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory 的實現(xiàn)類沃饶。
* 例如母廷,name=AddRequestParameter 對應(yīng)到 AddRequestParameterGatewayFilterFactory
*/
@NotNull
private String name;
/**
* 參數(shù)數(shù)組
* 例如 name=AddRequestParameter / args={"_genkey_0": "foo", "_genkey_1": "bar"} 轻黑,添加請求參數(shù) foo 為 bar
*/
private Map<String, String> args = new LinkedHashMap<>();
}
FilterDefinition 描述了構(gòu)建GatewayFilter的必要條件
- name:名稱,Spring-Cloud-Gateway會根據(jù)name找到GatewayFilter的構(gòu)建工廠類
- args:參數(shù)琴昆,構(gòu)建GatewayFilter的參數(shù)
通過這些基礎(chǔ)的數(shù)據(jù)模型我可以清晰看到Spring-Cloud-Gateway構(gòu)建路由的數(shù)據(jù)流向
路由數(shù)據(jù)流向.png
通過數(shù)據(jù)流向可以幫助我們接下來閱讀Route信息的初始化加載以及路由的使用