0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringCloud組件性能優(yōu)化技巧分享

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 作者:柚幾哥哥 ? 2023-08-16 09:47 ? 次閱讀

Springcloud的性能問(wèn)題

應(yīng)用服務(wù)組件調(diào)優(yōu)

Servlet 容器 優(yōu)化

Feign 配置優(yōu)化

Gateway組件調(diào)優(yōu)

Zuul配置 優(yōu)化

hystrix配置 優(yōu)化

ribbon 優(yōu)化

Springcloud的性能問(wèn)題

Springcloud 原始的配置,性能是很低的,大家可以使用Jmeter測(cè)試一下,QPS不會(huì)到50。要做到高并發(fā),需要做不少的配置優(yōu)化,主要的配置優(yōu)化有以下幾點(diǎn):

Feign 配置優(yōu)化

hystrix配置 優(yōu)化

ribbon 優(yōu)化

Servlet 容器 優(yōu)化

Zuul配置 優(yōu)化

應(yīng)用服務(wù)組件調(diào)優(yōu)

Servlet 容器 優(yōu)化

默認(rèn)情況下,Spring Boot 使用 Tomcat 來(lái)作為內(nèi)嵌的 Servlet 容器,可以將 Web 服務(wù)器切換到 Undertow 來(lái)提高應(yīng)用性能,Undertow 是紅帽公司開(kāi)發(fā)的一款基于 NIO 的高性能 Web 嵌入式

Zuul使用的內(nèi)置容器默認(rèn)是Tomcat,可以將其換成undertow,可以顯著減少線程的數(shù)量,替換方式即在pom中添加以下內(nèi)容:

第一步,移除Tomcat 依賴(lài)


org.springframework.boot
spring-boot-starter-web


org.springframework.boot
spring-boot-starter-tomcat

第二步,增加Untertow 依賴(lài)


org.springframework.boot
spring-boot-starter-undertow

第三步,Undertow 的屬性配置

server:
undertow:
io-threads:16
worker-threads:256
buffer-size:1024
buffers-per-region:1024
direct-buffers:true

server.undertow.io-threads: 設(shè)置IO線程數(shù), 它主要執(zhí)行非阻塞的任務(wù),它們會(huì)負(fù)責(zé)多個(gè)連接, 默認(rèn)設(shè)置每個(gè)CPU核心一個(gè)線程,不要設(shè)置過(guò)大,如果過(guò)大,啟動(dòng)項(xiàng)目會(huì)報(bào)錯(cuò):打開(kāi)文件數(shù)過(guò)多

server.undertow.worker-threads`:阻塞任務(wù)線程池,當(dāng)執(zhí)行類(lèi)似servlet請(qǐng)求阻塞IO操作,undertow會(huì)從這個(gè)線程池中取得線程,它的值設(shè)置取決于系統(tǒng)線程執(zhí)行任務(wù)的阻塞系數(shù),默認(rèn)值是`IO線程數(shù)*8

server.undertow.buffer-size: 以下的配置會(huì)影響buffer,這些buffer會(huì)用于服務(wù)器連接的IO操作,有點(diǎn)類(lèi)似netty的池化內(nèi)存管理,每塊buffer的空間大小,越小的空間被利用越充分,不要設(shè)置太大,以免影響其他應(yīng)用,合適即可

server.undertow.buffers-per-region`:每個(gè)區(qū)分配的buffer數(shù)量,所以pool的大小是`buffer-size*buffers-per-region

server.undertow.direct-buffers: 是否分配的直接內(nèi)存(NIO直接分配的堆外內(nèi)存)

07dfe8c0-3bd5-11ee-9e74-dac502259ad0.png

Feign 配置優(yōu)化

feign 默認(rèn)不啟用hystrix,需要手動(dòng)指定 feign.hystrix.enabled=true 開(kāi)啟熔斷

feign 啟用壓縮也是一種有效的性能優(yōu)化方式,具體的配置如下

