詳解Spring Cloud Zuul中路由配置細(xì)節(jié)
上篇文章我們介紹了API網(wǎng)關(guān)的基本構(gòu)建方式以及請(qǐng)求過(guò)濾,小伙伴們對(duì)Zuul的作用應(yīng)該已經(jīng)有了一個(gè)基本的認(rèn)識(shí),但是對(duì)于路由的配置我們只是做了一個(gè)簡(jiǎn)單的介紹,本文我們就來(lái)看看路由配置的其他一些細(xì)節(jié)。
首先我們來(lái)回憶一下上篇文章我們配置路由規(guī)則的那兩行代碼:
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=feign-consumer
我們說(shuō)當(dāng)我的訪問(wèn)地址符合/api-a/**規(guī)則的時(shí)候,會(huì)被自動(dòng)定位到feign-consumer服務(wù)上去,不過(guò)兩行代碼有點(diǎn)麻煩,我們可以用下面一行代碼來(lái)代替,如下:
zuul.routes.feign-consumer=/api-a/**
zuul.routes后面跟著的是服務(wù)名,服務(wù)名后面跟著的是路徑規(guī)則,這種配置方式顯然更簡(jiǎn)單。
如果映射規(guī)則我們什么都不寫(xiě),系統(tǒng)也給我們提供了一套默認(rèn)的配置規(guī)則,默認(rèn)的配置規(guī)則如下:
zuul.routes.feign-consumer.path=/feign-consumer/** zuul.routes.feign-consumer.serviceId=feign-consumer
默認(rèn)情況下,Eureka上所有注冊(cè)的服務(wù)都會(huì)被Zuul創(chuàng)建映射關(guān)系來(lái)進(jìn)行路由,但是對(duì)于我這里的例子來(lái)說(shuō),我希望提供服務(wù)的是feign-consumer,hello-service作為服務(wù)提供者只對(duì)服務(wù)消費(fèi)者提供服務(wù),不對(duì)外提供服務(wù),如果使用默認(rèn)的路由規(guī)則,則Zuul也會(huì)自動(dòng)為hello-service創(chuàng)建映射規(guī)則,這個(gè)時(shí)候我們可以采用如下方式來(lái)讓Zuul跳過(guò)hello-service服務(wù),不為其創(chuàng)建路由規(guī)則:
zuul.ignored-services=hello-service
有的小伙伴可能為有疑問(wèn),我們定義路由規(guī)則/api-a/**的時(shí)候,為什么最后面是兩個(gè)*,一個(gè)可不可以呢?當(dāng)然可以,不過(guò)意義可就不一樣了,Zuul中的路由匹配規(guī)則使用了Ant風(fēng)格定義,一共有三種不同的通配符:
通配符 | 含義 | 舉例 | 解釋 |
---|---|---|---|
? | 匹配任意單個(gè)字符 | /feign-consumer/? | 匹配/feign-consumer/a,/feign-consumer/b,/feign-consumer/c等 |
* | 匹配任意數(shù)量的字符 | /feign-consumer/* | 匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,無(wú)法匹配/feign-consumer/a/b/c |
** | 匹配任意數(shù)量的字符 | /feign-consumer/* | 匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,也可以匹配/feign-consumer/a/b/c |
有的時(shí)候我們還會(huì)遇到這樣一個(gè)問(wèn)題,比如我有兩個(gè)服務(wù),一個(gè)叫做feign-consumer,還有一個(gè)叫做feign-consumer-hello,此時(shí)我的路由配置規(guī)則可能這樣來(lái)寫(xiě):
zuul.routes.feign-consumer.path=/feign-consumer/** zuul.routes.feign-consumer.serviceId=feign-consumer zuul.routes.feign-consumer-hello.path=/feign-consumer/hello/** zuul.routes.feign-consumer-hello.serviceId=feign-consumer-hello
此時(shí)我訪問(wèn)feign-consumer-hello的路徑會(huì)同時(shí)被這兩條規(guī)則所匹配,Zuul中的路徑匹配方式是一種線性匹配方式,即按照路由匹配規(guī)則的存儲(chǔ)順序依次匹配,因此我們只需要確保feign-consumer-hello的匹配規(guī)則被先定義feign-consumer的匹配規(guī)則被后定義即可,但是在properties文件中我們不能保證這個(gè)先后順序,此時(shí)我們需要用YAML來(lái)配置,這個(gè)時(shí)候我們可以刪掉resources文件夾下的application.properties,然后新建一個(gè)application.yml,內(nèi)容如下:
spring: application: name: api-gateway server: port: 2006 zuul: routes: feign-consumer-hello: path: /feign-consumer/hello/** serviceId: feign-consumer-hello feign-consumer: path: /feign-consumer/** serviceId: feign-consumer eureka: client: service-url: defaultZone: http://localhost:1111/eureka/
這個(gè)時(shí)候我們就可以確保先加載feign-consumer-hello的匹配規(guī)則,后加載feign-consumer的匹配規(guī)則。
上文我們說(shuō)了一個(gè)zuul.ignored-services=hello-service屬性可以忽略掉一個(gè)服務(wù),不給某個(gè)服務(wù)設(shè)置映射規(guī)則,這個(gè)配置我們可以進(jìn)一步細(xì)化,比如說(shuō)我不想給/hello接口路由,那我們可以按如下方式配置(后面我都用yaml配置):
zuul: ignored-patterns: /**/hello/**
此時(shí)訪問(wèn)/hello接口就會(huì)報(bào)404錯(cuò)誤,同時(shí)我們也可以看到后臺(tái)打印如下日志:
此外,我們也可以統(tǒng)一的為路由規(guī)則增加前綴,設(shè)置方式如下:
zuul: prefix: /myapi
此時(shí)我們的訪問(wèn)路徑就變成了http://localhost:2006/myapi/feign-consumer/hello1。
一般情況下API網(wǎng)關(guān)只是作為系統(tǒng)的統(tǒng)一入口,但是有的時(shí)候我們可能也需要在API網(wǎng)關(guān)上做一點(diǎn)業(yè)務(wù)邏輯操作,比如我現(xiàn)在在api-gateway項(xiàng)目中新建如下Controller:
@RestController public class HelloController { @RequestMapping("/local") public String hello() { return "hello api gateway"; } }
我希望用戶(hù)在訪問(wèn)/local時(shí)能夠自動(dòng)跳轉(zhuǎn)到這個(gè)方法上來(lái)處理,那么此時(shí)我們需要用到Zuul的本地跳轉(zhuǎn),配置方式如下:
zuul: prefix: /myapi ignored-patterns: /**/hello/** routes: local: path: /local/** url: forward:/local
此時(shí)訪問(wèn)http://localhost:2006/myapi/local結(jié)果如下:
我們?cè)谑褂肗ginx的時(shí)候,會(huì)涉及到一個(gè)請(qǐng)求頭信息的配置,防止頁(yè)面重定向后跳轉(zhuǎn)到上游服務(wù)器上去,這個(gè)問(wèn)題在Zuul中一樣存在,假設(shè)我的feign-consumer中提供了一個(gè)接口/hello4,當(dāng)訪問(wèn)/hello4接口的時(shí)候,頁(yè)面重定向到/hello,默認(rèn)情況下,重定向的地址是具體的服務(wù)實(shí)例的地址,而不是API網(wǎng)關(guān)的跳轉(zhuǎn)地址,這種做法會(huì)暴露真實(shí)的服務(wù)地址,所以需要在Zuul中配置,配置方式很簡(jiǎn)單,如下:
zuul: add-host-header: true
表示API網(wǎng)關(guān)在進(jìn)行請(qǐng)求路由轉(zhuǎn)發(fā)前為請(qǐng)求設(shè)置Host頭信息。
默認(rèn)情況下,敏感的頭信息無(wú)法經(jīng)過(guò)API網(wǎng)關(guān)進(jìn)行傳遞,我們可以通過(guò)如下配置使之可以傳遞:
zuul: routes: feign-consumer: sensitiveHeaders:
在Zuul中,Ribbon和Hystrix的配置還是和之前的配置方式一致,這里我就不贅述了,如果我們想關(guān)閉Hystrix重試機(jī)制,可以通過(guò)如下方式:
關(guān)閉全局重試機(jī)制:
zuul: retryable: false
關(guān)閉某一個(gè)服務(wù)的重試機(jī)制:
zuul: routes: feign-consumer: retryable: false
關(guān)于Zuul中路由的配置細(xì)節(jié)我們就說(shuō)到這里,有問(wèn)題歡迎討論。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 集成 Docker 插件一鍵部署 SpringBoot 應(yīng)用
通過(guò)本文介紹的方法,我們期望能幫助開(kāi)發(fā)者更輕松地在IDEA中實(shí)現(xiàn)Spring Boot應(yīng)用的Docker化部署,為現(xiàn)代軟件開(kāi)發(fā)提供更便捷的解決方案,感興趣的朋友一起看看吧2023-11-11Spring Boot 整合mybatis 與 swagger2
之前使用springMVC+spring+mybatis,總是被一些繁瑣的xml配置,還經(jīng)常出錯(cuò),下面把以前的一些ssm項(xiàng)目改成了spring boot + mybatis,相對(duì)于來(lái)說(shuō)優(yōu)點(diǎn)太明顯了,具體內(nèi)容詳情大家通過(guò)本文學(xué)習(xí)吧2017-08-08SpringBoot使用ExceptionHandler做異常處理
這篇文章主要介紹了SpringBoot使用ExceptionHandler做異常處理,這篇文章通過(guò)多種方法案例來(lái)介紹該項(xiàng)技術(shù)的使用,需要的朋友可以參考下2021-06-06基于Feign傳輸對(duì)象無(wú)法接收參數(shù)的問(wèn)題
這篇文章主要介紹了基于Feign傳輸對(duì)象無(wú)法接收參數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Spring jpa和mybatis整合遇到的問(wèn)題解析
有朋友說(shuō)jpa相比mybatis太難用,多表聯(lián)合的查詢(xún)寫(xiě)起來(lái)也比較費(fèi)勁,所以便加入了mybatis的支持,在配置jpa時(shí)遇到各種問(wèn)題,需要修改相關(guān)配置文件,下面小編給大家分享下修改配置文件的思路,感興趣的朋友參考下2016-10-10Java基于Guava Retrying實(shí)現(xiàn)重試功能
這篇文章主要介紹了Java基于Guava Retrying實(shí)現(xiàn)重試功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07java常用Lambda表達(dá)式使用場(chǎng)景源碼示例
這篇文章主要為大家介紹了java常用Lambda表達(dá)式使用場(chǎng)景源碼示例及應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03