Spring Cloud創建了一個嵌入式Zuul代理,以簡化UI應用程序想要對一個或多個后端服務進行代理調用的常見用例的開發。 此功能對于用戶界面代理其所需的后端服務非常有用,從而無需為所有后端獨立管理CORS(全稱是"跨域資源共享"Cross-origin resource sharing)和身份驗證問題。
要啟用它,請使用`@EnableZuulProxy`注解Spring Boot主類。 這樣做會導致本地呼叫轉發到適當的服務。 按照慣例,具有用戶ID的服務從位于`/users`的代理接收請求(帶有前綴剝離)。 代理使用Ribbon 來定位發現的實例,并轉發請求。 所有請求都在hystrix命令中執行,因此Hystrix指標中會出現故障。 斷路發生后,代理不會嘗試聯系該服務。
>Zuul啟動器不包含發現客戶端,因此,對于基于服務ID的路由,您還需要在類路徑中提供其中一個(Eureka是一種選擇)。
要跳過自動添加的服務,請將`zuul.ignored-services`設置為服務ID模式列表。 如果服務與忽略模式匹配但仍包含在顯式配置的路由映射中,則它是不忽略的,如以下示例所示:
```
zuul:
ignoredServices: '*'
routes:
users: /myusers/**
```
以上示例所有服務都將忽略,除了`users`
要擴充或更改代理路由,可以添加外部配置,如下所示:
```
zuul:
routes:
users: /myusers/**
```
前面的示例意味著對`/myusers`的HTTP調用被轉發到`users `服務(例如`/myusers/101`被轉發到`/101`)。
要對路由進行更細粒度的控制,可以單獨指定路徑和serviceId,如下所示:
```
zuul:
routes:
users:
path: /myusers/**
serviceId: users_service
```
前面的示例意味著對`/myusers`的HTTP調用將轉發到`users_service`服務。 路徑必須具有可以指定為ant樣式模式的路徑,因此`/myusers /*`僅匹配一個級別,但`/myusers /**`是分層匹配的。
后端的位置可以指定為`serviceId`(用于發現服務)或`url`(用于物理位置),如以下示例所示:
```
zuul:
routes:
users:
path: /myusers/**
url: http://example.com/users_service
```
這些簡單的url-routes不會作為`HystrixCommand`執行,也不會使用Ribbon對多個URL進行負載均衡。 要實現這些目標,您可以使用靜態服務器列表指定`serviceId`,如下所示:
```
zuul:
routes:
echo:
path: /myusers/**
serviceId: myusers-service
stripPrefix: true
hystrix:
command:
myusers-service:
execution:
isolation:
thread:
timeoutInMilliseconds: ...
myusers-service:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
listOfServers: http://example1.com,http://example2.com
ConnectTimeout: 1000
ReadTimeout: 3000
MaxTotalHttpConnections: 500
MaxConnectionsPerHost: 100
```
另一種方法是指定服務路由并為serviceId配置Ribbon客戶端(這樣做需要在Ribbon中禁用Eureka支持 - 請參閱上面的更多信息),如以下示例所示:
```
zuul:
routes:
users:
path: /myusers/**
serviceId: users
ribbon:
eureka:
enabled: false
users:
ribbon:
listOfServers: example.com,google.com
```
您可以使用`regexmapper`在`serviceId`和路由之間提供約定。 它使用正則表達式命名組從`serviceId`中提取變量并將它們注入路由模式,如以下示例所示:
```
@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
return new PatternServiceRouteMapper(
"(?<name>^.+)-(?<version>v.+$)",
"${version}/${name}");
}
```
上面的示例表示`myusers-v1`的`serviceId`映射到`route / v1 / myusers / **`。 接受任何正則表達式,但所有命名組必須同時出現在`servicePattern`和`routePattern`中。 如果`servicePattern`與`serviceId`不匹配,則使用默認行為。 在前面的示例中,`myusers`的`serviceId`映射到`“/ myusers / **”`路由(未檢測到版本)。 默認情況下禁用此功能,僅適用于已發現的服務。
要為所有映射添加前綴,請將`zuul.prefix`設置為值,例如`/api`。 默認情況下,在轉發請求之前,會從請求中刪除代理前綴(您可以使用`zuul.stripPrefix = false`關閉此行為)。 您還可以關閉從各個路由中剝離特定于服務的前綴,如以下示例所示:
```
zuul:
routes:
users:
path: /myusers/**
stripPrefix: false
```
>`zuul.stripPrefix`僅適用于`zuul.prefix`中設置的前綴。 它對給定路徑的路徑中定義的前綴沒有任何影響。
在前面的示例中,對`/ myusers / 101`的請求將轉發到用戶服務上的`/ myusers / 101`。
`zuul.routes`條目實際上綁定到`ZuulProperties`類型的對象。 如果查看該對象的屬性,可以看到它還具有`retryable`標志。 將該標志設置為`true`以使Ribbon客戶端自動重試失敗的請求。 當您需要修改使用功能區客戶端配置的重試操作的參數時,也可以將該標志設置為`true`。
默認情況下,`X-Forwarded-Host`標頭會添加到轉發的請求中。 要將其關閉,請設置`zuul.addProxyHeaders = false`。 默認情況下,前綴路徑被剝離,對后端的請求選擇`X-Forwarded-Prefix`標頭(前面顯示的示例中為/ myusers)。
如果設置默認路由(`/`),則具有`@EnableZuulProxy`的應用程序可以充當獨立服務器。 例如,`zuul.route.home:/`會將所有流量(“/ **”)路由到“home”服務。
如果需要更細粒度的忽略,則可以指定要忽略的特定模式。 這些模式在路徑定位過程開始時進行評估,這意味著前綴應包含在模式中以保證匹配。 忽略的模式跨越所有服務并取代任何其他路由規范。 以下示例顯示如何創建忽略的模式:
```
zuul:
ignoredPatterns: /**/admin/**
routes:
users: /myusers/**
```
上面例子說明請求 `/myusers/101`會轉發到users 服務的` /101` 然而 請求包含`/admin/ `不會處理
>如果您需要保留其路由順序,則需要使用YAML文件,因為使用屬性文件時排序會丟失。 以下示例顯示了這樣的YAML文件:
```
zuul:
routes:
users:
path: /myusers/**
legacy:
path: /**
```
如果您要使用屬性文件,則`legacy`路徑可能最終位于`users`路徑前面,從而導致`users`路徑無法訪問。
- 快速開始
- I.云原生應用
- II. Spring Cloud配置
- III. Spring Cloud Netflix
- 11 服務發現:Eureka客戶端
- 11.1 如何引入eureka客戶端
- 11.2 注冊eureka
- 12.3 使用Eureka服務端的身份驗證
- 11.4狀態頁面和健康指標
- 11.5 注冊一個安全的應用
- 11.6 eureka的監控檢查
- 11.7 eureka實例和客戶端的元數據
- 11.8 使用eureka客戶端
- 11.8.1 不使用Jersey的eureka client
- 11.9 可選的原生 Netflix EurekaClient
- 11.10 為什么注冊服務這么慢
- 11.11 區域
- 12.服務發現:Eureka 服務端
- 12.1 如何引入 Eureka server
- 12.2 如何運行Eureka Server
- 12.3 高可用性和時區,區域
- 12.4 獨立模式
- 12.5 對等意識
- 12.6 什么時候使用ip地址
- 12.7 保護eureka服務
- 13.斷路器:Hystrix客戶端
- 14 斷路器:Hystrix儀表板
- 15. Hystrix 超時和Ribbon 客戶端
- 16 客戶端負載均衡:ribbon
- 17 外部配置:Archaius
- 18. 路由和過濾
- 18.1 如何引入zuul
- 18.2 嵌入式Zuul反向代理
- 18.3 Zuul Http Client
- 18.4 Cookies和敏感標題
- 18.5忽略的標題
- 18.6管理端點
- 18.6.1 路由端點
- 19. Polyglot 支持Sidecar
- 20 重試失敗的請求
- 21 HTTP Client
- IV. Spring Cloud OpenFeign
- V. Spring Cloud Stream
- VI. Binder Implementations
- VII. Spring Cloud Bus
- VIII. Spring Cloud Sleuth
- IX. Spring Cloud Consul
- X. Spring Cloud Zookeeper
- XI. Spring Boot Cloud CLI
- XII. Spring Cloud Security
- XIII. Spring Cloud for Cloud Foundry