feign:
compression:
request:
enabled:true
mime-types:text/xml,application/xml,application/json
response:
enabled:true

feign HTTP請(qǐng)求方式選擇

feign默認(rèn)使用的是基于JDK提供的URLConnection調(diào)用HTTP接口,不具備連接池,所以資源開(kāi)銷(xiāo)上有點(diǎn)影響,經(jīng)測(cè)試JDK的URLConnection比Apache HttpClient快很多倍。Apache HttpClient和okhttp都支持配置連接池功能,也可以使用okhttp請(qǐng)求方式。

當(dāng)使用HttpClient時(shí),可如下設(shè)置:

feign:
httpclient:
enabled:true
max-connections:1000
max-connections-per-route:200

當(dāng)使用OKHttp時(shí),可如下設(shè)置:

feign:
okhttp:
enabled:true
httpclient:
max-connections:1000
max-connections-per-route:200

max-connections 設(shè)置整個(gè)連接池最大連接數(shù)(該值默認(rèn)為200), 根據(jù)自己的場(chǎng)景決定

max-connections-per-route 設(shè)置路由的默認(rèn)最大連接(該值默認(rèn)為50),限制數(shù)量實(shí)際使用

07fde3a2-3bd5-11ee-9e74-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

Gateway組件調(diào)優(yōu)

Zuul配置 優(yōu)化

我們知道Hystrix有隔離策略:THREAD 以及SEMAPHORE ,默認(rèn)是 SEMAPHORE 。

Zuul默認(rèn)是使用信號(hào)量隔離,并且信號(hào)量的大小是100,請(qǐng)求的并發(fā)線程超過(guò)100就會(huì)報(bào)錯(cuò),可以調(diào)大該信號(hào)量的最大值來(lái)提高性能,配置如下:

zuul:
semaphore:
max-semaphores:5000

表示,當(dāng)Zuul的隔離策略為SEMAPHORE時(shí),設(shè)置指定服務(wù)的最大信號(hào)量為5000。對(duì)于特定的微服務(wù),可以通過(guò)下面的方式,設(shè)置最大信號(hào)量

設(shè)置默認(rèn)最大信號(hào)量:

zuul:
semaphore:
max-semaphores:5000#默認(rèn)值

設(shè)置指定服務(wù)的最大信號(hào)量:

zuul:
eureka:
:
semaphore:
max-semaphores:5000
08221ae2-3bd5-11ee-9e74-dac502259ad0.png

為了方便ThreadLocal的使用,也可以改為使用線程隔離的策略,這種場(chǎng)景下,就需要調(diào)大hystrix線程池線程大小,該線程池默認(rèn)10個(gè)線程,調(diào)整的配置示例如下:

zuul:
ribbonIsolationStrategy:THREAD
hystrix:
threadpool:
default:
coreSize:100
maximumSize:400
allowMaximumSizeToDivergeFromCoreSize:true
maxQueueSize:-1

hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize:是否讓maximumSize生效,false的話(huà)則只有coreSize會(huì)生效

hystrix.threadpool.default.maxQueueSize:線程池的隊(duì)列大小,-1代表使用SynchronousQueue隊(duì)列

hystrix.threadpool.default.maximumSize:最大線程數(shù)量

hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize:是否讓maximumSize生效,false的話(huà)則只有coreSize會(huì)生效

hystrix.threadpool.default.maxQueueSize:線程池的隊(duì)列大小,-1代表使用SynchronousQueue隊(duì)列

zuul.ribbon-isolation-strategy:設(shè)置線程隔離,thread 線程隔離,SEMAPHORE 表示信號(hào)量隔離

默認(rèn)配置都可以去HystrixThreadPoolProperties和ZuulProperties這兩個(gè)java文件中查找

hystrix配置 優(yōu)化

