1、Headerjava
1.一、敏感header的設置spring
通常來講,可在同一個系統中的服務之間共享Header,不過應儘可能防止讓一些敏感的Header外泄。ide
zuul: routes: provide-user: sensitive-headers: Cookie,Set-Cookie
說明:敏感的header不會傳播到下游去,也就是說此處的Cookie,Set-Cookie不會傳播的其它的微服務中去微服務
1.二、忽略的Headerpost
可使用zuul.ignored-headers屬性丟棄一些Header,如:測試
zuul: routes: provide-user: sensitive-headers: Cookie,Set-Cookie ignored-headers: Authorization
說明:忽略的header不會傳播到下游去,也就是說此處的Authorization不會傳播的其它的微服務中去,做用與上面敏感的Header差很少,事實上sensitive-headers會被添加到ignored-headers中。ui
注意:spa
一、默認狀況下zuul.ignored-headers是空的.net
二、若是Spring Security在項目的classpath中,那麼zuul.ignored-headers的默認值就是Pragma,Cache-Control,X-Frame-Options,X-Content-Type-Options,X-XSS-Protection,Expires,因此,當Spring Security在項目的classpath中,同時又須要使用下游微服務的Spring Security的Header時,能夠將zuul.ignoreSecurity-Headers設置爲false3d
2、使用Zuul上傳文件
一、對於小文件(1M之內)上傳,無須任何處理,便可正常上傳。
二、對於大文件(10M以上)上傳,須要爲上傳路徑添加/zuul前綴。
注意:這裏的上傳路徑添加/zuul前綴無須配置
zuul的配置:
zuul: routes: file-upload: /file/**
測試上傳:上傳文件200多M
zuul端拋出超時異常:
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: file-upload timed-out and no fallback available.
解決:在zuul的yml配置文件中加入以下配置:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000 ribbon: ConnectTimeout: 3000 ReadTimeout: 60000
再次測試上傳:上傳文件200多M
3、過濾器
3.一、過濾器類型與請求生命週期
Zuul大部分功能都是經過過濾器來實現的。Zuul中定義了4種標準過濾器類型,這些過濾器類型對應於請求的典型生命週期。
PRE
這種過濾器在請求被路由以前調用。可利用這種過濾實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。
ROUTING
這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。
POST
這種過濾器在路由到微服務之後執行。這種過濾器可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。
ERROR
在其它階段發送錯誤時執行該過濾器。
Zuul請求的生命週期如圖:
3.二、自定義過濾器
Zuul還容許建立自定義的過濾器類型。繼承抽象類ZuulFilter便可。
自定義過濾器須要實現如下方法:
a、filterType:返回過濾器的類型。有pre、route、post、error等,分別對應着上面的過濾器,詳細能夠參考com.netflix.zuul.ZuulFilter.filterType() 中的註釋。
b、filterOrder:返回一個int值來指定過濾器執行的順序,不一樣的過濾器容許返回相同的順序。
c、shouldFilter:返回一個boolean值來判斷該過濾器是否要執行,true表示執行。
d、run:過濾器的具體邏輯。
這裏編寫一個記錄請求日誌的過濾器。
一、新建一個類LogFilter繼承抽象類ZuulFilter
package com.liuy.filter; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; /** * 打印請求日誌 * 記錄請求日誌的過濾器 * @description 記錄請求日誌的過濾器 * @author luis * @version 1.0 * @date:2017年8月23日下午3:58:55 */ public class LogFilter extends ZuulFilter { private static final Logger LOG = LoggerFactory.getLogger(LogFilter.class); @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); LogFilter.LOG.info(String.format("打印日誌 : send %s request to %s", request.getMethod(), request.getRequestURL().toString())); return null; } @Override public boolean shouldFilter() { return true; } @Override public int filterOrder() { return 1; } @Override public String filterType() { return "pre"; } }
二、修改啓動類
package com.liuy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; import com.liuy.filter.LogFilter; /** * Zuul微服務網關 - 過濾器 * @description Zuul微服務網關 - 過濾器 * @author luis * @version 1.0 * @date:2017年8月22日下午2:54:04 */ @SpringBootApplication @EnableZuulProxy public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } /**自定義過濾器*/ @Bean public LogFilter preRequestLogFilter() { return new LogFilter(); } }
三、測試
a、依次啓動eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul-filter(5017)
b、訪問http://localhost:5017/hystrix-consumer-movie/user/1
效果:
3.三、禁用過濾器
Spring Cloud默認爲Zuul編寫了一些過濾器,如DebugFilter、FormBodyWrap-perFilter等,這些過濾器都放在spring-cloud-netflix-core這個jar包的org.springframework.cloud.netflix.zuul.filters包中。在某些場景下,咱們可能須要禁用某些過濾器。
禁用方法很是簡單,只需設置zuul.<SimpleClassName>.<filterType>.disable=true便可禁用SimpleClassName對應的過濾器。
以org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter爲例,如:
zuul.DebugFilter.post.disable=true
之前面咱們自定義的com.liuy.filter.LogFilter爲例,如:
zuul.LogFilter.pre.disable=true