分布式服务动态上下线感知
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?分布式服務(wù)動態(tài)上下線感知
?
?
? ? ? 首先,我們要從解決問題的角度得知分布式服務(wù)的由來,從單機(jī)服務(wù)到分布式服務(wù)經(jīng)歷了哪些過程
? ? ? 起初,服務(wù)是比較單一的,在一個工程包之中會包含所有的模塊,但隨著互聯(lián)網(wǎng)的快速發(fā)展,客戶流量的增多,點擊量數(shù)據(jù)量的增多,導(dǎo)致對架構(gòu)方面的沖擊較大,想要在用戶量和數(shù)據(jù)量較大的情況下做到即時相應(yīng)的話,就需要去提升后端架構(gòu)的性能。早期我們會去提升服務(wù)器硬件設(shè)備,但是還是無法達(dá)到預(yù)期的效果,只能通過水平擴(kuò)展,將應(yīng)用進(jìn)行拆分,每一個應(yīng)用都可以獨立存儲、獨立計算。每一個服務(wù)都會比較小、比較細(xì)、更好的去實現(xiàn)功能,微服務(wù)也就應(yīng)運而生。如下圖所示:
?
? ? ? ? ? ? ? ? ?
?
當(dāng)服務(wù)較多時,服務(wù)與服務(wù)直接的調(diào)用會變得凌亂,過于復(fù)雜化,為了解決該問題,出現(xiàn)了SOA這一概念
?
關(guān)于soa,這里引用其他博客中的一個例子,講的很好,原文鏈接:
https://www.cnblogs.com/renzhitian/p/6853289.html
深入淺出SOA
?SOA是什么?SOA全英文是Service-Oriented Architecture,中文意思是中文面向服務(wù)編程,是一種思想,一種方法論,一種分布式的服務(wù)架構(gòu)(具體可以百度)。
? ? ?用途:SOA解決多服務(wù)凌亂問題,SOA架構(gòu)解決數(shù)據(jù)服務(wù)的復(fù)雜程度,同時SOA又有一個名字,叫做服務(wù)治理。
? ? ?通過一個系統(tǒng)我們看一下架構(gòu)的演變過程(由統(tǒng)一到分布式):
? ?
? ? ? ? 當(dāng)我們的項目比較小時,我們只有一個系統(tǒng),并且把他們寫到一起,放在一個服務(wù)器上,但是隨著平臺越來越大,數(shù)據(jù)量越來越大,我們不得不通過分庫,把多個模塊的數(shù)據(jù)庫分別放在對應(yīng)得服務(wù)器上,每個模塊調(diào)用自己的子系統(tǒng)即可。
? ? ?
? ? ?隨著我們系統(tǒng)的進(jìn)一步復(fù)雜度的提升,我們不得不進(jìn)一步對系統(tǒng)的性能進(jìn)行提升,我們將多個模塊分成多個子系統(tǒng),多個子系統(tǒng)直接互相調(diào)用(因為SOA一般用于大型項目,比較復(fù)雜,所以一般總系統(tǒng)不會再集成,會拆分多個,分別做成服務(wù),相互調(diào)用)。當(dāng)我們的電商UI進(jìn)行一個下訂單的任務(wù)時,多個服務(wù)直接互相調(diào)用,系統(tǒng)通過數(shù)據(jù)總線,分別調(diào)用對于的子系統(tǒng)即可。
? ? ?企業(yè)數(shù)據(jù)總線:企業(yè)數(shù)據(jù)總線不是對多個子模塊的集成,他在這里充當(dāng)數(shù)據(jù)通道的作用,數(shù)據(jù)總線不關(guān)心業(yè)務(wù),數(shù)據(jù)總線根據(jù)給的地址和協(xié)議去調(diào)服務(wù),上端不關(guān)心服務(wù)在哪里是什么,只找數(shù)據(jù)總線。
? ? ?上面幾個圖應(yīng)該算是比較清楚了,隨著業(yè)務(wù)的深入,我們不得不對系統(tǒng)進(jìn)行調(diào)整,分別是對數(shù)據(jù)和業(yè)務(wù)的拆分,最后每個子系統(tǒng)對面提供服務(wù)。
? ? ?還要提的一點就是下面那個圖,下面的IP庫以及幾個子系統(tǒng)是公共服務(wù),分別向上提供功能,也是SOA方法論的一部分。
二、SOA主要的使用場景,如下圖:
? ?
通過上面的圖我們可以看出,多個子系統(tǒng)直接相互交互,相互調(diào)用非常凌亂,這樣我們就很不爽,所以我們就用到了我們的SOA架構(gòu),SOA又叫服務(wù)治理,SOA就是幫助我們把服務(wù)之間調(diào)用的亂七八糟的關(guān)系給治理起來,然后提供一個統(tǒng)一的標(biāo)準(zhǔn),把我們的服務(wù)治理成下圖所示,以前我們的服務(wù)是互相交互,現(xiàn)在是只對數(shù)據(jù)總線進(jìn)行交互,這樣系統(tǒng)就變得統(tǒng)一起來。
統(tǒng)一標(biāo)準(zhǔn):各系統(tǒng)的協(xié)議、地址、交互方式。
新的交互方式:各個系統(tǒng)分別根據(jù)統(tǒng)一標(biāo)準(zhǔn)向數(shù)據(jù)總線進(jìn)行注冊,各子系統(tǒng)調(diào)用其他子系統(tǒng)時,我們并不關(guān)心如果找到其他子系統(tǒng),我們只招數(shù)據(jù)總線,數(shù)據(jù)總線再根據(jù)統(tǒng)一標(biāo)準(zhǔn)找其他子系統(tǒng),所以數(shù)據(jù)總線在這里充當(dāng)一個只路人的作用。
SOA的好處:
? 1、降低用戶成本,用戶不需要關(guān)心各服務(wù)之間是什么語言的、不需要知道如果調(diào)用他們,只要通過統(tǒng)一標(biāo)準(zhǔn)找數(shù)據(jù)總線就可以了。
?2、程序之間關(guān)系服務(wù)簡單
?3、識別哪些程序有問題(掛掉)
缺點:提示了系統(tǒng)的復(fù)雜程度,性能有相應(yīng)影響。
三、數(shù)據(jù)總線是什么?
? ? ? 其實我在上面寫了,數(shù)據(jù)總線是起到調(diào)度服務(wù)的作用,數(shù)據(jù)總線不是集成服務(wù),數(shù)據(jù)總線更新一個調(diào)度框架,每個服務(wù)需要根據(jù)約定向數(shù)據(jù)總線注冊服務(wù),那么如何注冊那?其實數(shù)據(jù)總線就像一個字典結(jié)構(gòu),
? ? ? 數(shù)據(jù)總線里面一個key對于一個value,key指的是服務(wù)名,value則是服務(wù)的調(diào)度方式,還有一點需要說明的是,數(shù)據(jù)總線只是指路人,服務(wù)是不經(jīng)過數(shù)據(jù)總線的,如上圖的黃色線的路徑。
? ? ?數(shù)據(jù)總線通過域名解析實現(xiàn):一個域名綁定多臺服務(wù)器,ajax也可以,dns也可以,解析域名嘛。
? ? ?其實數(shù)據(jù)總線還有一些高級應(yīng)用,比如心跳檢測,實現(xiàn)負(fù)載均衡等等,就不細(xì)說了,目前應(yīng)用數(shù)據(jù)總線的有阿里的dubbo,還有zookeeper。
?
? ? ?了解完soa之后,還是回到服務(wù)之間的調(diào)用問題,每一個服務(wù)跨進(jìn)程調(diào)用其他服務(wù)會用到一種技術(shù)----------------------
RPC
? RPC,全稱為Remote Procedure Call,即遠(yuǎn)程過程調(diào)用,它是一個計算機(jī)通信協(xié)議。它允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)。它可以有不同的實現(xiàn)方式。如RMI(遠(yuǎn)程方法調(diào)用)、Hessian、Http invoker等。另外,RPC是與語言無關(guān)的。
如上圖所示,假設(shè)Computer1在調(diào)用sayHi()方法,對于Computer1而言調(diào)用sayHi()方法就像調(diào)用本地方法一樣,調(diào)用 –>返回。但從后續(xù)調(diào)用可以看出Computer1調(diào)用的是Computer2中的sayHi()方法,RPC屏蔽了底層的實現(xiàn)細(xì)節(jié),讓調(diào)用者無需關(guān)注網(wǎng)絡(luò)通信,數(shù)據(jù)傳輸?shù)燃?xì)節(jié)。rpc的實現(xiàn)方式和原理先不談,總之服務(wù)之間是通過rpc(遠(yuǎn)程過程調(diào)用)來相互調(diào)用的。
? ? ? ?現(xiàn)在多個服務(wù)之間進(jìn)行調(diào)用,每一個服務(wù)去調(diào)用或者獲取另一個服務(wù)的時候會有很多的地址信息,如果某一服務(wù)做了集群,會有更多的地址信息。還有,如果,一個服務(wù)發(fā)送了地址信息,如ip:port請求,但是另一服務(wù)down機(jī)了怎么辦,該怎么感知服務(wù)節(jié)點狀態(tài)的變化呢?總結(jié)一下問題所在是:
1.消費端如何對多個地址進(jìn)行負(fù)載
服務(wù)之間互相發(fā)送請求時的地址可以注冊在統(tǒng)一的一個地方,每個服務(wù)只需要知道這個服務(wù)中心的地址ip就可以拿到所有其他服務(wù)的地址簿。這個地址維護(hù)服務(wù)中心很常見,如zookeeper,eureka,etcd、redis等。如下圖所示
?
2.如何動態(tài)感知服務(wù)節(jié)點的變化
?在這里,主要介紹一下ZooKeeper的實現(xiàn)原理
1.簡介
ZooKeeper?是一個開源的分布式協(xié)調(diào)服務(wù),由雅虎創(chuàng)建,是 Google Chubby 的開源實現(xiàn)。分布式應(yīng)用程序可以基于 ZooKeeper 實現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能。它是集群的管理者,監(jiān)視著集群中各個節(jié)點的狀態(tài)根據(jù)節(jié)點提交的反饋進(jìn)行下一步合理操作。最終,將簡單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。
?
2.Zookeeper文件系統(tǒng)
每個子目錄項如 NameService 都被稱作為znode,和文件系統(tǒng)一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在于znode是可以存儲數(shù)據(jù)的。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
有四種類型的znode:?
<1>、PERSISTENT-持久化目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點依舊存在?
<2>、PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點依舊存在,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號?
<3>、EPHEMERAL-臨時目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點被刪除?
<4>、EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點?
客戶端與zookeeper斷開連接后,該節(jié)點被刪除,只是Zookeeper給該節(jié)點名稱進(jìn)行順序編號?
?
3.Zookeeper通知機(jī)制
客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點增加刪除)時,zookeeper會通知客戶端。
?
4.Zookeeper的作用
(1).命名服務(wù)
在zookeeper的文件系統(tǒng)里創(chuàng)建一個目錄,即有唯一的path。
其中較為常見的就是一些分布式服務(wù)框架(如RPC、RMI)中的服務(wù)地址列表。通過在ZooKeepr里創(chuàng)建順序節(jié)點,能夠很容易創(chuàng)建一個全局唯一的路徑,這個路徑就可以作為一個名字。
?
ZooKeeper 的命名服務(wù)即生成全局唯一的ID。
?
(2).配置管理
程序總是需要配置的,如果程序或者服務(wù)分散部署在多臺機(jī)器上時,要逐個改變配置就變得困難。現(xiàn)在把這些配置全部放在zookeeper上去,保存在zookeeper的某個目錄中去,然后所有的目錄文件都對這個目錄文件進(jìn)行監(jiān)聽(watch,和監(jiān)視一樣,哈哈),一旦配置信息發(fā)生變化,每個應(yīng)用程序都會收到zookeeper的通知,然后從zookeeper獲取新的配置信息到系統(tǒng)中去就好,如下圖所示。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
(3).Zookeeper集群管理
所謂集群管理無在乎兩點:是否有機(jī)器退出和加入、選舉master
就像幫派一樣,管理幫派無非也是兩點,第一點就是幫派人員的退出和加入,還有就是幫派老大的選舉
對于第一點,所有機(jī)器約定在父目錄GroupMembers下創(chuàng)建臨時目錄節(jié)點,然后監(jiān)聽父目錄節(jié)點的子節(jié)點變化消息。一旦有機(jī)器掛掉,該機(jī)器與 zookeeper的連接斷開,其所創(chuàng)建的臨時目錄節(jié)點被刪除,所有其他機(jī)器都收到通知:某個兄弟目錄被刪除,于是,所有人都知道:它上船了。
新機(jī)器加入也是類似,所有機(jī)器收到通知:新兄弟目錄加入,highcount又有了,對于第二點,我們稍微改變一下,所有機(jī)器創(chuàng)建臨時順序編號目錄節(jié)點,每次選取編號最小的機(jī)器作為master就好。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
(4).Zookeeper分布式鎖
有了zookeeper的一致性文件系統(tǒng),鎖的問題變得容易。鎖服務(wù)可以分為兩類,一個是保持獨占,另一個是控制時序。
對于第一類,我們將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實現(xiàn)。所有客戶端都去創(chuàng)建 /distribute_lock 節(jié)點,最終成功創(chuàng)建的那個客戶端也即擁有了這把鎖。用完刪除掉自己創(chuàng)建的distribute_lock 節(jié)點就釋放出鎖。?
對于第二類, /distribute_lock 已經(jīng)預(yù)先存在,所有客戶端在它下面創(chuàng)建臨時順序編號目錄節(jié)點,和選master一樣,編號最小的獲得鎖,用完刪除,依次方便。
?
? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
(5).Zookeeper隊列管理
兩種類型的隊列:
1、同步隊列,當(dāng)一個隊列的成員都聚齊時,這個隊列才可用,否則一直等待所有成員到達(dá)。?
2、隊列按照 FIFO 方式進(jìn)行入隊和出隊操作。?
第一類,在約定目錄下創(chuàng)建臨時目錄節(jié)點,監(jiān)聽節(jié)點數(shù)目是否是我們要求的數(shù)目。?
第二類,和分布式鎖服務(wù)中的控制時序場景基本原理一致,入列有編號,出列按編號。
(6).分布式與數(shù)據(jù)復(fù)制?
Zookeeper作為一個集群提供一致的數(shù)據(jù)服務(wù),自然,它要在所有機(jī)器間做數(shù)據(jù)復(fù)制。數(shù)據(jù)復(fù)制的好處:?
1、容錯:一個節(jié)點出錯,不致于讓整個系統(tǒng)停止工作,別的節(jié)點可以接管它的工作;?
2、提高系統(tǒng)的擴(kuò)展能力 :把負(fù)載分布到多個節(jié)點上,或者增加節(jié)點來提高系統(tǒng)的負(fù)載能力;?
3、提高性能:讓客戶端本地訪問就近的節(jié)點,提高用戶訪問速度。?
從客戶端讀寫訪問的透明度來看,數(shù)據(jù)復(fù)制集群系統(tǒng)分下面兩種:?
1、寫主(WriteMaster) :對數(shù)據(jù)的修改提交給指定的節(jié)點。讀無此限制,可以讀取任何一個節(jié)點。這種情況下客戶端需要對讀與寫進(jìn)行區(qū)別,俗稱讀寫分離;?
2、寫任意(Write Any):對數(shù)據(jù)的修改可提交給任意的節(jié)點,跟讀一樣。這種情況下,客戶端對集群節(jié)點的角色與變化透明。
對zookeeper來說,它采用的方式是寫任意。通過增加機(jī)器,它的讀吞吐能力和響應(yīng)能力擴(kuò)展性非常好,而寫,隨著機(jī)器的增多吞吐能力肯定下降(這也是它建立observer的原因),而響應(yīng)能力則取決于具體實現(xiàn)方式,是延遲復(fù)制保持最終一致性,還是立即復(fù)制快速響應(yīng)。
(7).Zookeeper角色描述
? ? ? ? ? ? ? ? ? ? ??
(8).Zookeeper與客戶端
? ? ? ? ? ? ? ? ? ? ? ? ? ???
(9).Zookeeper設(shè)計目的
1.最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖,這是zookeeper最重要的性能。?
2.可靠性:具有簡單、健壯、良好的性能,如果消息被到一臺服務(wù)器接受,那么它將被所有的服務(wù)器接受。?
3.實時性:Zookeeper保證客戶端將在一個時間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。?
4.等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請求,使得每個client都能有效的等待。?
5.原子性:更新只能成功或者失敗,沒有中間狀態(tài)。?
6.順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個消息b在消息a后被同一個發(fā)送者發(fā)布,a必將排在b前面。?
(10).Zookeeper工作原理
Zookeeper 的核心是原子廣播,這個機(jī)制保證了各個Server之間的同步。實現(xiàn)這個機(jī)制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當(dāng)服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后,Zab就進(jìn)入了恢復(fù)模式,當(dāng)領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和 leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。?
為了保證事務(wù)的順序一致性,zookeeper采用了遞增的事務(wù)id號(zxid)來標(biāo)識事務(wù)。所有的提議(proposal)都在被提出的時候加上了zxid。實現(xiàn)中zxid是一個64位的數(shù)字,它高32位是epoch用來標(biāo)識leader關(guān)系是否改變,每次一個leader被選出來,它都會有一個新的epoch,標(biāo)識當(dāng)前屬于那個leader的統(tǒng)治時期。低32位用于遞增計數(shù)。
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/GodHeng/p/8797100.html
總結(jié)
以上是生活随笔為你收集整理的分布式服务动态上下线感知的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flask 操作mysql的两种方式-s
- 下一篇: html4