首先需要設(shè)置參數(shù)hystrix.threadpool.default.coreSize 來(lái)指定熔斷隔離的線程數(shù),這個(gè)數(shù)需要調(diào)優(yōu),經(jīng)測(cè)試線程數(shù)我們?cè)O(shè)置為和提供方的容器線程差不多,吞吐量高許多。

其次,啟用Hystrix后,很多服務(wù)當(dāng)?shù)谝淮卧L問(wèn)的時(shí)候都會(huì)失敗 是因?yàn)槌跏蓟?fù)載均衡一系列操作已經(jīng)超出了超時(shí)時(shí)間了,因?yàn)槟J(rèn)的超時(shí)時(shí)間為1S,需要修改超時(shí)時(shí)間參數(shù),方可解決這個(gè)問(wèn)題。

參考的hystrix配置如下:

hystrix:
threadpool:
default:
coreSize:500
command:
default:
circuitBreaker:
requestVolumeThreshold:1000
fallback:
enabled:true
execution:
isolation:
thread:
timeoutInMilliseconds:100000

hystrix.command.default: 全局的作用域,作用的所有的hystrix的客戶(hù)端,如果需要對(duì)某個(gè)微服務(wù),可以寫(xiě)serviceId

hystrix.command.default.fallback.enabled 是否開(kāi)啟回退方法

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 請(qǐng)求處理的超時(shí)時(shí)間,缺省為1000,表示默認(rèn)的超時(shí)時(shí)間為1S

hystrix.threadpool.default.coreSize 核心線程池?cái)?shù)量

hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests 回退最大線程數(shù)

hystrix.command.default.circuitBreaker.requestVolumeThreshold 熔斷器失敗的個(gè)數(shù),進(jìn)入熔斷器的請(qǐng)求達(dá)到1000時(shí)服務(wù)降級(jí)(之后的請(qǐng)求直接進(jìn)入熔斷器)

083560ca-3bd5-11ee-9e74-dac502259ad0.png

ribbon 優(yōu)化

Ribbon進(jìn)行客戶(hù)端負(fù)載均衡的Client并不是在服務(wù)啟動(dòng)的時(shí)候就初始化好的,而是在調(diào)用的時(shí)候才會(huì)去創(chuàng)建相應(yīng)的Client,所以第一次調(diào)用的耗時(shí)不僅僅包含發(fā)送HTTP請(qǐng)求的時(shí)間,還包含了創(chuàng)建RibbonClient的時(shí)間,這樣一來(lái)如果創(chuàng)建時(shí)間速度較慢,同時(shí)設(shè)置的超時(shí)時(shí)間又比較短的話(huà),很容易就會(huì)出現(xiàn)上面所描述的顯現(xiàn)。

因此我們可以通過(guò)設(shè)置:

ribbon:
eager-load:
enabled:true
clients:service-1,service-2,service-n
086635e2-3bd5-11ee-9e74-dac502259ad0.png

參數(shù)說(shuō)明:

ribbon.eager-load.enabled : 開(kāi)啟Ribbon的饑餓加載模式

ribbon.eager-load.clients: 指定需要饑餓加載的服務(wù)名,如果不指定服務(wù)名稱(chēng),饑餓加載模式無(wú)效

Zuul的饑餓加載,沒(méi)有設(shè)計(jì)專(zhuān)門(mén)的參數(shù)來(lái)配置,而是直接采用了讀取路由配置來(lái)進(jìn)行饑餓加載。所以,如果我們使用默認(rèn)路由,而沒(méi)有通過(guò)配置的方式指定具體路由規(guī)則,那么 zuul.ribbon.eager-load.enabled=true 的配置就沒(méi)有什么作用了。

如果需要真正啟用Zuul 的饑餓加載,需要通過(guò)zuul.ignored-services=*來(lái)忽略所有的默認(rèn)路由,讓所有路由配置均維護(hù)在配置文件中,以達(dá)到網(wǎng)關(guān)啟動(dòng)的時(shí)候就加載好各個(gè)路由的負(fù)載均衡對(duì)象。

