javascript
SpringCloud Zuul(三)之常见用法
一、route配置
(1)Zuul Http客戶端
Zuul使用的默認HTTP客戶端現在由Apache HTTP客戶端而不是不推薦使用的Ribbon支持RestClient。要使用RestClient或okhttp3.OkHttpClient設置ribbon.restclient.enabled=true或ribbon.okhttp.enabled=true。如果要自定義Apache HTTP客戶端或OK HTTP客戶端,請提供類型為CloseableHttpClient或的Bean?OkHttpClient。
?
(2)Cookie和sensitiveHeaders
您可以在同一系統中的服務之間共享標頭,但是您可能不希望敏感標頭泄漏到下游到外部服務器中。您可以在路由配置中指定忽略的標頭列表。Cookies發揮著特殊的作用,因為它們在瀏覽器中具有定義明確的語義,并且始終將它們視為敏感內容。如果代理的使用者是瀏覽器,那么下游服務的cookie也會給用戶帶來麻煩,因為它們都混雜在一起(所有下游服務看起來都來自同一位置)。
如果您對服務的設計很謹慎(例如,如果只有一個下游服務設置cookie),則可以讓它們從后端一直流到調用者。另外,如果您的代理設置cookie,并且所有后端服務都屬于同一系統,則自然可以簡單地共享它們(例如,使用Spring Session將其鏈接到某些共享狀態)。除此之外,由下游服務設置的任何cookie可能對調用者都沒有用,因此建議您(至少)將Set-Cookie其Cookie放入不屬于域的路由的敏感標頭中。即使對于屬于您網域的路由,在讓Cookie在它們與代理之間流動之前,也應仔細考慮其含義。
可以將敏感頭配置為每個路由的逗號分隔列表,如以下示例所示:
application.yml zuul:routes:users:path: /myusers/**sensitiveHeaders: Cookie,Set-Cookie,Authorizationurl: https://downstream注:這是的默認值sensitiveHeaders,因此除非您希望其與眾不同,否則無需進行設置。這是Spring Cloud Netflix 1.1中的新增功能(在1.0中,用戶無法控制標題,并且所有cookie都雙向流動)。
該sensitiveHeaders是一個黑名單,默認是不為空。因此,要使Zuul發送所有標頭(ignored那些標頭除外),必須將其顯式設置為空列表。如果要將Cookie或授權標頭傳遞到后端,則必須這樣做。
以下示例顯示如何使用sensitiveHeaders:
application.yml zuul:routes:users:path: /myusers/**sensitiveHeaders:url: https://downstream您還可以通過設置設置敏感的標題zuul.sensitiveHeaders。如果sensitiveHeaders在路徑上設置了,則它將覆蓋全局sensitiveHeaders設置。
?
(3)zuul.ignoredHeaders
除了路由敏感的標頭之外,您還可以設置一個稱為zuul.ignoredHeaders值的全局值(請求和響應),在與下游服務進行交互時應將其丟棄。默認情況下,如果Spring Security不在類路徑中,則它們為空。否則,它們將被初始化為Spring Security指定的一組眾所周知的“安全”標頭(例如,涉及緩存)。在這種情況下,假設下游服務也可以添加這些標頭,但是我們需要來自代理的值。要在Spring Security位于類路徑上時不丟棄這些眾所周知的安全標頭,可以設置zuul.ignoreSecurityHeaders為false。如果您在Spring Security中禁用了HTTP Security響應標頭并需要下游服務提供的值,則這樣做很有用。
?
二、管理終端
默認情況下,如果@EnableZuulProxy與Spring Boot Actuator一起使用,則啟用兩個附加端點:
-
路線
-
篩選器
(1)路線終點
到路由端點的GET/routes返回映射的路由列表:
GET /路線 {/stores/**: "http://localhost:8081" }可以通過向中添加?format=details查詢字符串來請求其他路線詳細信息/routes。這樣做會產生以下輸出:
GET /路線/細節 {"/stores/**": {"id": "stores","fullPath": "/stores/**","location": "http://localhost:8081","path": "/**","prefix": "/stores","retryable": false,"customSensitiveHeaders": false,"prefixStripped": true} }一POST請求到/routes暴力刷新現有路由(例如,當在服務目錄進行了變更)。您可以通過設置endpoints.routes.enabled為禁用此端點false。
注:路由應該自動響應服務目錄中的更改,但是POST請求到?/routes是一種使更改立即發生的方法。
(2)過濾端點
GET請求到過濾器端點的/filters按類型返回Zuul過濾器的映射。對于地圖中的每種過濾器類型,您將獲得該類型的所有過濾器的列表以及它們的詳細信息。
?
三、zuul其他配置
(1)扼殺模式和本地轉發
遷移現有應用程序或API時,常見的模式是“扼殺”舊的端點,并用不同的實現方式慢慢替換它們。Zuul代理是一個有用的工具,因為您可以使用它來處理來自舊端點客戶端的所有流量,但可以將某些請求重定向到新請求。
以下示例顯示“扼殺”方案的配置詳細信息:
application.yml zuul:routes:first:path: /first/**url: https://first.example.comsecond:path: /second/**url: forward:/secondthird:path: /third/**url: forward:/3rdlegacy:path: /**url: https://legacy.example.com在前面的示例中,我們扼殺了“舊版”應用程序,該應用程序映射到與其他模式之一不匹配的所有請求。輸入的路徑/first/**已使用外部URL提取到新服務中。/second/**轉發路徑,以便可以在本地處理它們(例如,使用常規Spring?@RequestMapping)。中的路徑/third/**也被轉發,但是具有不同的前綴(/third/foo轉發到/3rd/foo)。
注:被忽略的模式不會被完全忽略,它們不會由代理處理(因此它們也可以在本地有效轉發)。
?
(2)通過Zuul上傳文件
如果使用@EnableZuulProxy,則可以使用代理路徑上載文件,只要文件很小,它就可以工作。對于大文件DispatcherServlet,“ / zuul / *”中有一個替代路徑繞過Spring?(以避免進行多部分處理)。換句話說,如果您有zuul.routes.customers=/customers/**,則可以將POST大文件添加到/zuul/customers/*。servlet路徑通過外部化zuul.servletPath。如果代理路由帶您通過功能區負載平衡器,則極大的文件也需要提高的超時設置,如以下示例所示:
application.yml hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000 ribbon:ConnectTimeout: 3000ReadTimeout: 60000請注意,要使流技術處理大文件,您需要在請求中使用分塊編碼(某些瀏覽器默認不這樣做),如以下示例所示:
$ curl -v -H "Transfer-Encoding: chunked" \-F "file=@mylarge.iso" localhost:9999/zuul/simple/file(3)查詢字符串編碼
在處理傳入請求時,查詢參數將被解碼,以便可以在Zuul過濾器中進行可能的修改。然后將它們重新編碼,在路由過濾器中重建后端請求。如果(例如)使用JavascriptencodeURIComponent()方法對結果進行編碼,則結果可能不同于原始輸入。盡管這在大多數情況下不會引起問題,但某些Web服務器可能對復雜查詢字符串的編碼很挑剔。
為了強制對查詢字符串進行原始編碼,可以將一個特殊標志傳遞給,ZuulProperties以便使用該HttpServletRequest::getQueryString方法按原樣使用查詢字符串,如以下示例所示:
application.yml zuul:forceOriginalQueryStringEncoding: true注:此特殊標志僅適用于SimpleHostRoutingFilter。此外,您松散了使用輕松覆蓋查詢參數的功能RequestContext.getCurrentContext().setRequestQueryParams(someOverriddenParameters),因為現在直接在原始上獲取查詢字符串HttpServletRequest。
?
?
(4)請求URI編碼
處理傳入請求時,在將請求URI與路由匹配之前,先對其進行解碼。然后在路由過濾器中重建后端請求時,將對請求URI進行重新編碼。如果您的URI包含編碼的“ /”字符,則可能導致某些意外行為。
要使用原始請求URI,可以向'ZuulProperties'傳遞一個特殊標志,以便該URI與該HttpServletRequest::getRequestURI方法一樣被使用,如以下示例所示:
application.yml zuul:decodeUrl: false 注:如果使用requestURIRequestContext屬性覆蓋請求URI,并且此標志設置為false,則不會對在請求上下文中設置的URL進行編碼。確保URL已被編碼是您的責任。?
(5)普通嵌入式Zuul
如果您使用@EnableZuulServer(而不是@EnableZuulProxy),也可以運行Zuul服務器而不進行代理或有選擇地打開代理平臺的某些部分。您添加到類型應用程序中的所有bean都會ZuulFilter自動安裝(與一起使用@EnableZuulProxy),但是不會自動添加任何代理過濾器。
在這種情況下,仍然可以通過配置“ zuul.routes.*”來指定進入Zuul服務器的路由,但是沒有服務發現,也沒有代理。因此,將忽略“ serviceId”和“ url”設置。以下示例將“ / api / **”中的所有路徑映射到Zuul過濾器鏈:
application.yml zuul:routes:api: /api/**(5)禁用Zuul過濾器
Zuul for Spring Cloud附帶了許多ZuulFilter在代理和服務器模式下默認啟用的bean。有關可啟用的過濾器列表,請參見Zuul過濾器包。如果要禁用一個,請設置zuul.<SimpleClassName>.<filterType>.disable=true。按照慣例,后面的包filters是Zuul過濾器類型。
例如禁用org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter,設置zuul.SendResponseFilter.post.disable=true。
?
(6)為路由提供Hystrix回退當Zuul中給定路由的環路阻斷時,您可以通過創建type的bean提供后備響應FallbackProvider。在此bean中,您需要指定回退的路由ID,并提供一個ClientHttpResponse作為回退的返回。以下示例顯示了一個相對簡單的FallbackProvider實現:
class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {return "customers";}@Overridepublic ClientHttpResponse fallbackResponse(String route, final Throwable cause) {if (cause instanceof HystrixTimeoutException) {return response(HttpStatus.GATEWAY_TIMEOUT);} else {return response(HttpStatus.INTERNAL_SERVER_ERROR);}}private ClientHttpResponse response(final HttpStatus status) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return status;}@Overridepublic int getRawStatusCode() throws IOException {return status.value();}@Overridepublic String getStatusText() throws IOException {return status.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("fallback".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};} }以下示例顯示了上一個示例的路由配置可能如何顯示:
zuul:routes:customers: /customers/**如果您想為所有路由提供默認的回退,則可以創建一個類型為beanFallbackProvider的getRoute方法,使其具有return*或null,如下面的示例所示:
class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {return "*";}@Overridepublic ClientHttpResponse fallbackResponse(String route, Throwable throwable) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {return 200;}@Overridepublic String getStatusText() throws IOException {return "OK";}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("fallback".getBytes());}@Overridepublic HttpHeaders getHeaders() {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);return headers;}};} }(7)Zuul超時
如果要為通過Zuul代理的請求配置套接字超時和讀取超時,則根據您的配置,有兩種選擇:
-
如果Zuul使用服務發現,則需要使用ribbon.ReadTimeout和ribbon.SocketTimeout功能區屬性配置這些超時?。
如果通過指定URL配置了Zuul路由,則需要使用?zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis。
(8)重寫Location header
如果Zuul在Web應用程序的前面,則Location當Web應用程序通過HTTP狀態代碼重定向時,您可能需要重新編寫標頭3XX。否則,瀏覽器將重定向到Web應用程序的URL,而不是Zuul URL。您可以配置LocationRewriteFilterZuul過濾器以將Location標頭重寫為Zuul的URL。它還會添加回去的全局前綴和特定于路由的前綴。以下示例通過使用Spring Configuration文件添加過濾器:
import org.springframework.cloud.netflix.zuul.filters.post.LocationRewriteFilter; ...@Configuration @EnableZuulProxy public class ZuulConfig {@Beanpublic LocationRewriteFilter locationRewriteFilter() {return new LocationRewriteFilter();} }注:小心使用此過濾器。篩選器作用于Location所有3XX響應代碼的標頭,這可能不適用于所有情況,例如將用戶重定向到外部URL時。
(9)啟用跨源請求
默認情況下,Zuul將所有跨源請求(CORS)路由到服務。如果您想讓Zuul處理這些請求,可以通過提供自定義WebMvcConfigurerbean來完成:
@Bean public WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/path-1/**").allowedOrigins("https://allowed-origin.com").allowedMethods("GET", "POST");}}; }在上面的示例中,我們允許GET和POST方法從allowed-origin.com將跨域請求發送到以開頭的端點path-1。您可以使用/**映射將CORS配置應用于特定的路徑模式,也可以全局應用于整個應用程序。您可以自定義屬性:allowedOrigins,allowedMethods,allowedHeaders,exposedHeaders,allowCredentials并maxAge通過此配置。
(10)監控指標
Zuul將在執行器指標端點下提供指標,以解決路由請求時可能發生的任何故障。您可以點擊來查看這些指標/actuator/metrics。指標將具有格式為的名稱?ZUUL::EXCEPTION:errorCause:statusCode。
?
?
總結
以上是生活随笔為你收集整理的SpringCloud Zuul(三)之常见用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑配置在哪里看的到(电脑配置在哪里看的
- 下一篇: 页游对电脑配置要求(页游对电脑配置)