SpringCloud使用Zuul處理檔案上傳

2021-08-28 15:21:01 字數 2849 閱讀 5294

構建微服務的時候,一般所有的請求都會通過閘道器進行處理,在閘道器這層我們可以做很多事情,比如攔截,負載均衡,熔斷等等。

使用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代表的是服務名稱,connecttimeoutreadtimeout很重要就是呼叫遠端服務,從傳送請求到接受到響應的時間,如果超過這個時間沒有響應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作...