構建微服務的時候,一般所有的請求都會通過閘道器進行處理,在閘道器這層我們可以做很多事情,比如攔截,負載均衡,熔斷等等。使用zuul也可以進行檔案上傳處理,但是在文件中明確說明,zuul在做檔案上傳的時候只支援小檔案的上傳,大檔案上傳會報錯。但是zuul給出了備選的方案,zuul實質是乙個
servlet
,它會預設整合springmvc
,當你上傳小檔案的時候,zuul會將請求交給springmvc
**處理,但是如果你不想交給springmvc
,此時你就需要使用zuul提供servlet路徑繞過springmvc
,這個servlet
的預設路徑為:/zuul/*
。當你提供的zuul.routes.customers=/customers/**
,那麼你訪問"/zuul/customers/*"
會直接訪問對應微服務的介面。
設定啟動類
@enablediscoveryclient
@enablezuulproxy
@enablefeignclients
@enableeurekaclient
@enableretry
public
class
/** * 解決上傳檔案重置問題
* @return
*/@bean
public tomcatembeddedservletcontaine***ctory tomcatembeddedservletcontaine***ctory()
});return factory;}}
上面的bean主要處理上傳檔案大於10m會出現連線重置的情況。
設定配置引數
檔案上傳一般都需要配置些檔案上傳對應的引數,springboot預設是開啟檔案上傳,它主要由如下幾個引數進行配置:
注意:
對於大檔案上傳一定要設定spring.http.multipart.file-size-threshold=10mb
,設定這個的目的是在檔案上傳的時候,會不斷的將請求中的檔案資料寫入磁碟,如果不設定,所有的二進位制資料就會存放在記憶體中,通過zuul做請求**的時候,相當於會把這個資料給複製兩份到記憶體中,很容易撐爆系統記憶體,造成oom
。設定超時時間
在zuul中預設是使用ribbon進行看來進行服務排程的,ribbon會根據實際情況來做請求分發,所以對於檔案上傳來說,我們需要適當的設定超時時間,這樣可以避免zuul返回錯誤的訊息。
上面的cloudplatform-service-local
:#設定ribbon的請求超時時間,大檔案上傳必須調高此時間
ribbon
:connecttimeout
:60000
readtimeout
:20000
#同乙個server重試的次數(除去首次)
maxautoretries:3
#切換到不同server的次數
maxautoretriesnextserver:3
#對所有方法進行重試
oktoretryonalloperations
:true
cloudplatform-service-local
代表的是服務名稱,connecttimeout
和readtimeout
很重要就是呼叫遠端服務,從傳送請求到接受到響應的時間,如果超過這個時間沒有響應zuul會認為請求失敗,實際上檔案確實是上傳了,但是由於返回不及時,zuul給自動處理了。因此我們需要放寬這個時間才能得到正確的響應。q : 對於上傳中文檔案會發生亂碼
zuul給出的方案是走servlet而不是springmvc,也就是上傳檔案時,使用路徑為
/zuul/customers/*
,customers
指你配置的路由zuul.routes.customers=/customers/**
,所有path
中包含customers
字首的都會分發到customers
這個微服務中。但是這樣一來太不靈活了,因為有些需要經過servlet,有些卻不需要,所以我們可以直接設定zuulservlet的路徑為root
,即zuul.servlet-path=/
。q:對於大檔案的上傳
zuul針對大檔案的上傳會出現
requst bad
,但是在我實驗的過程中沒有走/zuul/customers/*
卻依然可以進行上傳,只是當檔案過大的時候會發生超時。但是通過設定超時時間就可以解決這個問題。但是這樣帶來後果無限的等待,呼叫任何的服務,只要服務出現錯誤就會一直等待,不能很好的進行熔斷。 參考spring file upload and connection reset issue
uploading files through zuul
SpringCloud 商城系統搭建之Zuul
spring cloud zuul路由是微服務架構的不可或缺的一部分,提供動態路由,監控,彈性,安全等的邊緣服務。zuul是netflix出品的乙個基於jvm路由和服務端的負載均衡器。本文是基於springcloud 系統搭建之eureka pom.xml 4.0.0 com.zzg superma...
springcloud筆記7 服務閘道器Zuul
zuul 主要提供了對請求的路由與過濾功能。1,建立springboot工程,匯入依賴 1.8 hoxton.release org.springframework.cloud spring cloud starter netflix eureka client org.springframewor...
springcloud教程之服務閘道器zuul基礎篇
springcloud教程之服務閘道器zuul基礎篇。為什麼需要api gateway 1 簡化客戶端呼叫複雜度 在微服務架構模式下後端服務的例項數一般是動態的,對於客戶端而言很難發現動態改變的服務例項的訪問位址資訊。因此在基於微服務的專案中為了簡化前端的呼叫邏輯,通常會引入api gateway作...