一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - SpringCloud實(shí)戰(zhàn)小貼士之Zuul的路徑匹配

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

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

這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)小貼士之Zuul的路徑匹配,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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

 

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

 

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

 

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

 

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

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

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

?
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

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

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

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

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

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

?
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

忽略表達(dá)式

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

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

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

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

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91禁漫 | 精品久久久久香蕉网 | 大学生初次破苞免费视频 | 亚洲 欧美 国产 日韩 字幕 | 男女天堂 | 男生和女生搞逼逼 | 加勒比一本大道香蕉在线视频 | 俄罗斯大白屁股 | 成年人在线免费观看视频网站 | 亚洲国产成人综合 | 操熟美女又肥又嫩的骚屁股 | 91啦在线播放 | 国色天香社区视频免费观看3 | 精品区2区3区4区产品乱码9 | 精品国产影院 | 男人和女人日比 | 欧美老人与小伙子性生交 | 亚洲欧美韩国日产综合在线 | 操日日| 国产欧美一区二区三区精品 | 99操视频| 图片专区小说专区卡通动漫 | 国产成人久久精品推最新 | 日本人做受全过程视频 | 免费观看在线永久免费xx视频 | 欧美国产精品 | 青青国产精品 | 亚洲第五色综合网啪啪 | 亚洲国产精品二区久久 | 精品视频一区二区 | 亚洲小视频网站 | 俄罗斯处女 | 美女漫画网 | 久久久无码精品亚洲欧美 | 日韩aaa | 亚洲色图第四色 | 甜宠巨肉h文1v1校园 | 国产成人精品免费2021 | 色婷婷综合久久久 | 国产欧美日韩视频在线观看一区二区 | 美女又爽又黄免费 |