激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringCloud實戰小貼士之Zuul的路徑匹配

SpringCloud實戰小貼士之Zuul的路徑匹配

2021-01-15 14:11程序猿DD Java教程

這篇文章主要介紹了SpringCloud實戰小貼士之Zuul的路徑匹配,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

不論是使用傳統路由的配置方式還是服務路由的配置方式,我們都需要為每個路由規則定義匹配表達式,也就是上面所說的 path 參數。在Zuul中,路由匹配的路徑表達式采用了Ant風格定義。

Ant風格的路徑表達式使用起來非常簡單,它一共有下面這三種通配符:

 

通配符 說明
? 匹配任意的單個字符
* 匹配任意數量的字符
** 匹配任意數量的字符,支持多級目錄

 

我們可以通過下表的示例來進一步理解這三個通配符的含義并參考著來使用:

 

URL路徑 說明
/user-service/? 它可以匹配 /user-service/ 之后拼接一個任務字符的路徑,比如: /user-service/a 、 /user-service/b 、 /user-service/c
/user-service/* 它可以匹配 /user-service/ 之后拼接任意字符的路徑,比如: /user-service/a 、 /user-service/aaa 、 /user-service/bbb 。但是它無法匹配 /user-service/a/b
/user-service/** 它可以匹配 /user-service/* 包含的內容之外,還可以匹配形如 /user-service/a/b 的多級目錄路徑

 

另外,當我們使用通配符的時候,經常會碰到這樣的問題:一個URL路徑可能會被多個不同路由的表達式匹配上。比如:有這樣的一個場景,我們在系統建設的一開始實現了 user-service 服務,并且配置了如下路由規則:

?
1
2
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service

但是隨著版本的迭代,我們對 user-service 服務做了一些功能拆分,將原屬于 user-service 服務的某些功能拆分到了另外一個全新的服務 user-service-ext 中去,而這些拆分的外部調用URL路徑希望能夠符合規則 /user-service/ext/** ,這個時候我們需要就在配置文件中增加一個路由規則,完整配置如下:

?
1
2
3
4
5
zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service
 
zuul.routes.user-service-ext.path=/user-service/ext/**
zuul.routes.user-service-ext.serviceId=user-service-ext

這個時候,調用 user-service-ext 服務的URL路徑實際上會同時被 /user-service/** 和 /user-service/ext/** 兩個表達式所匹配。在邏輯上,API網關服務需要優先選擇 /user-service/ext/** 路由,然后再匹配 /user-service/** 路由才能實現上述需求。但是如果使用上面的配置方式,實際上是無法保證這樣的路由優先順序的。

從下面的路由匹配算法中,我們可以看到它在使用路由規則匹配請求路徑的時候是通過線性遍歷的方式,在請求路徑獲取到第一個匹配的路由規則之后就會返回并結束匹配過程。所以當存在多個匹配的路由規則時,匹配結果完全取決于路由規則的保存順序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public Route getMatchingRoute(final String path){
 ...
 ZuulRoute route = null;
 if (!matchesIgnoredPatterns(adjustedPath)) {
 for (Entry<String, ZuulRoute> entry : this.routes.get().entrySet()) {
  String pattern = entry.getKey();
  log.debug("Matching pattern:" + pattern);
  if (this.pathMatcher.match(pattern, adjustedPath)) {
  route = entry.getValue();
  break;
  }
 }
 }
 log.debug("route matched=" + route);
 return getRoute(route, adjustedPath);
}

下面所示代碼是基礎的路由規則加載算法,我們可以看到這些路由規則是通過 LinkedHashMap 保存的,也就是說路由規則的保存是有序的,而內容的加載是通過遍歷配置文件中路由規則依次加入的,所以導致問題的根本原因是對配置文件中內容的讀取。

?
1
2
3
4
5
6
7
protected Map<String, ZuulRoute> locateRoutes(){
 LinkedHashMap<String, ZuulRoute> routesMap = new LinkedHashMap<String, ZuulRoute>();
 for (ZuulRoute route : this.properties.getRoutes().values()) {
 routesMap.put(route.getPath(), route);
 }
 return routesMap;
}

由于 properties 的配置內容無法保證有序,所以當出現這種情況的時候,為了保證路由的優先順序,我們需要使用YAML文件來配置,以實現有序的路由規則,比如使用下面的定義:

?
1
2
3
4
5
6
7
8
zuul:
routes:
user-service-ext:
path: /user-service/ext/**
serviceId: user-service-ext
user-service:
path: /user-service/**
serviceId: user-service

忽略表達式

通過 path 參數定義的Ant表達式已經能夠完成API網關上的路由規則配置功能,但是為了更細粒度和更為靈活的配置路由規則,Zuul還提供了一個忽略表達式參數: zuul.ignored-patterns 。該參數可以用來設置不希望被API網關進行路由的URL表達式。

比如,以快速入門中的示例為基礎,如果我們不希望 /hello 接口被路由,那么我們可以這樣設置:

?
1
2
3
zuul.ignored-patterns=/**/hello/**
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=hello-service

然后,可以嘗試通過網關來訪問 hello-service 的 /hello 接口: http://localhost:5555/api-a/hello 。雖然該訪問路徑的完全符合 path 參數定義的 /api-a/** 規則,但是由于該路徑符合 zuul.ignored-patterns 參數定義的規則,所以不會被正確路由。同時,我們在控制臺或日志中還能看到沒有匹配路由的輸出信息:

?
1
o.s.c.n.z.f.pre.PreDecorationFilter   : No route found for uri: /api-a/hello

另外,該參數在使用時還需要注意它的范圍并不是對某個路由,而是對所有路由的。所以在設置的時候需要全面的考慮URL規則,防止忽略了不該被忽略的URL路徑。

如果您有任何想法或問題需要討論或交流,可進入交流區發表您的想法或問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.didispace.com/spring-cloud-tips-zuul-path-config/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产资源在线观看视频 | 日韩欧美综合在线 | 欧美成人国产va精品日本一级 | 欧美在线观看黄色 | 国产午夜亚洲精品理论片大丰影院 | 久久成人精品视频 | 毛片在线视频在线播放 | 在火车上摸两乳爽的大叫 | 草人人| 91精品国产91久久久久久丝袜 | 毛片免费观看完整版 | 成人一区二区三区在线 | 成人在线视频一区 | 91成人免费在线观看 | 美女羞羞视频网站 | 99精美视频| 成人免费观看49www在线观看 | 中文字幕网在线 | 欧美视频在线一区二区三区 | 午夜偷拍视频 | 九一免费国产 | 精品国产一区二区三区免费 | 91精选视频在线观看 | 日韩视频一区二区三区在线观看 | 美女在线观看视频一区二区 | 激情在线观看视频 | 亚洲草原天堂 | 国产精品免费一区二区三区在线观看 | 看av网址 | 国产品久久 | 国产噜噜噜 | 免费国产在线视频 | 美女视频在线观看黄 | 日韩字幕在线 | 99精品在线视频观看 | 7777久久香蕉成人影院 | 91高清观看 | 三人弄娇妻高潮3p视频 | 亚洲欧美日韩久久精品第一区 | 粉嫩一区 | 免费一级特黄欧美大片勹久久网 |