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

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

  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、過濾器

3.一、過濾器類型與請求生命週期

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

PRE

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

ROUTING

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

POST

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

ERROR

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


Zuul請求的生命週期如圖:

  wKiom1mdM13i3jJcAACmQj_aSBA350.png

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 

 效果:

  wKioL1meO4iRTgcsAABhrBNVfco050.jpg

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
相關文章
相關標籤/搜索