国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩免费一区 | 久久av一区二区三区 | 精品日韩一区二区三区 | 亚洲二区在线播放 | 99久久精品免费看国产一区二区三区 | 九九av| 久久久久国产精品免费免费搜索 | 精品久久在线 | 成人免费小视频 | 鲁一鲁综合 | √天堂8在线网 | 色综合天天综合网国产成人网 | 欧美日韩中文字幕 | 欧美福利 | 免费三级网站 | 日韩免费在线观看 | 日韩成人av电影 | 桃色一区 | 亚洲视频在线播放 | 国产精品精品 | 中文字幕在线观看 | 在线欧美亚洲 | 激情国产视频 | 一区二区免费 | 黄色tv在线观看 | 亚洲91| 久久久久无码国产精品一区 | 亚洲福利片| 亚洲免费在线观看 | 国产伦精品一区二区三区四区视频 | 欧洲精品一区 | 久久综合九色综合欧美狠狠 | 日本久久网 | 日日干夜夜干 | 国产毛片毛片 | 久久久久国产精品免费免费搜索 | 欧美日韩国产精品 | 亚洲免费观看视频 | 中国av在线免费观看 | 国产成人精品综合 | 毛片免费在线 |