您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Spring Cloud Zuul中路由配置的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
首先我們來回憶一下配置路由規則的那兩行代碼:
zuul.routes.api-a.path=/api-a/** zuul.routes.api-a.serviceId=feign-consumer
我們說當我的訪問地址符合/api-a/**規則的時候,會被自動定位到feign-consumer服務上去,不過兩行代碼有點麻煩,我們可以用下面一行代碼來代替,如下:
zuul.routes.feign-consumer=/api-a/**
zuul.routes后面跟著的是服務名,服務名后面跟著的是路徑規則,這種配置方式顯然更簡單。
如果映射規則我們什么都不寫,系統也給我們提供了一套默認的配置規則,默認的配置規則如下:
zuul.routes.feign-consumer.path=/feign-consumer/** zuul.routes.feign-consumer.serviceId=feign-consumer
默認情況下,Eureka上所有注冊的服務都會被Zuul創建映射關系來進行路由,但是對于我這里的例子來說,我希望提供服務的是feign-consumer,hello-service作為服務提供者只對服務消費者提供服務,不對外提供服務,如果使用默認的路由規則,則Zuul也會自動為hello-service創建映射規則,這個時候我們可以采用如下方式來讓Zuul跳過hello-service服務,不為其創建路由規則:
zuul.ignored-services=hello-service
有的小伙伴可能為有疑問,我們定義路由規則/api-a/**的時候,為什么最后面是兩個*,一個可不可以呢?當然可以,不過意義可就不一樣了,Zuul中的路由匹配規則使用了Ant風格定義,一共有三種不同的通配符:
通配符 | 含義 | 舉例 | 解釋 |
---|---|---|---|
? | 匹配任意單個字符 | /feign-consumer/? | 匹配/feign-consumer/a,/feign-consumer/b,/feign-consumer/c等 |
* | 匹配任意數量的字符 | /feign-consumer/* | 匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,無法匹配/feign-consumer/a/b/c |
** | 匹配任意數量的字符 | /feign-consumer/* | 匹配/feign-consumer/aaa,feign-consumer/bbb,/feign-consumer/ccc等,也可以匹配/feign-consumer/a/b/c |
有的時候我們還會遇到這樣一個問題,比如我有兩個服務,一個叫做feign-consumer,還有一個叫做feign-consumer-hello,此時我的路由配置規則可能這樣來寫:
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
此時我訪問feign-consumer-hello的路徑會同時被這兩條規則所匹配,Zuul中的路徑匹配方式是一種線性匹配方式,即按照路由匹配規則的存儲順序依次匹配,因此我們只需要確保feign-consumer-hello的匹配規則被先定義feign-consumer的匹配規則被后定義即可,但是在properties文件中我們不能保證這個先后順序,此時我們需要用YAML來配置,這個時候我們可以刪掉resources文件夾下的application.properties,然后新建一個application.yml,內容如下:
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/
這個時候我們就可以確保先加載feign-consumer-hello的匹配規則,后加載feign-consumer的匹配規則。
上文我們說了一個zuul.ignored-services=hello-service屬性可以忽略掉一個服務,不給某個服務設置映射規則,這個配置我們可以進一步細化,比如說我不想給/hello接口路由,那我們可以按如下方式配置(后面我都用yaml配置):
zuul: ignored-patterns: /**/hello/**
此時訪問/hello接口就會報404錯誤,同時我們也可以看到后臺打印如下日志:
此外,我們也可以統一的為路由規則增加前綴,設置方式如下:
zuul: prefix: /myapi
此時我們的訪問路徑就變成了http://localhost:2006/myapi/feign-consumer/hello1。
一般情況下API網關只是作為系統的統一入口,但是有的時候我們可能也需要在API網關上做一點業務邏輯操作,比如我現在在api-gateway項目中新建如下Controller:
@RestController public class HelloController { @RequestMapping("/local") public String hello() { return "hello api gateway"; } }
我希望用戶在訪問/local時能夠自動跳轉到這個方法上來處理,那么此時我們需要用到Zuul的本地跳轉,配置方式如下:
zuul: prefix: /myapi ignored-patterns: /**/hello/** routes: local: path: /local/** url: forward:/local
此時訪問http://localhost:2006/myapi/local結果如下:
我們在使用Nginx的時候,會涉及到一個請求頭信息的配置,防止頁面重定向后跳轉到上游服務器上去,這個問題在Zuul中一樣存在,假設我的feign-consumer中提供了一個接口/hello4,當訪問/hello4接口的時候,頁面重定向到/hello,默認情況下,重定向的地址是具體的服務實例的地址,而不是API網關的跳轉地址,這種做法會暴露真實的服務地址,所以需要在Zuul中配置,配置方式很簡單,如下:
zuul: add-host-header: true
表示API網關在進行請求路由轉發前為請求設置Host頭信息。
默認情況下,敏感的頭信息無法經過API網關進行傳遞,我們可以通過如下配置使之可以傳遞:
zuul: routes: feign-consumer: sensitiveHeaders:
在Zuul中,Ribbon和Hystrix的配置還是和之前的配置方式一致,這里我就不贅述了,如果我們想關閉Hystrix重試機制,可以通過如下方式:
關閉全局重試機制:
zuul: retryable: false
關閉某一個服務的重試機制:
zuul: routes: feign-consumer: retryable: false
關于“Spring Cloud Zuul中路由配置的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。