一、緣起
隨著互聯(lián)網(wǎng)業(yè)務(wù)的越來(lái)越復(fù)雜,用戶量與流量越來(lái)越大,
“服務(wù)化分層”是架構(gòu)演進(jìn)的必由之路。
如上圖:站點(diǎn)應(yīng)用會(huì)調(diào)用服務(wù),上游服務(wù)調(diào)用底層服務(wù),
依賴關(guān)系會(huì)變得非常復(fù)雜。
對(duì)于同一個(gè)服務(wù),它有多個(gè)上游調(diào)用。為了保證高可用,
一個(gè)底層服務(wù)往往是若干個(gè)節(jié)點(diǎn)形成一個(gè)集群提供服務(wù)。
如上圖:用戶中心服務(wù)user-service有三個(gè)節(jié)點(diǎn),ip1/ip2/ip3對(duì)上游提供服務(wù),任何一個(gè)節(jié)點(diǎn)當(dāng)機(jī),都不影響服務(wù)的可用性。
那么
問(wèn)題來(lái)了,當(dāng)
服務(wù)集群增減節(jié)點(diǎn)的時(shí)候,是否存在“反向依賴”,是否“耦合”,是否
上游調(diào)用方需要修改配置重啟,是否能做到上游無(wú)感知,即“配置的架構(gòu)變遷”,是今天需要討論的問(wèn)題。
二、配置私藏
“配置私藏”是配置文件架構(gòu)的最初級(jí)階段,上游調(diào)用下游,
每個(gè)上游都有一個(gè)專屬的私有配置文件,記錄被調(diào)用下游的每個(gè)節(jié)點(diǎn)配置信息。
如上圖:
1)用戶中心user-service有ip1/ip2/ip3三個(gè)節(jié)點(diǎn)
2)service1調(diào)用了用戶中心,它有一個(gè)專屬配置文件s1.conf,里面配置了us的集群是ip1/ip2/ip3
3)service2也調(diào)用了用戶中心,同理有個(gè)配置文件s2.conf,記錄了us集群是ip1/ip2/ip3
4)web2也調(diào)用了用戶中心,同理w2.conf,配置了us集群是ip1/ip2/ip3
是不是很熟悉?
沒(méi)錯(cuò),絕大部分公司,初期都是這么玩的。
配置私藏架構(gòu)的缺點(diǎn)是什么呢?來(lái)看一個(gè)容量變化的需求:
1)運(yùn)維檢測(cè)出ip1節(jié)點(diǎn)的硬盤性能下降,通知研發(fā)未來(lái)要
將ip1節(jié)點(diǎn)下線2)由于5月8日要做大促運(yùn)營(yíng)活動(dòng),未來(lái)流量會(huì)激增,研發(fā)準(zhǔn)備
增加兩個(gè)節(jié)點(diǎn)ip4和ip5此時(shí)要怎么做呢?需要
用戶中心的負(fù)責(zé)人通知所有上游調(diào)用者,
修改“私藏”的配置,并重啟上游,連接到新的集群上去。
在ip1上沒(méi)有流量之后,
通知運(yùn)維將ip1節(jié)點(diǎn)下線,以完成整個(gè)縮容擴(kuò)容過(guò)程。
大伙是這么做的么?當(dāng)業(yè)務(wù)復(fù)雜度較高,研發(fā)人數(shù)較多,服務(wù)依賴關(guān)系較復(fù)雜的時(shí)候,就沒(méi)這么簡(jiǎn)單了。
問(wèn)題一:
調(diào)用方很痛,
容量變化的是你,憑啥修改配置重啟的是我?這是一個(gè)典型的“反向依賴”架構(gòu)設(shè)計(jì),上下游通過(guò)配置耦合,值得優(yōu)化(特別是上層服務(wù),ta依賴的服務(wù)很多的時(shí)候,可能每周都有類似的配合重啟需求)。
問(wèn)題二:
服務(wù)方很痛,
ta不知道有多少個(gè)上游調(diào)用了自己(特別是底層基礎(chǔ)服務(wù),像用戶中心這種,調(diào)用ta的上游很多),往往只能通過(guò)以下方式來(lái)定位上游:
a)
群里吼 b)
發(fā)郵件詢問(wèn) c)
通過(guò)連接找到ip,通過(guò)ip問(wèn)運(yùn)維,找到機(jī)器負(fù)責(zé)人,再通過(guò)機(jī)器負(fù)責(zé)人找到對(duì)應(yīng)調(diào)用服務(wù)(似曾相識(shí)的請(qǐng)轉(zhuǎn)發(fā)=_=)
不管哪種方式,都很有可能遺漏,導(dǎo)致ip1一直有流量難以下線,ip4/ip5的流量難以均勻遷移過(guò)來(lái)。該如何優(yōu)化呢?
三、全局配置
架構(gòu)的升級(jí)并不是一步到位的,先來(lái)用最低的成本來(lái)解決上述“修改配置重啟”的問(wèn)題一。
“全局配置”法:對(duì)于通用的服務(wù),
建立全局配置文件,消除配置私藏:
1)
運(yùn)維層面制定規(guī)范,
新建全局配置文件,例如/opt/globalconf/global.conf,如果配置較多,注意做好配置的垂直拆分
2)
對(duì)于服務(wù)方,如果是通用的服務(wù),
集群信息配置在global.conf里3)
對(duì)于調(diào)用方,調(diào)用方禁止配置私藏,
必須從global.conf里讀取通用下游配置這么做的
好處:
1)如果下游
容量變化,
只需要修改一處配置global.conf,而不需要各個(gè)上游修改
2)
調(diào)用方下一次重啟的時(shí)候,
自動(dòng)遷移到擴(kuò)容后的集群上來(lái)了
3)
修改成本非常小,
讀取配置文件目錄變了不足:
如果調(diào)用方一直不重啟,就沒(méi)有辦法將流量遷移到新集群上去了有沒(méi)有方法實(shí)現(xiàn)自動(dòng)流量遷移呢?答案是肯定的,只需要實(shí)現(xiàn)
兩個(gè)并不復(fù)雜的組件,就能實(shí)現(xiàn)調(diào)用方的流量自動(dòng)遷移:
1)
文件監(jiān)控組件FileMonitor作用是監(jiān)控文件的變化,起一個(gè)timer,定期監(jiān)控文件的ModifyTime或者md5就能輕松實(shí)現(xiàn),當(dāng)文件變化后,實(shí)施回調(diào)。
2)
動(dòng)態(tài)連接池組件DynamicConnectionPool“連接池組件”是RPC-client中的一個(gè)子組件,用來(lái)維護(hù)與多個(gè)RPC-server節(jié)點(diǎn)之間的連接。所謂
“動(dòng)態(tài)連接池”,是指
連接池中的連接可以動(dòng)態(tài)增加和減少(用鎖來(lái)互斥或者線程安全的數(shù)據(jù)結(jié)構(gòu)很容易實(shí)現(xiàn))。
這兩個(gè)組件完成后:
1)一旦全局配置文件變化,文件監(jiān)控組件實(shí)施回調(diào)
2)如果動(dòng)態(tài)連接池組件發(fā)現(xiàn)配置中減少了一些節(jié)點(diǎn),就動(dòng)態(tài)的將對(duì)應(yīng)連接銷毀,如果增加了一些節(jié)點(diǎn),就動(dòng)態(tài)建立連接,
自動(dòng)完成下游節(jié)點(diǎn)的增容與縮容。
四、配置中心
全局配置文件是一個(gè)能夠快速落地的,
解決“修改配置重啟”問(wèn)題的方案,但它仍然
解決不了,服務(wù)提供方
“不知道有多少個(gè)上游調(diào)用了自己”這個(gè)問(wèn)題。
如果不知道多少上游調(diào)用了自己,
“按照調(diào)用方限流”
“繪制全局架構(gòu)依賴圖”等需求便
難以實(shí)現(xiàn),怎么辦,可以
采用“配置中心”來(lái)解決。
對(duì)比“全局配置”與“配置中心”的架構(gòu)圖,會(huì)發(fā)現(xiàn)
配置由靜態(tài)的文件 升級(jí)為 動(dòng)態(tài)的服務(wù):
1)整個(gè)
配置中心子系統(tǒng)由zk、conf-center服務(wù),DB配置存儲(chǔ)與,conf-web配置后臺(tái)組成
2)所有
下游服務(wù)的配置,
通過(guò)后臺(tái)設(shè)置在配置中心里3)所有
上游需要拉取配置,需要
去配置中心注冊(cè),拉取下游服務(wù)配置信息(ip1/ip2/ip3)
當(dāng)下游服務(wù)需要擴(kuò)容縮容時(shí):
4)
conf-web配置后臺(tái)進(jìn)行設(shè)置,新增ip4/ip5,減少ip1
5)conf-center服務(wù)將
變更的配置推送給已經(jīng)注冊(cè)關(guān)注相關(guān)配置的調(diào)用方6)結(jié)合
動(dòng)態(tài)連接池組件,完成
自動(dòng)的擴(kuò)容與縮容配置中心的
好處:
1)
調(diào)用方不需要再重啟2)服務(wù)方從配置中心中很
清楚的知道上游依賴關(guān)系,從而實(shí)施按照調(diào)用方限流
3)很容易從配置中心
得到全局架構(gòu)依賴關(guān)系痛點(diǎn)一、痛點(diǎn)二同時(shí)解決。
不足:系統(tǒng)復(fù)雜度相對(duì)較高,對(duì)配置中心的可靠性要求較高,
一處掛全局掛。
五、總結(jié)
解決什么問(wèn)題?配置導(dǎo)致系統(tǒng)耦合,架構(gòu)反向依賴。什么痛點(diǎn)?
上游痛:擴(kuò)容的是下游,改配置重啟的是上游下游痛:不知道誰(shuí)依賴于自己配置架構(gòu)如何演進(jìn)?一、配置私藏
二、全局配置文件
三、配置中心
大伙的配置架構(gòu)進(jìn)化到第幾個(gè)步驟啦?歡迎留言。
更多建議: