一文看懂Java微服務(wù)架構(gòu),WEB2.0,垂直架構(gòu),分布式架構(gòu),微服務(wù)架構(gòu)
Java微服務(wù)架構(gòu)
目錄:
- 了解開發(fā)環(huán)境&生成環(huán)境
- WEB1.0 & WEB2.0
- 垂直架構(gòu)
- 分布式架構(gòu)
- 微服務(wù)架構(gòu)
1.了解開發(fā)環(huán)境&生產(chǎn)環(huán)境
1.1 開發(fā)環(huán)境
平時(shí)在寫代碼的時(shí)候,大多都在WIN10/WIN7/Mac.
這些系統(tǒng)都可以稱為開發(fā)環(huán)境。咱們?yōu)榱烁咝У拈_發(fā)應(yīng)用程序,安裝很多的軟件,會(huì)
導(dǎo)致操作系統(tǒng)不安全,穩(wěn)定性降低。
2.1. 生產(chǎn)環(huán)境(學(xué)會(huì)如何操作,Linux操作系統(tǒng))
在生產(chǎn)環(huán)境中,操作不會(huì)采用Win10/Mac。這種操作系統(tǒng)相對(duì)不安全,生產(chǎn)環(huán)境是要面向全體用戶的,一般會(huì)采用專業(yè)的操作系統(tǒng)。
大多數(shù)市面上使用的都是基于Linux的操作系統(tǒng),還有Windows版本的服務(wù)器操作系統(tǒng)
Windows 2003 service
02. WEB1.0 & WEB2.0
2.1. WEB1.0時(shí)期
在WEB1.0時(shí)期,由于帶寬不足,這時(shí)的項(xiàng)目大多是內(nèi)容少,用戶量也不多,甚至有一些項(xiàng)目不需要對(duì)外開放,對(duì)安全性和穩(wěn)定性的要求是不高的,
單體架構(gòu)就足以應(yīng)對(duì)
2.2. WEB2.0時(shí)期
隨之到來的WEB2.0 實(shí)現(xiàn)了ADSL撥號(hào)上網(wǎng),寬帶提速,最高可以達(dá)到8M 用戶量也就不斷增加,一些門戶網(wǎng)站也開始活躍,項(xiàng)目就需要考慮安全性,和穩(wěn)定性。
在基于單體架構(gòu)的設(shè)計(jì)中,無(wú)法滿足WEB2.0對(duì)項(xiàng)目的需求,需要在單體架構(gòu)上搭建集群(多個(gè)服務(wù)器),
在搭建集群之后,可以提升項(xiàng)目的穩(wěn)定性,并且并發(fā)量增加,也可以承受住
2.3. 搭建集群后出現(xiàn)的問題
- 用戶的請(qǐng)求到底要發(fā)送到那臺(tái)服務(wù)器上,如何才能保證請(qǐng)求平均的分發(fā)給不同的服務(wù)器,從而緩解用戶量增加的壓力
- 編寫項(xiàng)目時(shí),如果用戶登錄成功,將用戶的標(biāo)識(shí)存放到的Session中,在搭建集群之后,數(shù)據(jù)共享問題
- 當(dāng)數(shù)據(jù)量特別龐大時(shí),如果還直接去數(shù)據(jù)庫(kù)查詢,速度很慢,如何提升查詢效率
- 針對(duì)大家在搜索一些數(shù)據(jù)時(shí),where content like '%#{xxx}% ’
2.4. 針對(duì)上述問題,如何解決(中間件)
1.Nginx,用來解決用戶請(qǐng)求平均分發(fā)
2.Redis, 用來解決數(shù)據(jù)共享并實(shí)現(xiàn)緩存功能
3.ElacticSearch,用來解決搜索數(shù)據(jù)的功能
03. 垂直架構(gòu)
比如項(xiàng)目包含了三個(gè)模塊,用戶模塊,商品模塊,訂單模塊,商品模塊。
一般商品瀏覽的商品模塊流量最大,為了防止商品模塊壓力過大,一般直接有效的方法就是搭建集群。
在單體架構(gòu)的集群上去搭建,效果相對(duì)比較差。隨著項(xiàng)目的不斷更新,項(xiàng)目中的功能月越來越多,最嚴(yán)重的可能會(huì)導(dǎo)致項(xiàng)目無(wú)法啟動(dòng)
關(guān)于單體架構(gòu)中,完美的體驗(yàn)了低內(nèi)聚,高耦合。(開發(fā)的要求是高內(nèi)聚,低耦合)
為了解決上述的各種問題,更新了垂直架構(gòu)
04. 分布式架構(gòu)
4.1 項(xiàng)目迭代
隨著項(xiàng)目的不斷迭代,新老功能之間需要相互交互,服務(wù)器與服務(wù)器之間需要通信的。
項(xiàng)目一般分為三層的 Controller Service Dao。導(dǎo)致程序變慢的重災(zāi)區(qū),一般是Service和Dao,在搭建集群時(shí),確實(shí)針對(duì)三層都搭建集群,效果不是很好。
架構(gòu)從垂直架構(gòu),演變到了分布式架構(gòu)
分布式架構(gòu)落地的技術(shù):
為了解決各個(gè)服務(wù)之間的通信,國(guó)內(nèi)通訊的方式有兩種:
1.Dubbo 采用的RPC方式
2.SpringCloud 采用的HHTP方式
05. 分布式架構(gòu)常見問題
5.1服務(wù)之間的異步通訊
在使用分布式架構(gòu)之后,服務(wù)之間的通信都是同步的。
在一些不是核心業(yè)務(wù)的功能上,咱們希望實(shí)現(xiàn)異步通訊。
為了實(shí)現(xiàn)服務(wù)之間的異步通訊,需要學(xué)習(xí)MQ. MQ-RabbitMQ(消息隊(duì)列)
5.2 服務(wù)之間通信地址的維護(hù)
由于服務(wù)越來越多,每個(gè)服務(wù)的訪問地址都是不一樣的。協(xié)議://地址:端口號(hào)
由于我們的模塊繁多,并且模塊搭建的集群數(shù)量增加,會(huì)導(dǎo)致其他模塊需要維護(hù)各種ip地址等信息,導(dǎo)致項(xiàng)目的維護(hù)性極低,耦合性變高,并且也無(wú)法實(shí)現(xiàn)負(fù)載均衡的功能
需要使用一個(gè)技術(shù)來解決當(dāng)前問題:
Eureka注冊(cè)中心幫助我們管理服務(wù)信息 :實(shí)現(xiàn)通訊地址維護(hù)
Robbin可以幫助我們實(shí)現(xiàn)服務(wù)之間的負(fù)載均衡 :實(shí)現(xiàn)服務(wù)之間的負(fù)載均衡
5.3 服務(wù)降級(jí)
在上述的架構(gòu)中,如果說訂單模塊出現(xiàn)了問題。
只要是涉及到訂單模塊的功能,全部都無(wú)法使用。
可能會(huì)導(dǎo)致服務(wù)器提供的線程池耗盡,給用戶友好的提示都是無(wú)法做到的
為了解決上述的問題,使用Hystrix處理,
Hystrix提供了線程池隔離的方式,避免服務(wù)器線程池耗盡,在一個(gè)服務(wù)無(wú)法使用時(shí),可以提供斷路器的方式解決
使用Hystrix 幫我們實(shí)現(xiàn)斷路器和隔離,并最終服務(wù)降級(jí)
Eureka,Robbin,Hystrix 都是SpringClod中的組件
5.4 海量數(shù)據(jù)
海量數(shù)據(jù)最終會(huì)導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法存儲(chǔ)全部的內(nèi)容。即便數(shù)據(jù)庫(kù)可以存儲(chǔ)海量的數(shù)據(jù),在查詢數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)的響應(yīng)是極其緩慢的
在用戶高并發(fā)的情況下,數(shù)據(jù)庫(kù)也是無(wú)法承受住的
為了解決上述的問題,可以基于MyCat實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分庫(kù)分表。
06. 微服務(wù)架構(gòu)
雖然已經(jīng)將每個(gè)模塊獨(dú)立的做開發(fā),比如商品模塊,壓力最大的是商品的查詢。
在單獨(dú)模塊中再次拆分項(xiàng)目的方式就可以稱為微服務(wù)架構(gòu)。微服務(wù)架構(gòu)其實(shí)屬于分布式架構(gòu)的
6.2 容器化技術(shù)
為了解決模塊過多,運(yùn)維成本增加的問題。采用Docker容器化技術(shù)來幫助我們管理
后期在學(xué)習(xí)的時(shí)候,也需要大量的軟件,可以使用Docker來幫助我們按照軟件。
6.3 分布式架構(gòu)下的其他問題
分布式架構(gòu)幫助我們解決了很多問題,但是隨之也帶來了跟多問題:
1. 分布式事務(wù):
最傳統(tǒng)的操作事務(wù)的方式,是通過Connection連接對(duì)象的方式操作,
Spring也提供了聲明式事務(wù)的操作,為了解決事務(wù)的問題,后續(xù)會(huì)使用到RabbitMQ 或者使用到 LCN 方式解決
2.分布式鎖:
傳統(tǒng)的鎖方式,一種是synchronize 或者 Lock鎖,在分布式環(huán)境下,傳統(tǒng)的鎖是沒有效果的。為了解決鎖的問題,后續(xù)會(huì)使用Redis 或者 Zookeeper來解決
3.分布式任務(wù):
在傳統(tǒng)的定時(shí)任務(wù)下,由于分布式環(huán)境的問題,可能會(huì)造成任務(wù)重復(fù)執(zhí)行,一個(gè)比較大的任務(wù)希望可以拆分。為了解決這個(gè)問題,后續(xù)會(huì)使用Redis + Quartz 或者 Elastic-Job。