springCloud(15):使用Zuul構建微服務網關-Header與文件上傳和過濾器

一、Header

1.1、敏感header的設置

一般來說,可在同一個系統中的服務之間共享Header,不過應儘量防止讓一些敏感的Header外泄。

zuul:
  routes:
    provide-user: 
     sensitive-headers: Cookie,Set-Cookie

說明:敏感的header不會傳播到下游去,也就是說此處的Cookie,Set-Cookie不會傳播的其它的微服務中去

1.2、忽略的Header

可以使用zuul.ignored-headers屬性丟棄一些Header,如:

zuul:
  routes:
    provide-user: 
     sensitive-headers: Cookie,Set-Cookie
  ignored-headers: Authorization

說明:忽略的header不會傳播到下游去,也就是說此處的Authorization不會傳播的其它的微服務中去,作用與上面敏感的Header差不多事實上sensitive-headers會被添加到ignored-headers中。


注意:

 1、默認情況下zuul.ignored-headers是空的

 2、如果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設置爲false

二、使用Zuul上傳文件

1、對於小文件(1M以內)上傳,無須任何處理,即可正常上傳。

2、對於大文件(10M以上)上傳,需要爲上傳路徑添加/zuul前綴。

注意:這裏的上傳路徑添加/zuul前綴無須配置


zuul的配置:

zuul:
  routes:
    file-upload: /file/**


測試上傳:上傳文件200多M

  wKioL1mdJ8ODXYe_AACJcUHRmwQ578.png

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   

 wKiom1mdLLfSebcyAABnqzPW_58519.png

三、過濾器

3.1、過濾器類型與請求生命週期

Zuul大部分功能都是通過過濾器來實現的。Zuul中定義了4種標準過濾器類型,這些過濾器類型對應於請求的典型生命週期。

PRE

 這種過濾器在請求被路由之前調用。可利用這種過濾實現身份驗證、在集羣中選擇請求的微服務、記錄調試信息等。

ROUTING

 這種過濾器將請求路由到微服務。這種過濾器用於構建發送給微服務的請求,並使用Apache HttpClient或Netfilx Ribbon請求微服務。

POST

 這種過濾器在路由到微服務以後執行。這種過濾器可用來爲響應添加標準的HTTP Header、收集統計信息和指標、將響應從微服務發送給客戶端等。

ERROR

 在其它階段發送錯誤時執行該過濾器。


Zuul請求的生命週期如圖:

  wKiom1mdM13i3jJcAACmQj_aSBA350.png

3.2、自定義過濾器

Zuul還允許創建自定義的過濾器類型。繼承抽象類ZuulFilter即可。

自定義過濾器需要實現以下方法:

 a、filterType:返回過濾器的類型。有pre、route、post、error等,分別對應着上面的過濾器,詳細可以參考com.netflix.zuul.ZuulFilter.filterType() 中的註釋。

 b、filterOrder:返回一個int值來指定過濾器執行的順序,不同的過濾器允許返回相同的順序。

 c、shouldFilter:返回一個boolean值來判斷該過濾器是否要執行,true表示執行。

 d、run:過濾器的具體邏輯。


這裏編寫一個記錄請求日誌的過濾器。

1、新建一個類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";
	}
}

2、修改啓動類

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();
	}
}

3、測試

 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 

 效果:

  wKioL1meO4iRTgcsAABhrBNVfco050.jpg

3.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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章