Java高并發(fā)高性能分布式框架從無(wú)到有微服務(wù)架構(gòu)設(shè)計(jì)說(shuō)明_第1頁(yè)
Java高并發(fā)高性能分布式框架從無(wú)到有微服務(wù)架構(gòu)設(shè)計(jì)說(shuō)明_第2頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java高并發(fā)高性能分布式框架從無(wú)到有微服務(wù)架構(gòu)設(shè)計(jì)微服務(wù)架構(gòu)模式(MicroserviceArchitectPattern)。近兩年在服務(wù)的瘋狂增長(zhǎng)與云計(jì)算技術(shù)的進(jìn)步,讓微服務(wù)架構(gòu)受到重點(diǎn)關(guān)注微服務(wù)架構(gòu)是一種架構(gòu)模式,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP的RESTfulAPI)。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠被獨(dú)立地部署到生產(chǎn)環(huán)境、類(lèi)生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)業(yè)務(wù)上下文,選擇合適的

2、語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。微服務(wù)架構(gòu)優(yōu)勢(shì)首先簡(jiǎn)單介紹了微服務(wù)(Microservices)的涵及優(yōu)勢(shì),微服務(wù)架構(gòu)的本質(zhì),是用一些功能比較明確、業(yè)務(wù)比較精練的服務(wù)去解決更大、更實(shí)際的問(wèn)題。微服務(wù)架構(gòu)將服務(wù)拆分,分別采用相對(duì)獨(dú)立的服務(wù)對(duì)各方面進(jìn)行管理,彼此之間使用統(tǒng)一的接口來(lái)進(jìn)行交流,架構(gòu)變得復(fù)雜,優(yōu)勢(shì)也很明顯:復(fù)雜度可控:在將應(yīng)用分解的同時(shí),規(guī)避了原本復(fù)雜度無(wú)止境的積累。每一個(gè)微服務(wù)專(zhuān)注于單一功能,并通過(guò)定義良好的接口清晰表述服務(wù)邊界。由于體積小、復(fù)雜度低,每個(gè)微服務(wù)可由一個(gè)小規(guī)模開(kāi)發(fā)團(tuán)隊(duì)完全掌控,易于保持高可維護(hù)性和開(kāi)發(fā)效率。什么是微服務(wù)架構(gòu)微服務(wù)架構(gòu)優(yōu)勢(shì)獨(dú)立部署:由于微服務(wù)具備獨(dú)立的運(yùn)行進(jìn)程,

3、所以每個(gè)微服務(wù)也可以獨(dú)立部署。當(dāng)某個(gè)微服務(wù)發(fā)生變更時(shí)無(wú)需編譯、部署整個(gè)應(yīng)用。由微服務(wù)組成的應(yīng)用相當(dāng)于具備一系列可并行的發(fā)布流程,使得發(fā)布更加高效,同時(shí)降低對(duì)生產(chǎn)環(huán)境所造成的風(fēng)險(xiǎn),最終縮短應(yīng)用交付周期。技術(shù)選型靈活:微服務(wù)架構(gòu)下,技術(shù)選型是去中心化的。每個(gè)團(tuán)隊(duì)可以根據(jù)自身服務(wù)的需求和行業(yè)發(fā)展的現(xiàn)狀,自由選擇最適合的技術(shù)棧。由于每個(gè)微服務(wù)相對(duì)簡(jiǎn)單,當(dāng)需要對(duì)技術(shù)棧進(jìn)行升級(jí)時(shí)所面臨的風(fēng)險(xiǎn)較低,甚至完全重構(gòu)一個(gè)微服務(wù)也是可行的。容錯(cuò):當(dāng)某一組建發(fā)生故障時(shí),在單一進(jìn)程的傳統(tǒng)架構(gòu)下,故障很有可能在進(jìn)程擴(kuò)散,形成應(yīng)用全局性的不可用。在微服務(wù)架構(gòu)下,故障會(huì)被隔離在單個(gè)服務(wù)中。若設(shè)計(jì)良好,其他服務(wù)可通過(guò)重試、平穩(wěn)

4、退化等機(jī)制實(shí)現(xiàn)應(yīng)用層面的容錯(cuò)。擴(kuò)展:?jiǎn)螇K架構(gòu)應(yīng)用也可以實(shí)現(xiàn)橫向擴(kuò)展,就是將整個(gè)應(yīng)用完整的復(fù)制到不同的節(jié)點(diǎn)。當(dāng)應(yīng)用的不同組件在擴(kuò)展需求上存在差異時(shí),微服務(wù)架構(gòu)便體現(xiàn)出其靈活性,因?yàn)槊總€(gè)服務(wù)可以根據(jù)實(shí)際需求獨(dú)立進(jìn)行擴(kuò)展。互聯(lián)網(wǎng)高并發(fā)相關(guān)名詞頁(yè)面瀏覽數(shù)(pageviews)唯一身份瀏覽量(UniquePageViews)獨(dú)立訪問(wèn)者數(shù)量(uniquevisitors)重復(fù)訪問(wèn)者數(shù)量(repeatvisitors)每個(gè)訪問(wèn)者的頁(yè)面瀏覽數(shù)(PageViewsperuser)高并發(fā)之前我將高并發(fā)的解決方法誤認(rèn)為是線程或者是隊(duì)列可以解決,因?yàn)楦卟l(fā)的時(shí)候是有很多用戶在訪問(wèn),導(dǎo)致出現(xiàn)系統(tǒng)數(shù)據(jù)不正確、丟失數(shù)據(jù)現(xiàn)象

