成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[206819]]

路徑匹配

不論是使用傳統路由的配置方式還是服務路由的配置方式,我們都需要為每個路由規則定義匹配表達式,也就是上面所說的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. zuul.routes.user-service.path=/user-service/** 
  2. zuul.routes.user-service.serviceId=user-service 

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

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

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

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

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

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

忽略表達式

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

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

  1. zuul.ignored-patterns=/**/hello/** 
  2. zuul.routes.api-a.path=/api-a/** 
  3. 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路徑。

【本文為51CTO專欄作者“翟永超”的原創稿件,轉載請通過51CTO聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-04-13 11:06:28

SpringCloud隨機端口

2017-05-18 14:14:25

過濾器Spring ClouZuul

2017-05-19 15:13:05

過濾器Spring ClouZuul

2017-05-02 23:05:44

HTTPZuulCookie

2017-07-31 15:47:50

Zuul統一處理

2017-10-20 14:55:06

Spring ClouZuul加載

2022-05-13 08:23:07

Zuul微服務Zuul過濾器

2023-07-17 08:02:44

ZuulIO反應式

2017-08-10 16:14:07

FeignRPC模式

2017-09-26 16:17:39

Ribboneager-load模式

2020-11-18 11:26:45

SpringCloudZuulJava

2022-04-09 14:45:02

微服務常見概念Spring

2021-03-26 06:01:45

日志MongoDB存儲

2013-07-02 11:01:01

2013-10-23 13:01:29

Ubuntu技巧時光機

2021-06-21 08:35:52

AntPathMatcSpringAnt風格

2016-12-01 13:50:38

2010-12-14 09:15:50

Visual Stud

2023-05-29 14:07:00

Zuul網關系統

2016-12-06 09:20:04

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产精品 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 手机在线不卡av | 中文字幕欧美一区二区 | 亚洲精品免费看 | h视频免费在线观看 | 亚洲久久久 | 午夜不卡福利视频 | 91在线视频一区 | 欧美亚洲国产一区 | 黄色一级免费观看 | 99久久久无码国产精品 | 亚洲精品一区在线 | 激情 婷婷| 国产欧美精品一区 | 久久在线精品 | 日韩在线大片 | 亚洲精品视频网站在线观看 | 欧美h| 中文视频在线 | 久久久91精品国产一区二区三区 | 日韩一区二区三区视频在线观看 | 玖玖视频 | 日韩精品中文字幕一区二区三区 | 五月婷婷在线播放 | av中文网| 91国内外精品自在线播放 | 天天操综合网站 | 中文字幕国产视频 | 国产精品不卡一区 | 玖玖玖在线 | 久久久精品综合 | 欧美久久一区二区三区 | av影片在线 | 狠狠爱一区二区三区 | 久久久综合精品 | 久久国产一区二区 | 99国产精品久久久久久久 | 亚洲国产精品一区二区三区 | 国产精品一区三区 | av网站免费观看 |