關(guān)于Zuul 的默認(rèn)路由,這里詳細(xì)介紹一下。假設(shè)你的注冊(cè)服務(wù)中心有三個(gè)已經(jīng)注冊(cè)的服務(wù)名稱(chēng)service-a,service-b,service-c。但是在zuul配置文件中,只映射了service-a,service-b,如下:

zuul:
ribbon:
eager-load:
enabled:true
ignored-services:‘*’
routes:
a:
path:/a/**
serviceId:service-a
b:
path:/b/**
serviceId:service-b

這里,雖然沒(méi)有配置service-c的映射,但是,由于zuul有默認(rèn)的映射機(jī)制,還是可以通過(guò)Url,訪問(wèn)到你的service-c服務(wù),如果不想向外界暴露默認(rèn)的服務(wù)映射,可以加上 zuul.ignored-services:*




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    15272
  • JAVA語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20055
  • QPS
    QPS
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8782
  • HTTP接口
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    1755

原文標(biāo)題:SpringCloud 組件性能優(yōu)化技巧

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS NEXT應(yīng)用開(kāi)發(fā)性能優(yōu)化入門(mén)引導(dǎo)

    ,使用相對(duì)布局、絕對(duì)定位、自定義布局、Grid、GridRow等扁平化布局,減少布局的嵌套層數(shù),避免系統(tǒng)繪制更多的布局組件,達(dá)到優(yōu)化性能、減少內(nèi)存占用的目的。 第三板斧:合理管理狀態(tài)變量 ,應(yīng)該合理地
    發(fā)表于 05-09 14:49

    一款3605電源芯片的性能優(yōu)化與改進(jìn)思路

    在電源設(shè)計(jì)中,確保電源轉(zhuǎn)換器在各種工作條件下都能提供穩(wěn)定和高效的性能至關(guān)重要。 ASP3605是一款高效同步降壓轉(zhuǎn)換器,它提供了多種調(diào)節(jié)選項(xiàng),以優(yōu)化電源的性能。特別是,ITH(Error
    發(fā)表于 08-23 14:34

    HBase性能優(yōu)化方法總結(jié)

    HBase是Hadoop生態(tài)系統(tǒng)中的一個(gè)組件,是一個(gè)分布式、面向列的開(kāi)源數(shù)據(jù)庫(kù),可以支持?jǐn)?shù)百萬(wàn)列、超過(guò)10億行的數(shù)據(jù)存儲(chǔ),因此,對(duì)HBase性能提出了一定的要求,那么如何進(jìn)行HBase性能優(yōu)化
    發(fā)表于 04-20 17:16

    css的性能優(yōu)化重點(diǎn)

    網(wǎng)站前端性能優(yōu)化之javascript和css
    發(fā)表于 10-21 09:12

    前端性能怎么優(yōu)化

    前端性能優(yōu)化常見(jiàn)方式
    發(fā)表于 03-27 11:42

    MySQL優(yōu)化之查詢(xún)性能優(yōu)化之查詢(xún)優(yōu)化器的局限性與提示

    MySQL優(yōu)化三:查詢(xún)性能優(yōu)化之查詢(xún)優(yōu)化器的局限性與提示
    發(fā)表于 06-02 06:34

    web常用的性能優(yōu)化

    web常用性能優(yōu)化
    發(fā)表于 06-13 10:57

    AN0004—AT32 性能優(yōu)化

    本帖最后由 貪玩 于 2022-2-16 21:42 編輯 AN0004—AT32 性能優(yōu)化這篇應(yīng)用筆記描述了如何通過(guò)軟件方法提高AT32的運(yùn)行效能。AT32 性能優(yōu)化概述
    發(fā)表于 08-15 14:38

    《現(xiàn)代CPU性能分析與優(yōu)化》---精簡(jiǎn)的優(yōu)化書(shū)

    《現(xiàn)代CPU性能分析與優(yōu)化》是一本非常實(shí)用的書(shū)籍,對(duì)于從事性能關(guān)鍵型應(yīng)用程序開(kāi)發(fā)和進(jìn)行系統(tǒng)底層優(yōu)化的技術(shù)人員來(lái)說(shuō)是不可或缺的。這本書(shū)也很適合任何想更好地了解應(yīng)用程序
    發(fā)表于 04-18 16:03

    優(yōu)化印制電路板組件(PCBA)的設(shè)計(jì)

    。讓我們看看您的電路板設(shè)計(jì)和組件選擇如何優(yōu)化您的 CM 設(shè)計(jì)的 PCBA 。 PCBA 優(yōu)化的電路板設(shè)計(jì) 制造設(shè)計(jì)( DFM )是根據(jù)準(zhǔn)則使用的方法,用于根據(jù) CM 的設(shè)備功能確定電路板布局的規(guī)格。 DFM 包含針對(duì)板制造, P
    的頭像 發(fā)表于 10-11 20:21 ?1967次閱讀

    優(yōu)化揚(yáng)聲器組件的三個(gè)例子分享

    無(wú)論是用于家庭影院系統(tǒng)、健身房、家庭野餐還是音樂(lè)會(huì)場(chǎng)地,揚(yáng)聲器都要表現(xiàn)出最佳的性能。為了設(shè)計(jì)高性能揚(yáng)聲器,我們可以使用仿真優(yōu)化它的各種組件。例如,我們可以使用 COMSOL Multi
    的頭像 發(fā)表于 04-19 16:44 ?1709次閱讀
    <b class='flag-5'>優(yōu)化</b>揚(yáng)聲器<b class='flag-5'>組件</b>的三個(gè)例子分享

    Nacos、OpenFeign、Ribbon組件協(xié)調(diào)工作的原理

    ? ? Nacos 如何進(jìn)行服務(wù)自動(dòng)注冊(cè)? Ribbon OpenFeign 總結(jié) 前幾天有個(gè)大兄弟問(wèn)了我一個(gè)問(wèn)題,注冊(cè)中心要集成SpringCloud,想實(shí)現(xiàn)SpringCloud的負(fù)載均衡,需要
    的頭像 發(fā)表于 05-22 10:46 ?888次閱讀
    Nacos、OpenFeign、Ribbon<b class='flag-5'>組件</b>協(xié)調(diào)工作的原理

    springcloud五大組件

    Spring Cloud是一個(gè)基于Spring Boot的開(kāi)發(fā)工具包,可用于快速構(gòu)建微服務(wù)架構(gòu)的應(yīng)用程序。它將常見(jiàn)的微服務(wù)架構(gòu)模式抽象為五個(gè)核心組件:服務(wù)發(fā)現(xiàn)、服務(wù)注冊(cè)、負(fù)載均衡、斷路器和配置管理
    的頭像 發(fā)表于 11-16 11:04 ?1077次閱讀

    springcloud alibaba 五大組件

    Spring Cloud Alibaba是Spring Cloud的一個(gè)子項(xiàng)目,該項(xiàng)目致力于為構(gòu)建分布式應(yīng)用提供一站式解決方案。它基于阿里巴巴的底層Java開(kāi)源框架,主要包含以下五大組件: 服務(wù)注冊(cè)
    的頭像 發(fā)表于 12-03 16:30 ?2w次閱讀

    組件測(cè)試儀如何提高太陽(yáng)能組件性能?

      JD-EL4太陽(yáng)能組件測(cè)試儀在太陽(yáng)能行業(yè)中扮演著至關(guān)重要的角色,不僅可以檢測(cè)組件的缺陷和問(wèn)題,還可以幫助提高太陽(yáng)能組件性能。以下是太陽(yáng)能組件
    的頭像 發(fā)表于 05-21 17:13 ?562次閱讀