5、,所以想到的是用隊(duì)列解決,其實(shí)隊(duì)列解決的方式也可以處理,比如我們?cè)诟?jìng)拍商品、轉(zhuǎn)發(fā)評(píng)論微博或者是秒殺商品等,同一時(shí)間訪問(wèn)量特別大,隊(duì)列在此起到特別的作用,將所有請(qǐng)求放入隊(duì)列,以毫秒計(jì)時(shí)單位,有序的進(jìn)行,從而不會(huì)出現(xiàn)數(shù)據(jù)丟失系統(tǒng)數(shù)據(jù)不正確的情況。經(jīng)過(guò)查資料,高并發(fā)的解決方法有倆種,一種是使用緩存、另一種是使用生成靜態(tài)頁(yè)面;還有就是從最基礎(chǔ)的地方優(yōu)化我們寫(xiě)代碼減少不必要的資源浪費(fèi):(1.不要頻繁的new對(duì)象,對(duì)于在整個(gè)應(yīng)用中只需要存在一個(gè)實(shí)例的類(lèi)使用單例模式.對(duì)于String的連接操作,使用StringBuffer或者StringBuilder.對(duì)于utility類(lèi)型的類(lèi)通過(guò)靜態(tài)方法來(lái)訪問(wèn)。2.避免

6、使用錯(cuò)誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗性能,除非必要不要使用instanceof做條件判斷,盡量使用比的條件判斷方式.使用JAVA中效率高的類(lèi),比如ArrayList比Vector性能好。高并發(fā)-需要解決的問(wèn)題一:應(yīng)用緩存二:HTTP緩存三:多級(jí)緩存四:池化五:異步并發(fā)六:擴(kuò)容七:隊(duì)列高并發(fā)-應(yīng)用緩存堆緩存使用Java堆存來(lái)存儲(chǔ)緩存對(duì)象。使用堆緩存的好處是沒(méi)有序列化/反序列化,是最快的緩存。缺點(diǎn)也很明顯,當(dāng)緩存的數(shù)據(jù)量很大時(shí),GC(垃圾回收)暫停時(shí)間會(huì)變長(zhǎng),存儲(chǔ)容量受限于堆空間大小。一般通過(guò)軟引用/弱引用來(lái)存儲(chǔ)緩存對(duì)象,即當(dāng)堆

7、存不足時(shí),可以強(qiáng)制回收這部分存釋放堆存空間。一般使用堆緩存存儲(chǔ)較熱的數(shù)據(jù)。有GuavaCache:緩存和ConcurrentMap是非常相像的,但是它們也不完全一樣。最根本的區(qū)別就是,ConcurrentMap會(huì)持有所有添加的對(duì)象,直到被顯示的移除。而緩存為了限制其存的使用,通常都會(huì)配置成可以自動(dòng)的將對(duì)象移除。在某些情況下即使不自動(dòng)移除對(duì)象也是非常有用的,如LoadingCache它會(huì)自動(dòng)加載緩存對(duì)象。Ehcache3.x:是一種廣泛使用的開(kāi)源Java分布式緩存。主要面向通用緩存,JavaEE和輕量級(jí)容器。它具有存和磁盤(pán)存儲(chǔ),緩存加載器,緩存擴(kuò)展,緩存異常處理程序,一個(gè)gzip緩存servle

8、t過(guò)濾器,支持REST和SOAPapi等特點(diǎn)。MapDB:mapdb是一個(gè)嵌的純java的數(shù)據(jù)庫(kù),提供了并發(fā)的HashMap、TreeMap、Queue,可以基于堆外或者磁盤(pán)來(lái)存儲(chǔ)數(shù)據(jù)高并發(fā)-應(yīng)用緩存堆外緩存即緩存數(shù)據(jù)存儲(chǔ)在堆外存,可以減少GC暫停時(shí)間(堆對(duì)象轉(zhuǎn)移到堆外,GC掃描和移動(dòng)的對(duì)象變少),但是,讀取數(shù)據(jù)時(shí)需要序列化/反序列化,因此會(huì)比堆緩存要慢很多。有Ehcache3.x、MapDB實(shí)現(xiàn)磁盤(pán)緩存即緩存數(shù)據(jù)存儲(chǔ)在磁道上,在JVM重啟時(shí)數(shù)據(jù)還存在的,而堆緩存/堆外緩存數(shù)據(jù)會(huì)丟失,需要重新加載。有Ehcache3.x、MapDB實(shí)現(xiàn)分布式緩存進(jìn)程緩存和磁盤(pán)緩存,在多JVM實(shí)例的情況下,會(huì)存

9、在兩個(gè)問(wèn)題:1、單機(jī)容量問(wèn)題;2、數(shù)據(jù)一致性問(wèn)題(多臺(tái)JVM實(shí)例的緩存數(shù)據(jù)不一致怎么辦?)這個(gè)問(wèn)題不用糾結(jié),既然數(shù)據(jù)允許緩存,則表示允許一定時(shí)間的不一致,因此可以設(shè)置緩存數(shù)據(jù)的過(guò)期時(shí)間來(lái)定期更新數(shù)據(jù);3、緩存不命中時(shí),需要回源到DB/服務(wù)請(qǐng)求多變問(wèn)題:每個(gè)實(shí)例在緩存不命中的情況下都會(huì)回源到DB加載數(shù)據(jù),因此多實(shí)例后DB整體的訪問(wèn)量變多了解決辦法是可以使用如一致性哈希分片算法。因此,這些情況可以考慮使用分布式緩存來(lái)解決??梢允褂胑hcache-clustered(配合Terracottaserver)實(shí)現(xiàn)JAVA進(jìn)程間分布式緩存。最好的辦法是使用redis實(shí)現(xiàn)分布式緩存。高并發(fā)-HTTP緩存瀏覽

10、器緩存是指當(dāng)我們使用瀏覽器訪問(wèn)一些頁(yè)面或者h(yuǎn)ttp服務(wù)時(shí),根據(jù)服務(wù)端返回的緩存設(shè)置響應(yīng)頭將響應(yīng)容緩存到瀏覽器,下次可以直接使用緩存容或者僅需要去服務(wù)端驗(yàn)證容是否過(guò)期即可。這樣的好處可以減少瀏覽器和服務(wù)端之間來(lái)回傳輸?shù)臄?shù)據(jù)量,節(jié)省帶寬提升性能。解決辦法:容不需要?jiǎng)討B(tài)(計(jì)算、渲染等)速度更快,容越接近于用戶速度越快。像apachetrafficserver、squid、varnish、nginx等技術(shù)都可以來(lái)進(jìn)行容緩存。還有CDN就是用來(lái)加速用戶訪問(wèn)的:即用戶首先訪問(wèn)到全國(guó)各地的CDN節(jié)點(diǎn)(使用如ATS、Squid實(shí)現(xiàn)),如果CDN沒(méi)命中,會(huì)回源到中央nginx集群,該集群如果沒(méi)有命中緩存(該集群

11、的緩存不是必須的,要根據(jù)實(shí)際命中情況等決定),最后回源到后端應(yīng)用集群。高并發(fā)-多級(jí)緩存(分布式緩存)高并發(fā)-池化在應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)用到池化技術(shù),如對(duì)象池、連接池、線程池等,通過(guò)池化來(lái)減少一些消耗,以提升性能。對(duì)象池通過(guò)復(fù)用對(duì)象從而減少創(chuàng)建對(duì)象、垃圾回收的開(kāi)銷(xiāo)。但是,池化不能太大,太大會(huì)影響GC時(shí)的掃描時(shí)間。連接池如數(shù)據(jù)庫(kù)連接池、Redis連接池、Http連接池,通過(guò)復(fù)用TCP連接減少創(chuàng)建和釋放連接的時(shí)間來(lái)提升性能。線程池也是類(lèi)似的,通過(guò)復(fù)用線程提升性能。也就是說(shuō)池化的目的就是通過(guò)復(fù)用技術(shù)提升性能。高并發(fā)-擴(kuò)容1、讀寫(xiě)分離:當(dāng)數(shù)據(jù)庫(kù)訪問(wèn)量還不是很大的時(shí)候,我們可以適當(dāng)增加服務(wù)器,數(shù)

