W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Spring Cloud已創(chuàng)建嵌入式Zuul代理,以簡化UI應(yīng)用程序要對一個或多個后端服務(wù)進行代理調(diào)用的常見用例的開發(fā)。此功能對于用戶界面代理所需的后端服務(wù)很有用,從而避免了為所有后端獨立管理CORS和身份驗證問題的需求。
要啟用它,請用@EnableZuulProxy
注釋Spring Boot主類。這樣做會導(dǎo)致將本地呼叫轉(zhuǎn)發(fā)到適當(dāng)?shù)姆?wù)。按照約定,ID為users
的服務(wù)從位于/users
的代理接收請求(前綴被去除)。代理使用Ribbon來定位要通過發(fā)現(xiàn)轉(zhuǎn)發(fā)到的實例。所有請求均在hystrix命令中執(zhí)行,因此失敗以Hystrix指標顯示。一旦電路斷開,代理就不會嘗試與服務(wù)聯(lián)系。
Zuul入門程序不包含發(fā)現(xiàn)客戶端,因此,對于基于服務(wù)ID的路由,您還需要在類路徑上提供其中之一(Eureka是一種選擇)。
要跳過自動添加服務(wù)的過程,請將zuul.ignored-services
設(shè)置為服務(wù)ID模式的列表。如果服務(wù)與被忽略但已包含在顯式配置的路由映射中的模式匹配,則將其忽略,如以下示例所示:
application.yml。
zuul: ignoredServices: '*' routes: users: /myusers/**
在前面的示例中,除 users
外,所有服務(wù)均被忽略。
要增加或更改代理路由,可以添加外部配置,如下所示:
application.yml。
zuul: routes: users: /myusers/**
前面的示例意味著對/myusers
的HTTP調(diào)用被轉(zhuǎn)發(fā)到users
服務(wù)(例如,/myusers/101
被轉(zhuǎn)發(fā)到/101
)。
要對路由進行更細粒度的控制,可以分別指定路徑和serviceId,如下所示:
application.yml。
zuul: routes: users: path: /myusers/** serviceId: users_service
前面的示例意味著對/myusers
的HTTP調(diào)用將轉(zhuǎn)發(fā)到users_service
服務(wù)。路由必須具有可以指定為螞蟻樣式模式的path
,因此/myusers/*
僅匹配一個級別,而/myusers/**
則分層匹配。
后端的位置可以指定為serviceId
(用于發(fā)現(xiàn)服務(wù))或url
(用于物理位置),如以下示例所示:
application.yml。
zuul: routes: users: path: /myusers/** url: https://example.com/users_service
這些簡單的url路由不會作為HystrixCommand
來執(zhí)行,也不會使用Ribbon對多個URL進行負載均衡。為了實現(xiàn)這些目標,可以使用靜態(tài)服務(wù)器列表指定一個serviceId
,如下所示:
application.yml。
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: https://example1.com,http://example2.com ConnectTimeout: 1000 ReadTimeout: 3000 MaxTotalHttpConnections: 500 MaxConnectionsPerHost: 100
另一種方法是指定服務(wù)路由并為serviceId
配置Ribbon客戶端(這樣做需要在Ribbon中禁用Eureka支持- 有關(guān)更多信息,請參見上文),如下所示例:
application.yml。
zuul: routes: users: path: /myusers/** serviceId: users ribbon: eureka: enabled: false users: ribbon: listOfServers: example.com,google.com
您可以使用regexmapper
在serviceId
和路由之間提供約定。它使用正則表達式命名組從serviceId
中提取變量,并將其注入到路由模式中,如以下示例所示:
ApplicationConfiguration.java。
@Bean public PatternServiceRouteMapper serviceRouteMapper() { return new PatternServiceRouteMapper( "(?<name>^.+)-(?<version>v.+$)", "${version}/${name}"); }
前面的示例意味著myusers-v1
中的serviceId
被映射到路由/v1/myusers/**
??梢越邮苋魏握齽t表達式,但是所有命名組必須同時存在于servicePattern
和routePattern
中。如果
servicePattern
與serviceId
不匹配,則使用默認行為。在前面的示例中,myusers
中的serviceId
被映射到/ myusers / **
路由(未檢測到版本)。默認情況下,此功能是禁用的,僅適用于發(fā)現(xiàn)的服務(wù)。
要為所有映射添加前綴,請將zuul.prefix
設(shè)置為一個值,例如/api
。默認情況下,在轉(zhuǎn)發(fā)請求之前,將從請求中刪除代理前綴(您可以使用zuul.stripPrefix=false
將此行為關(guān)閉)。您還可以關(guān)閉從單個路由中剝離特定于服務(wù)的前綴,如以下示例所示:
application.yml。
zuul: routes: users: path: /myusers/** stripPrefix: false
zuul.stripPrefix
僅適用于zuul.prefix
中設(shè)置的前綴。它對給定路由的path
中定義的前綴沒有任何影響。
在前面的示例中,對/myusers/101
的請求被轉(zhuǎn)發(fā)到users
服務(wù)上的/myusers/101
。
zuul.routes
條目實際上綁定到類型為ZuulProperties
的對象。如果查看該對象的屬性,則可以看到它也有一個retryable
標志。將該標志設(shè)置為true
,以使Ribbon客戶端自動重試失敗的請求。當(dāng)您需要修改使用Ribbon客戶端配置的重試操作的參數(shù)時,也可以將該標志設(shè)置為true
。
默認情況下,X-Forwarded-Host
標頭被添加到轉(zhuǎn)發(fā)的請求中。要關(guān)閉它,請設(shè)置zuul.addProxyHeaders = false
。默認情況下,前綴路徑被剝離,并且后端請求使用X-Forwarded-Prefix
標頭(在前面顯示的示例中為/myusers
)。
如果設(shè)置默認路由(/
),則帶有@EnableZuulProxy
的應(yīng)用程序可以充當(dāng)獨立服務(wù)器。例如,zuul.route.home: /
會將所有流量(“ / **”)路由到“ home”服務(wù)。
如果需要更細粒度的忽略,則可以指定要忽略的特定模式。這些模式在路線定位過程開始時進行評估,這意味著模式中應(yīng)包含前綴以保證匹配。被忽略的模式跨越所有服務(wù),并取代任何其他路由規(guī)范。以下示例顯示了如何創(chuàng)建忽略的模式:
application.yml。
zuul: ignoredPatterns: /**/admin/** routes: users: /myusers/**
前面的示例意味著所有呼叫(例如/myusers/101
)都被轉(zhuǎn)發(fā)到users
服務(wù)上的/101
。但是,包括/admin/
在內(nèi)的呼叫無法解決。
如果您需要保留路由的順序,則需要使用YAML文件,因為使用屬性文件時順序會丟失。以下示例顯示了這樣的YAML文件:
application.yml。
zuul: routes: users: path: /myusers/** legacy: path: /**
如果要使用屬性文件,則legacy
路徑可能最終位于users
路徑的前面,從而導(dǎo)致users
路徑不可訪問。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: