springboot服務(wù)性能優(yōu)化海量資源_第1頁
springboot服務(wù)性能優(yōu)化海量資源_第2頁
springboot服務(wù)性能優(yōu)化海量資源_第3頁
springboot服務(wù)性能優(yōu)化海量資源_第4頁
springboot服務(wù)性能優(yōu)化海量資源_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本文由簡悅SimpRead轉(zhuǎn)碼,原文地址在開始對SpringBoot服務(wù)進(jìn)行性能優(yōu)化之前,你需要做一些準(zhǔn)備,把SpringBoot服務(wù)的一些數(shù)據(jù)暴就需要把連接池的參數(shù)給暴露出來。我們這里采用的監(jiān)控工具是本文由簡悅SimpRead轉(zhuǎn)碼,原文地址在開始對SpringBoot服務(wù)進(jìn)行性能優(yōu)化之前,你需要做一些準(zhǔn)備,把SpringBoot服務(wù)的一些數(shù)據(jù)暴就需要把連接池的參數(shù)給暴露出來。我們這里采用的監(jiān)控工具是Prometheus,它是一個是時序數(shù)據(jù)庫,能夠存儲我們的指標(biāo)。PrometheusSpringBootmaven<artifactId>spring-boot-starter-<artifactId>micrometer-registry-<artifactId>micrometer-然后,我們需要在perties啟動之后,我們就可以通過訪問監(jiān)控接口想要監(jiān)控業(yè)務(wù)數(shù)據(jù)也是比較簡單的,你只需要注入一個MeterRegistry啟動之后,我們就可以通過訪問監(jiān)控接口想要監(jiān)控業(yè)務(wù)數(shù)據(jù)也是比較簡單的,你只需要注入一個MeterRegistry碼:MeterRegistrypublicStringtest()"from","method",returntest_total{from="",method="test",}這里簡單介紹一下流行的Prometheus監(jiān)控體系,Prometheus使用拉的方式獲取監(jiān)控數(shù)據(jù),這個暴露數(shù)據(jù)的過程可以交給功能更加齊全的returntest_total{from="",method="test",}這里簡單介紹一下流行的Prometheus監(jiān)控體系,Prometheus使用拉的方式獲取監(jiān)控數(shù)據(jù),這個暴露數(shù)據(jù)的過程可以交給功能更加齊全的telegraf組件。如上圖,我們通常使用Gafana進(jìn)行監(jiān)控數(shù)據(jù)的展示,使用AlertManager分的搭建工作不是我們的重點(diǎn),感興趣的同學(xué)可自行研究。下圖便是一張典型的監(jiān)控圖,可以看到RedisJava火焰圖火焰圖也可以用來分析Java應(yīng)用??梢詮膅ithub上下載async-pro?ler的壓縮包進(jìn)行相關(guān)操作。比/root/javaagentJava應(yīng)用,命令行如下:java-agentpath:/root/build/libasyncProfiler.so=start,svg,file=profile.svg-spring-petclinic-2.3.1.BUILD-java-agentpath:/root/build/libasyncProfiler.so=start,svg,file=profile.svg-spring-petclinic-2.3.1.BUILD-運(yùn)行一段時間后,停止進(jìn)程,可以看到在當(dāng)前目錄下,生成了po?le.svg覽器打開的。明它可能是一個瓶頸。一層層向下瀏覽,即可找到需要優(yōu)化的目標(biāo)。對一個普通的Web如下圖,在瀏覽器中輸入相應(yīng)的域名,需要通過DNS解析到具體的IP地址上,為了保證高可用,我們的服務(wù)一般都會部署多份,然后使用Nginx做反向代理和負(fù)載均衡。NginxSpringBootSpringBoottomcatWebMVC模式,最終訪問到我們的數(shù)HTTP下面我們舉例來看一下,哪些動作能夠加快網(wǎng)頁的獲取。為了描述方便,我們僅討論HTTP1.1協(xié)議CDNCDN(ContentDelivery下面我們舉例來看一下,哪些動作能夠加快網(wǎng)頁的獲取。為了描述方便,我們僅討論HTTP1.1協(xié)議CDNCDN(ContentDeliveryNetwork)分發(fā),甚至是一些常用的前端腳本、樣式、圖片等,都可以放到CDN上。CDN通常能夠加快這些文件的獲取,網(wǎng)頁加載也更加迅速。瀏覽器會判斷HTTP頭Cache-Control的內(nèi)容,用來決定是否使用瀏覽器緩存,這在管理一些靜態(tài)文件這個參數(shù)可以在Nginxlocation~*^.+\.(ico|gif|jpg|jpeg|png)$緩存1add_headerCache-Control:no-cache,max-減少每個頁面請求的域名數(shù)量,盡量保證在4個之內(nèi)。這是因?yàn)?,瀏覽器每次訪問后端的資源,都需要先查詢一次DNS,然后找到DNS對應(yīng)的IP地址,再進(jìn)行真正的調(diào)用。DNS有多層緩存,比如瀏覽器會緩存一份、本地主機(jī)會緩存、ISP服務(wù)商緩存等。從DNS到IP地址的轉(zhuǎn)變,通常會花費(fèi)20-120ms的時間。減少域名的數(shù)量,可加快資源的獲取。開啟開啟gzip高傳輸效率。在nginxgzipgzip_min_lengthgzip_buffers4gzip_comp_levelgzip_http_versiongzip_typestext/plainapplication/javascript對JavaScript和CSS,甚至是HTML進(jìn)行壓縮。道理類似,現(xiàn)在流行的前后端分離模式,一般都是對這使用長連接可以顯著減少網(wǎng)絡(luò)交互,提高性能。nginx默認(rèn)開啟了對客戶端的keepavlide對JavaScript和CSS,甚至是HTML進(jìn)行壓縮。道理類似,現(xiàn)在流行的前后端分離模式,一般都是對這使用長連接可以顯著減少網(wǎng)絡(luò)交互,提高性能。nginx默認(rèn)開啟了對客戶端的keepavlidehttpkeepalive_timeout120skeepalive_requestsnginx與后端upstreamlocation~proxy_http_versionproxy_set_headerConnection如果你的項(xiàng)目并發(fā)量比較高,想要修改最大線程數(shù)、最大連接數(shù)等配置信息,可以通過自定義Web容@SpringBootApplication(proxyBeanMethods=publicclassAppimplementsWebServerFactoryCustomizer<ConfigurableServletWebServerFactory>{publicstaticvoidmain(String[]args)注意上面的代碼,我們設(shè)置了它的協(xié)議為org.apache.coyote.http11.Http11Nio2Protocol,意思就是開啟了Nio2。這個參數(shù)在Tomcat8.0注意上面的代碼,我們設(shè)置了它的協(xié)議為org.apache.coyote.http11.Http11Nio2Protocol,意思就是開啟了Nio2。這個參數(shù)在Tomcat8.0之后才有,開啟之后會增加一部分性能。對比如下(測試項(xiàng)目代碼見spring-petclinic-SpringApplication.run(PetClinicApplication.class,publicvoidcustomize(ConfigurableServletWebServerFactoryfactory)f.addConnectorCustomizers(c->[root@localhostwrk2-master]#./wrk-t2-c100-d30s-Running30stest@2threadsand100mean4588.131ms,ratemean4647.927ms,[root@localhostwrk2-master]#./wrk-t2-c100-d30s-Running30stest@2threadsand100mean4588.131ms,ratemean4647.927ms,rate +/-6471Socket0,0,0,Nio2[root@localhostwrk2-master]#./wrk-t2-c100-d30s-R2000Running30stest@2threadsand100Threadcalibration:meanlat.:4358.805ms,ratesamplinginterval:Threadcalibration:meanlat.:4622.087ms,ratesamplinginterval:Thread +/-7469Socket0,0,0,timeouttomcat7469Socket0,0,0,timeouttomcatundertow。undertowWeb容器,更加輕量級一些,占用的內(nèi)<artifactId>spring-boot-starter-<artifactId>spring-boot-starter-<artifactId>spring-boot-starter-其實(shí),對于tomcat優(yōu)化最為有效的,還是JVM參數(shù)的配置,你可以參考上一課時的內(nèi)容進(jìn)行調(diào)整。比如,使用下面的參數(shù)啟動,QPS由248上升到308。<artifactId>spring-boot-starter-其實(shí),對于tomcat優(yōu)化最為有效的,還是JVM參數(shù)的配置,你可以參考上一課時的內(nèi)容進(jìn)行調(diào)整。比如,使用下面的參數(shù)啟動,QPS由248上升到308。對于一個web服務(wù)來說,最緩慢的地方就在于數(shù)據(jù)庫操作。所以,使用“07|案例分析:無處不在的緩存,高并發(fā)系統(tǒng)的法寶和“08|案例分析:Redis如何助力秒殺業(yè)務(wù)”提供的本地緩存和分布式緩存優(yōu)對于如何定位到復(fù)雜分布式環(huán)境中的問題,我這里想要分享另外一個工具:SkywalkingSkywalking是使用探針技術(shù)(JavaAgent)來實(shí)現(xiàn)的。通過在Java的啟動參數(shù)中,加入javaagentJar包,即可將性能數(shù)據(jù)和調(diào)用鏈數(shù)據(jù)封裝,并發(fā)送到Skywalking下載相應(yīng)的安裝包(如果使用ES存儲,需要下載專用的安裝包),將agenttarxvfskywalking-agent.tar.gz-C在業(yè)務(wù)啟動參數(shù)中加入agentjava-jar/opt/test-service/spring-boot-demo.jar--java-javaagent:/opt/skywalking-agent/skywalking-agent.jarboot-demo.ja--files.active=dev訪問一些服務(wù)的鏈接,打開Skywalking的UI,即可看到下圖的界面。這些指標(biāo)可以類比“01|析:性能優(yōu)化,有哪些衡量指標(biāo)?需要注意什么?”提到的衡量指標(biāo)去理解,我們就可以從圖中找到響應(yīng)比較慢QPS又比較高的接口,進(jìn)行專項(xiàng)優(yōu)化。1.Controller1.Controllercontoller層用于接收前端的查詢參數(shù),然后構(gòu)造查詢結(jié)果?,F(xiàn)在很多項(xiàng)目都采用前后端分離的架構(gòu),所以contoller層的方法,一般會使用@ResponseBody注解,把查詢的結(jié)果,解析成JSON(兼顧效率和可讀性)由于contoller據(jù)集的大小上。如果結(jié)果集合非常大,JSON解析組件就要花費(fèi)較多的時間進(jìn)行解析,假如結(jié)果集在解析成JSON之前,占用的內(nèi)存是10MB,那么在解析過程中,有可能會使用20M或者我見過很多案例,由于返回對象的嵌套層次太深、引用了不該引用的對象(比如非常大的byte[]對所以,對于一般的服務(wù),保持結(jié)果集的精簡,是非常有必要的,這也是O(datatansfer存在的必要。如果你的項(xiàng)目,返回的結(jié)果結(jié)構(gòu)比較復(fù)雜,對結(jié)果集進(jìn)行一次轉(zhuǎn)換是非常有必要的。2.Serviceservice層用于處理具體的業(yè)務(wù),大部分功能需求都是在這里完成的。service很少會保存狀態(tài),而且可以被contoller復(fù)用。serviceserviceservice面課時提供的優(yōu)化思路進(jìn)行優(yōu)化。如上圖,四個操作分散在三個不同的資源中。要想達(dá)到一致性,需要三個不同的資源MySQL、MQ、ElasticSeach進(jìn)行統(tǒng)一協(xié)調(diào)。它們底層的協(xié)議,以及實(shí)現(xiàn)方式,都是不一樣的,那就無法通過如上圖,四個操作分散在三個不同的資源中。要想達(dá)到一致性,需要三個不同的資源MySQL、MQ、ElasticSeach進(jìn)行統(tǒng)一協(xié)調(diào)。它們底層的協(xié)議,以及實(shí)現(xiàn)方式,都是不一樣的,那就無法通過提供的ansaction注解來解決,需要借助外部的組件來完成。手,因?yàn)樗褂妙~外的步驟去保證一致性,常用的方法有:兩階段提交方案、C、本地消息表、MQ事務(wù)消息、分布式事務(wù)中間件等。之間的名詞,叫作柔性事務(wù)。柔性事務(wù)的理念是將業(yè)務(wù)邏輯和互斥操作,從資源層上移至業(yè)務(wù)層面。關(guān)系數(shù)據(jù)庫,最大的特點(diǎn)就是事務(wù)處理,即滿足ACID原子性(Atomicity):一致性(Consistency):系統(tǒng)必須始終處在強(qiáng)一致狀態(tài)下。隔離性(Isolation):持久性(Durability):BASEBASEBasicallyAvailable、Soft-state、EventuallyconsistentBASE基本可用(BasicallyAvailable):軟狀態(tài)(Soft-state):系統(tǒng)不要求一直保持強(qiáng)一致狀態(tài)。最終一致性(Eventualconsistency):復(fù)。3.Dao最終一致性(Eve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論