12、據(jù)庫(kù)主從復(fù)制的方式將讀寫(xiě)分離2、垂直分區(qū):當(dāng)寫(xiě)入操作一旦增加的時(shí)候,那么主從數(shù)據(jù)庫(kù)將花更多的時(shí)間的放在數(shù)據(jù)同步上,這個(gè)時(shí)候服務(wù)器也是不堪重負(fù)的;那么就有了數(shù)據(jù)的垂直分區(qū),數(shù)據(jù)的垂直分區(qū)思路是將寫(xiě)入操作比較頻繁的數(shù)據(jù)表,如用戶表_user,或者訂單表orders,那么我們就可以把這個(gè)兩個(gè)表分離出來(lái),放在不同的服務(wù)器,如果這兩個(gè)表和其他表存在聯(lián)表查詢(xún),那么就只能把原來(lái)的sql語(yǔ)句給拆分了,先查詢(xún)一個(gè)表,在查詢(xún)另一個(gè),雖然說(shuō)這個(gè)會(huì)消耗更過(guò)性能,但比起那種大量數(shù)據(jù)同步,負(fù)擔(dān)還是減輕了不少;3、水平分區(qū):但是往往事情不盡人意,可能采取垂直分區(qū)能撐一段時(shí)間,由于太火了,訪問(wèn)量又每日100w,下子蹦到了lOOOw,這個(gè)時(shí)候可以采取數(shù)據(jù)的進(jìn)行分離,我們可以根據(jù)user的Id不同進(jìn)行分配,如采取%2、%10形式,當(dāng)然這

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論