Spring Cloud Zuul中路由配置細節(14)

轉自 https://blog.csdn.net/u012702547/article/details/77823434

這個系列我感覺真的太好了,可以一步一步的瞭解spring cloud 的搭建以及更深層次的東西,對想學這門技術的朋友真的入門特別的快,感謝這位大哥的分享,我也會持續的更新過來。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

上篇文章我們介紹了API網關的基本構建方式以及請求過濾,小夥伴們對Zuul的作用應該已經有了一個基本的認識,但是對於路由的配置我們只是做了一個簡單的介紹,本文我們就來看看路由配置的其他一些細節。


本文是Spring Cloud系列的第二十篇文章,瞭解前十九篇文章內容有助於更好的理解本文:

1.使用Spring Cloud搭建服務註冊中心 
2.使用Spring Cloud搭建高可用服務註冊中心 
3.Spring Cloud中服務的發現與消費 
4.Eureka中的核心概念 
5.什麼是客戶端負載均衡 
6.Spring RestTemplate中幾種常見的請求方式 
7.RestTemplate的逆襲之路,從發送請求到負載均衡 
8.Spring Cloud中負載均衡器概覽 
9.Spring Cloud中的負載均衡策略 
10.Spring Cloud中的斷路器Hystrix 
11.Spring Cloud自定義Hystrix請求命令 
12.Spring Cloud中Hystrix的服務降級與異常處理 
13.Spring Cloud中Hystrix的請求緩存 
14.Spring Cloud中Hystrix的請求合併 
15.Spring Cloud中Hystrix儀表盤與Turbine集羣監控 
16.Spring Cloud中聲明式服務調用Feign 
17.Spring Cloud中Feign的繼承特性 
18.Spring Cloud中Feign配置詳解 
19.Spring Cloud中的API網關服務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

關於Zuul中路由的配置細節我們就說到這裏,有問題歡迎留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章