javascript
feign服务器响应数据量过大,SpringCloud之Feign 性能优化
本篇文章主要會(huì)講解 Feign 性能優(yōu)化的問(wèn)題,例如Gzip壓縮、HTTP連接池、請(qǐng)求超時(shí)等。
1.Gzip壓縮
1.1 概述
?gzip 介紹:gzip 是一種數(shù)據(jù)格式,采用 deflate 算法壓縮數(shù)據(jù);gzip 是一種流行的文件壓縮算法,應(yīng)用十分廣泛,尤其是在 Linux 平臺(tái)。
gzip 能力:當(dāng) Gzip 壓縮一個(gè)純文本文件時(shí),效果是非常明顯的,大約可以減少 70% 以上的文件大小。
gzip 作用:網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)壓縮后實(shí)際上降低了網(wǎng)絡(luò)傳輸?shù)淖止?jié)數(shù),最明顯的好處就是可以加快網(wǎng)頁(yè)加載的速度。網(wǎng)頁(yè)加載速度加快的好處不言而喻,除了節(jié)省流量,改善用戶的瀏覽體驗(yàn)外,另一個(gè)潛在的好處是 Gzip 與搜索引擎的抓取工具有著更好的關(guān)系。
1.2 HTTP協(xié)議中關(guān)于壓縮傳輸?shù)囊?guī)定
?客戶端向服務(wù)器請(qǐng)求中帶有:Accept-Encoding:gzip,deflate 字段,向服務(wù)器表示客戶端支持的壓縮格式(gzip 或者 deflate),如果不發(fā)送該消息頭,服務(wù)端默認(rèn)是不會(huì)壓縮的。
?服務(wù)端在收到請(qǐng)求之后,如果發(fā)現(xiàn)請(qǐng)求頭中含有 Accept-Encoding 字段,并且支持該類型壓縮,就會(huì)對(duì)響應(yīng)報(bào)文壓縮之后返回給客戶端,并且攜帶 Content-Encoding:gzip 消息頭,表示響應(yīng)報(bào)文是根據(jù)該格式進(jìn)行壓縮的。
?客戶端接收到請(qǐng)求之后,先判斷是否有 Content-Encoding 消息頭,如果有,按該格式解壓報(bào)文。否則按正常報(bào)文處理。
1.3 壓縮案例
局部配置
只配置 Consumer 通過(guò) Feign 到 Provider 的請(qǐng)求與相應(yīng)的 Gzip 壓縮。
服務(wù)消費(fèi)者 application.yml
# Feign gzip 壓縮
feign:
compression:
request:
mime-types: text/xml,application/xml,application/json # 配置壓縮支持的 MIME TYPE
min-request-size: 512 # 配置壓縮數(shù)據(jù)大小的最小閾值,默認(rèn) 2048
enabled: true # 請(qǐng)求是否開(kāi)啟 gzip 壓縮
response:
enabled: true # 響應(yīng)是否開(kāi)啟 gzip 壓縮
復(fù)制代碼
全局配置
對(duì)客戶端瀏覽器的請(qǐng)求以及 Consumer 對(duì) Provider 的請(qǐng)求與響應(yīng)都實(shí)現(xiàn) Gzip 壓縮。
服務(wù)消費(fèi)者 application.yml
server:
compression:
# 是否開(kāi)啟壓縮
enabled: true
# 配置壓縮支持的 MIME TYPE
mime-types: application/json,application/xml,text/html,text/xml,text/plain
復(fù)制代碼
2.HTTP連接池
?我們知道,建立 HTTP 連接的過(guò)程是很復(fù)雜的一個(gè)過(guò)程,涉及到多個(gè)數(shù)據(jù)包的交換,很耗時(shí)間,比如建立TCP連接時(shí),需要的三次握手和四次揮手開(kāi)銷就比較大。
?采用 HTTP 連接池,可以節(jié)約大量的 3 次握手 4 次揮手,這樣能大大提升吞吐量。
Feign 的 HTTP 客戶端支持 3 種框架:HttpURLConnection、HttpClient、OkHttp;默認(rèn)是 HttpURLConnection。可以通過(guò)查看源碼 org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration.java 得知。
傳統(tǒng)的 HttpURLConnection 是 JDK 自帶的,并不支持連接池,如果要實(shí)現(xiàn)連接池的機(jī)制,還需要自己來(lái)管理連接對(duì)象。
HttpClient 相比傳統(tǒng) JDK 自帶的 HttpURLConnection,它封裝了訪問(wèn) HTTP 的請(qǐng)求頭,參數(shù),內(nèi)容體,響應(yīng)等等;它不僅使客戶端發(fā)送 HTTP 請(qǐng)求變得容易,而且也方便了開(kāi)發(fā)人員測(cè)試接口(基于 HTTP 協(xié)議的),既提高了開(kāi)發(fā)的效率,又提高了代碼的健壯性
那么如何使用呢?
首先,在對(duì)應(yīng)消費(fèi)者項(xiàng)目中,添加對(duì)應(yīng)依賴,因?yàn)楸疚闹惺褂玫腍oxton.SR1版本已經(jīng)默認(rèn)集成了 apache httpclient 依賴,所以只需要添加一個(gè)依賴即可
org.apache.httpcomponents
httpclient
4.5.11
io.github.openfeign
feign-httpclient
10.7.4
復(fù)制代碼
然后,配置文件中開(kāi)啟即可
feign:
httpclient:
enabled: true # 開(kāi)啟 httpclient
復(fù)制代碼
**注意:**如果使用 HttpClient 作為 Feign 的客戶端工具。那么在定義接口上的注解是需要注意的,如果傳遞的參數(shù)是一個(gè)自定義的對(duì)象(對(duì)象會(huì)使用 JSON 格式來(lái)專遞),需要配置參數(shù)類型,例如:@GetMapping(value = "/single/pojo", consumes = MediaType.APPLICATION_JSON_VALUE)。本文中使用的 Spring CLoud 版本,已無(wú)需手動(dòng)配置。
3.請(qǐng)求超時(shí)
?Feign 的負(fù)載均衡底層用的就是 Ribbon,所以這里的請(qǐng)求超時(shí)配置其實(shí)就是配置 Ribbon。
在服務(wù)壓力比較大的情況下,可能處理服務(wù)的過(guò)程需要花費(fèi)一定的時(shí)間,而默認(rèn)請(qǐng)求超時(shí)的配置是 1s 所以我們需要調(diào)整該配置延長(zhǎng)請(qǐng)求超時(shí)時(shí)間。
?在消費(fèi)者端配置文件添加:
ribbon:
ConnectTimeout: 5000 # 請(qǐng)求連接的超時(shí)時(shí)間 默認(rèn)的時(shí)間為 1 秒
ReadTimeout: 5000 # 請(qǐng)求處理的超時(shí)時(shí)間
復(fù)制代碼
?
總結(jié)
以上是生活随笔為你收集整理的feign服务器响应数据量过大,SpringCloud之Feign 性能优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java union pay 代码_Ja
- 下一篇: 计算机专业的英语文献,计算机专业英语论文