SpringCloud(六):Zuul的多個使用場景

Zuul Http客戶端

  • Zuul使用的默認HTTP客戶端如今由Apache HTTP Client支持,而不是已經不推薦使用的Ribbon RestClient
  • 要使用RestClientokhttp3.0kHttpClient,請分別設置
    ribbon.restclient.enabled = true
    //或
    ribbon.okhttp.enabled = true
    複製代碼

若是要自定義Apache HTTP客戶端或OK HTTP客戶端,請提供ClosableHttpClient或OkHttpClient類型的bean。html

Cookies and Sensitive Headers

配置文件application.yml中設置java

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders: Cookie,Set-Cookie,Authorization
      url: https://downstream
複製代碼

這裏sensitiveHeaders是默認值,因此當你但願它不一樣時,才需進行設置。 這是Spring Cloud Netflix 1.1中的新功能(在1.0中,用戶沒法控制標題,而且全部Cookie都在兩個方向上流動)。git

sensitiveHeaders是黑名單,且默認不爲空。 所以,要使Zuul發送全部標頭(忽略的標頭除外),您必須將其明確設置爲空列表。 若是要將cookie或受權標頭傳遞到後端,則必須這樣作。 如下示例顯示瞭如何使用sensitiveHeaders:github

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders:
      url: https://downstream
複製代碼

您還能夠經過設置sensitiveHeaders來設置zuul.sensitiveHeaders。 若是在路由上設置了sensitiveHeaders,它將覆蓋全局sensitiveHeaders設置。spring

Ignored Headers

  • 常規理解:
    zuul.ignoreHeaders屬性可用於丟棄一些標題。
    例如,設置zuul.ignoredHeaders = Header1,Header2; 那麼Header1和Header2將不會傳播到任何其餘服務。
    默認狀況下,zuul.ignoredHeaders=是空的。但若是Spring Securuty在classpath中。 它的值在是:
Pragma,Cache-Control,X-Frame-Options,X-Content-Type-Options,X-XSS-Protextion,Expires
複製代碼

zuul.ignoreSecurityHeaders的默認值爲true。可是當我想要標頭值的值時 從下游服務咱們須要設置爲false。後端

  • 通俗來說就是:
    route-sensitive外,您還能夠將與下游服務交互期間應丟棄的值(請求和響應)設置名爲zuul.ignoredHeaders的全局值。 默認狀況下,若是Spring Security不在類路徑中,則它們爲空。 不然,它們被初始化爲一組衆所周知的「安全」頭文件(例如,涉及緩存),如Spring Security所指定的那樣。 在這種狀況下的假設是下游服務也可能添加這些頭,但咱們想從代理中得到這些值。 若是要在Spring Security位於類路徑時不丟棄這些衆所周知的security headers,能夠將zuul.ignoreSecurityHeaders設置爲false。 若是您在Spring Security中禁用了HTTP安全響應標頭並但願下游服務提供的值,那麼這樣作會很是有用。

Routes Endpoint

  • 使用routes 端點的前提:
    • Zuul Server須要有Spring Boot Actuator的依賴,不然訪問/routes 端點將會返回404;
    • 設置management.security.enabled = false,不然將會返回401;也可添加Spring Security的依賴,這樣可經過帳號、密碼訪問routes 端點。

Strangulation Patterns and Local Forwards

標題: 扼殺模式和本地轉發
緩存

遷移現有應用程序或API時的一種常見模式是「扼殺」舊端點,慢慢用不一樣的實現替換它們。 Zuul代理是一個有用的工具,由於您可使用它來處理來自舊端點的客戶端的全部流量,但將一些請求重定向到新的端點。tomcat

如下示例顯示「strangle」方案的配置詳細信息:安全

  • application.yml配置示例:
zuul:
 routes:
 first:
 path: /first/**
 url: http://first.example.com
 second:
 path: /second/**
      # forward的是本地轉發
 url: forward:/second
 third:
 path: /third/**
 url: forward:/3rd
 legacy:
 path: /**
 url: http://legacy.example.com
複製代碼

==[注意]== 忽略的模式不會被徹底忽略,它們只是不禁代理處理(所以它們也能夠在本地有效轉發)。bash

Uploading Files through Zuul

標題: 經過zuul上傳文件

  • 若是使用@EnableZuulProxy註解,能夠用代理路徑上傳文件,只要文件很小,它就能夠正常工做。
curl -F "file=@d:/tmp.txt" localhost:8050/upload

curl -F "file=@d:/tmp.txt" localhost:8050/microservice-file-upload/upload
複製代碼
  • 而對於大型文件,須要使用一個替代路徑繞過/zuul/*中的Spring DispatcherServlet; 即便用/zuul/*的方式繞過Spring DispatcherServlet(以免多部分處理)
    curl -F "file=@d:/tmp.txt" localhost:8050/zuul/microservice-file-upload/upload
    複製代碼
    • application.yml配置中須要加以下語句,主要是爲了不文件過大和上傳超時:
    # 通過zuul的請求都會使用hystrix進行包裹
    # hystrix的超時時間
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
    # zuul使用了ribbon作負載均衡
    ribbon:
     ConnectTimeout: 3000
     ReadTimeout: 60000
    複製代碼
    ==[注]== 超時問題解決後,也可能存在堆內存過小,致使上傳失敗,能夠堆tomcat進行以下設置: 點這裏

Disable Zuul Filters

標題: 禁用zuul過濾器

SpringCloud在代理和服務器模式下都默認啓用了許多ZuulFilter bean。

有關能夠啓用的過濾器列表,請參閱Zuul過濾器包

若是要禁用一個過濾器,請參照以下設置zuul.<SimpleClassName>.<filterType>.disable=true;按照慣例,過濾器後的包是Zuul過濾器類型。

例如,要禁用org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter需設置zuul.SendResponseFilter.post.disable = true

相關文章
相關標籤/搜索