最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud實戰(zhàn)小貼士之Zuul的路徑匹配

 更新時間:2017年10月09日 10:29:13   作者:程序猿DD  
這篇文章主要介紹了SpringCloud實戰(zhàn)小貼士之Zuul的路徑匹配,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

不論是使用傳統(tǒng)路由的配置方式還是服務(wù)路由的配置方式,我們都需要為每個路由規(guī)則定義匹配表達(dá)式,也就是上面所說的 path 參數(shù)。在Zuul中,路由匹配的路徑表達(dá)式采用了Ant風(fēng)格定義。

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

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

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

URL路徑 說明
/user-service/? 它可以匹配 /user-service/ 之后拼接一個任務(wù)字符的路徑,比如: /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/* 包含的內(nèi)容之外,還可以匹配形如 /user-service/a/b 的多級目錄路徑

另外,當(dāng)我們使用通配符的時候,經(jīng)常會碰到這樣的問題:一個URL路徑可能會被多個不同路由的表達(dá)式匹配上。比如:有這樣的一個場景,我們在系統(tǒng)建設(shè)的一開始實現(xiàn)了 user-service 服務(wù),并且配置了如下路由規(guī)則:

zuul.routes.user-service.path=/user-service/**
zuul.routes.user-service.serviceId=user-service

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

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

這個時候,調(diào)用 user-service-ext 服務(wù)的URL路徑實際上會同時被 /user-service/** 和 /user-service/ext/** 兩個表達(dá)式所匹配。在邏輯上,API網(wǎng)關(guān)服務(wù)需要優(yōu)先選擇 /user-service/ext/** 路由,然后再匹配 /user-service/** 路由才能實現(xiàn)上述需求。但是如果使用上面的配置方式,實際上是無法保證這樣的路由優(yōu)先順序的。

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

@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);
}

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

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 的配置內(nèi)容無法保證有序,所以當(dāng)出現(xiàn)這種情況的時候,為了保證路由的優(yōu)先順序,我們需要使用YAML文件來配置,以實現(xiàn)有序的路由規(guī)則,比如使用下面的定義:

zuul:
routes:
user-service-ext:
path: /user-service/ext/**
serviceId: user-service-ext
user-service:
path: /user-service/**
serviceId: user-service

忽略表達(dá)式

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

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

zuul.ignored-patterns=/**/hello/**
zuul.routes.api-a.path=/api-a/**
zuul.routes.api-a.serviceId=hello-service

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

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

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

如果您有任何想法或問題需要討論或交流,可進(jìn)入交流區(qū)發(fā)表您的想法或問題。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解

    這篇文章主要為大家介紹了logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • SpringCloud集成和使用OpenFeign的教程指南

    SpringCloud集成和使用OpenFeign的教程指南

    在微服務(wù)架構(gòu)中,服務(wù)間的通信是至關(guān)重要的,SpringCloud作為一個功能強大的微服務(wù)框架,為我們提供了多種服務(wù)間通信的方式,其中,OpenFeign是一個聲明式的Web服務(wù)客戶端,它使得編寫Web服務(wù)客戶端變得更加簡單,本文將詳細(xì)介紹如何在SpringCloud項目中集成和使用OpenFeign
    2024-10-10
  • MyBatis3傳遞多個參數(shù)(Multiple Parameters)

    MyBatis3傳遞多個參數(shù)(Multiple Parameters)

    這篇文章主要介紹了MyBatis3傳遞多個參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringCloudGateway開發(fā)過程解析

    SpringCloudGateway開發(fā)過程解析

    這篇文章主要介紹了SpringCloudGateway開發(fā)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot 中的異步處理機制詳解

    SpringBoot 中的異步處理機制詳解

    本文介紹了異步處理的基礎(chǔ)配置、線程池的自定義以及常見應(yīng)用場景,在實際應(yīng)用中,異步處理可以有效提升應(yīng)用的性能,改善用戶體驗,但同時也需要我們合理管理線程池,確保系統(tǒng)資源的高效利用,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java線程Thread.sleep()對比對象的wait示例解析

    java線程Thread.sleep()對比對象的wait示例解析

    這篇文章主要為大家介紹了java線程Thread.sleep()對比對象的wait示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java定時器Timer使用方法詳解

    Java定時器Timer使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Java定時器Timer的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • linux部署出現(xiàn)java文件操作報錯:java.io.FileNotFoundException解決辦法

    linux部署出現(xiàn)java文件操作報錯:java.io.FileNotFoundException解決辦法

    這篇文章主要g介紹了linux部署出現(xiàn)java文件操作報錯:java.io.FileNotFoundException解決的相關(guān)資料,這個錯誤通常表示你的Spring Boot應(yīng)用程序無法找到指定的文本文件,需要的朋友可以參考下
    2023-12-12
  • Spring Boot讀取配置屬性常用方法解析

    Spring Boot讀取配置屬性常用方法解析

    這篇文章主要介紹了Spring Boot讀取配置屬性常用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • 如何自定義Jackson序列化?@JsonSerialize

    如何自定義Jackson序列化?@JsonSerialize

    這篇文章主要介紹了如何自定義Jackson序列化?@JsonSerialize,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

调兵山市| 农安县| 美姑县| 集贤县| 盐亭县| 九龙县| 丹巴县| 双柏县| 桃园县| 德钦县| 托克逊县| 天长市| 赤峰市| 叶城县| 拉萨市| 札达县| 肇庆市| 金乡县| 云霄县| 康保县| 水城县| 临朐县| 海原县| 合肥市| 普兰县| 绥化市| 绥德县| 颍上县| 合阳县| 新建县| 两当县| 临颍县| 镇坪县| 徐水县| 罗山县| 孝义市| 竹山县| 德昌县| 沙湾县| 南开区| 方山县|