解決什么問題
?闡述微服務以及服務注冊發(fā)現(xiàn)的部分概念
?闡述Eureka服務注冊與發(fā)現(xiàn)的部分原理及細節(jié)
為什么需要服務中心
過去沃斤,每個應用都是一個CPU弓摘,一個主機上的單一系統(tǒng)焚鹊。然而今天,隨著大數(shù)據(jù)和云計算時代的到來韧献,任何獨立的程序都可以運行在多個計算機上末患。并且隨著業(yè)務的發(fā)展,訪問用戶量的增加锤窑,開發(fā)人員或小組的增加璧针,系統(tǒng)會被拆分成多個功能模塊。拆分后每個功能模塊可以作為一個獨立的子系統(tǒng)提供其職責范圍內(nèi)的功能果复。而多個子系統(tǒng)中陈莽,由于職責不同并且會存在相互調(diào)用,同時可能每個子系統(tǒng)還需要多個實例部署在多臺服務器或者鏡像中,導致了子系統(tǒng)間的相互調(diào)用形成了一個錯綜復雜的網(wǎng)狀結(jié)構(gòu)走搁。用幾幅圖說明一下:
單體應用:
隨著業(yè)務的發(fā)展独柑,經(jīng)過了多個系統(tǒng)架構(gòu)的演變,變成了這樣(拿百度的功能舉個栗子):
圖中私植,每個網(wǎng)頁搜索子系統(tǒng)和百度地圖子系統(tǒng)的實例都可以視同為一個微服務忌栅。網(wǎng)頁搜索子系統(tǒng)為百度地圖子系統(tǒng)提供了“用戶查詢內(nèi)容、用戶IP地址”等信息提供的服務接口曲稼,為百度地圖子系統(tǒng)定位用戶地理信息情況提供數(shù)據(jù)依據(jù)索绪。
百度地圖子系統(tǒng)提供了“根據(jù)內(nèi)容查詢出地圖信息”的接口提供給其他子系統(tǒng)調(diào)用,而這里網(wǎng)頁搜索子系統(tǒng)調(diào)用了這個接口贫悄,獲取地圖相關信息瑞驱。
網(wǎng)頁搜索子系統(tǒng)和百度地圖子系統(tǒng)又提供了各自對外用戶調(diào)用的網(wǎng)頁搜索、地圖搜索等各自的對外服務窄坦。這個過程就形成了以上錯綜復雜的網(wǎng)狀結(jié)構(gòu)唤反。而實際上這樣還遠遠不夠,因為每個子系統(tǒng)往往會提供多個對內(nèi)的其他子系統(tǒng)調(diào)用的服務接口鸭津,同時也會調(diào)用多個不同子系統(tǒng)提供的多個服務接口彤侍,還會對外提供多個各自的服務接口。所以實際中上圖的網(wǎng)狀調(diào)用結(jié)構(gòu)將會成幾何倍的擴張逆趋。而且隨著用戶量的增加盏阶,每個子系統(tǒng)還需要繼續(xù)增加更多的實例來提供服務,從而導致了凌亂的加劇闻书。
對于微服務之間錯綜復雜的調(diào)用關系名斟,通過eureka來管理,可以讓每個服務之間不用關心如何調(diào)用的問題惠窄,專注于自己的業(yè)務功能實現(xiàn)蒸眠。
從系統(tǒng)架構(gòu)的演變到對于微服務架構(gòu)的思考
為什么上圖中的系統(tǒng)演變最終會變成如圖所示的樣子?這是一種架構(gòu)思維杆融,這里不擴展來說。簡單描述一下微服務架構(gòu)是為了解決什么問題霜运。隨著系統(tǒng)結(jié)構(gòu)脾歇、架構(gòu)的演變,系統(tǒng)功能的增加淘捡,用戶量的增加藕各,開發(fā)人員的增加等各種增加情況下,需要有一個比較好擴展的系統(tǒng)架構(gòu)來快速焦除、盡量減少代碼改動的前提下以支持系統(tǒng)功能的開發(fā)激况,用戶量增加導致的硬件資源橫向擴容,以及開發(fā)人員增加時的協(xié)同工作效率。在此基礎上需要解決系統(tǒng)的穩(wěn)定性乌逐、容錯性竭讳、高并發(fā)的支持性等。以及隨著系統(tǒng)功能的增加如何有效的管理系統(tǒng)浙踢,排查绢慢、定位系統(tǒng)問題。同時當參與項目的人(包含測試洛波、運維胰舆、業(yè)務等人員)越來越多時,如何能更高效的彼此之間協(xié)同辦公的效率等等蹬挤。
所以微服務架構(gòu)需要考慮的不僅僅是軟件架構(gòu)本身缚窿,需要從參與到整個項目實施過程中的各個環(huán)節(jié),可能的問題以及人員協(xié)同的整體情況去考慮焰扳。讓整個項目做到可用(滿足功能以及硬件資源的橫向擴容)倦零、可行(滿足整個系統(tǒng)運行中的各個點的監(jiān)控、排錯等)蓝翰、可持續(xù)(滿足系統(tǒng)功能的可持續(xù)集成光绕、以及系統(tǒng)運行的可持續(xù)性)以及高效(系統(tǒng)運行的高效、人員協(xié)同工作的高效畜份、功能迭代的高效等)诞帐。
Eureka應用場景中的一些概念
微服務:
Spring Cloud提供了微服務解決的一整套方案,而Eureka是其重要組件爆雹,所以先要了解什么是“微服務”停蕉。在大型系統(tǒng)架構(gòu)中,會拆分多個子系統(tǒng)钙态。這些系統(tǒng)往往都有這幾個功能:提供接口慧起,調(diào)用接口,以及該子系統(tǒng)自身的業(yè)務功能册倒。這樣的一個子系統(tǒng)就稱為一個“微服務”蚓挤。(可以理解為一個子系統(tǒng)的代碼所實現(xiàn)的功能)
比如百度的搜索子系統(tǒng),就具備了:根據(jù)用戶的輸入的信息對信息分詞功能驻子、對每個分詞給予權(quán)重功能灿意、然后根據(jù)分詞和權(quán)重等信息計算出網(wǎng)頁相關度功能、最后把相關度高的網(wǎng)頁按照一定算法排序后提供結(jié)果功能崇呵、記錄用戶錄入信息功能等等業(yè)務功能缤剧。同時它還提供用戶錄入信息提供的接口給其它子系統(tǒng)調(diào)用,如地圖子系統(tǒng)域慷、廣告推薦子系統(tǒng)會調(diào)用該接口后完成各自的業(yè)務功能荒辕。同時搜索子系統(tǒng)也會調(diào)用其它子系統(tǒng)的接口汗销,如調(diào)用地圖子系統(tǒng)的地圖顯示接口等。
實例:
每個服務都會部署到多個機器(或鏡像)中抵窒,這些多個部署的應用就是實例弛针。(可以理解為一套子系統(tǒng)代碼被部署到了多個機器上)
Eureka的管理:
基于以上概念,使用Eureka管理時會具備幾個特性:
→服務需要有一個統(tǒng)一的名稱(或服務ID)并且是唯一標識估脆,以便于接口調(diào)用時各個接口的區(qū)分钦奋。并且需要將其注冊到Eureka Server中,其他服務調(diào)用該接口時疙赠,也是根據(jù)這個唯一標識來獲取付材。
→服務下有多個實例,每個實例也有一個自己的唯一實例ID圃阳。因為它們各自有自己的基礎信息如:不同的IP厌衔。所以它們的信息也需要注冊到Eureka Server中,其他服務調(diào)用它們的服務接口時捍岳,可以查看到多個該服務的實例信息富寿,根據(jù)負載策略提供某個實例的調(diào)用信息后,調(diào)用者根據(jù)信息直接調(diào)用該實例锣夹。
eureka如何管理服務調(diào)用
eureka如何管理服務調(diào)用的页徐?我們先來看個圖:
→在Eureka Client啟動的時候,將自身的服務的信息發(fā)送到Eureka Server银萍。然后進行2調(diào)用當前服務器節(jié)點中的其他服務信息变勇,保存到Eureka Client中。當服務間相互調(diào)用其它服務時贴唇,在Eureka Client中獲取服務信息(如服務地址搀绣,端口等)后,進行第3步戳气,根據(jù)信息直接調(diào)用服務链患。(注:服務的調(diào)用通過http(s)調(diào)用)
→當某個服務僅需要調(diào)用其他服務,自身不提供服務調(diào)用時瓶您。在Eureka Client啟動后會拉取Eureka Server的其他服務信息麻捻,需要調(diào)用時,在Eureka Client的本地緩存中獲取信息呀袱,調(diào)用服務芯肤。
→Eureka Client通過向Eureka Serve發(fā)送心跳(默認每30秒)來續(xù)約服務的。 如果客戶端持續(xù)不能續(xù)約压鉴,那么,它將在大約90秒內(nèi)從服務器注冊表中刪除锻拘。 注冊信息和續(xù)訂被復制到集群中的Eureka Serve所有節(jié)點油吭。 以此來確保當前服務還“活著”击蹲,可以被調(diào)用。
→來自任何區(qū)域的Eureka Client都可以查找注冊表信息(每30秒發(fā)生一次)婉宰,以此來確保調(diào)用到的服務是“活的”歌豺。并且當某個服務被更新或者新加進來,也可以調(diào)用到新的服務心包。
簡單的了解了eureka如何管理服務調(diào)用的之后类咧,我們看看官網(wǎng)提供的圖片,進一步了解更多信息(官網(wǎng)地址:https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance):
這個圖從上而下蟹腾,首先看到us-east-1c痕惋、us-east-1d、us-east-1e這些代表了一個可用區(qū)娃殖。簡單舉個栗子值戳,假設一個Eureka Server集群下面的分布情況是這樣的:
“北京集群中心”是一個區(qū)域,北京市內(nèi)的機房A和B為可用區(qū)(對應官網(wǎng)圖片中的us-east-1c炉爆、us-east-1d堕虹、us-east-1e)。區(qū)域(Region)和可用區(qū)(Zone或者Availability Zone)均是AWS的概念芬首。在非AWS環(huán)境下赴捞,我們可以簡單地將region理解為Eureka某個地區(qū)的集群中心,zone理解成該區(qū)域的每個機房郁稍。每個區(qū)域是通過外網(wǎng)連接赦政,所以速度、穩(wěn)定性上不能保證艺晴。而每個可用區(qū)之間一般是內(nèi)網(wǎng)直連昼钻,保證速度。想更多了解AWS概念的可用查看http://blog.csdn.net/awschina/article/details/17639191
回到官網(wǎng)的圖片可以看出在這個體系中封寞,有2個主體:Eureka Server和Eureka Client然评。
Eureka Server:
提供服務注冊:各個微服務啟動時,會通過Eureka Client向Eureka Server進行注冊自己的信息(例如服務信息和網(wǎng)絡信息)狈究,Eureka Server會存儲該服務的信息碗淌。
提供服務信息提供:服務消費者在調(diào)用服務時,本地Eureka Client沒有的情況下抖锥,會到Eureka Server拉取信息亿眠。
提供服務管理:通過Eureka Client的Cancel、心跳監(jiān)控磅废、renew等方式來維護該服務提供的信息以確保該服務可用以及服務的更新纳像。
信息同步:每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過P2P復制的方式完成服務注冊表的同步拯勉。同步時竟趾,被同步信息不會同步出去憔购。也就是說有3個Eureka Server,Server1有新的服務信息時岔帽,同步到Server2后玫鸟,Server2和Server3同步時,Server2不會把從Server1那里同步到的信息同步給Server3犀勒,只能由Server1自己同步給Server3屎飘。
每個可用區(qū)有一個Eureka集群,并且每個可用區(qū)至少有一個eureka服務器來處理區(qū)內(nèi)故障贾费。為了實現(xiàn)高可用钦购,一般一個可用區(qū)中由三個Eureka Server組成。
Eureka Client
Eureka Client是一個Java客戶端铸本,用于簡化與Eureka Server的交互肮雨。并且管理當前微服務,同時為當前的微服務提供服務提供者信息箱玷。
Eureka Client會拉取怨规、更新和緩存Eureka Server中的信息。即使所有的Eureka Server節(jié)點都宕掉锡足,服務消費者依然可以使用緩存中的信息找到服務提供者波丰。
Eureka Client在微服務啟動后,會周期性地向Eureka Server發(fā)送心跳(默認周期為30秒)以續(xù)約自己的信息舶得。如果Eureka Server在一定時間內(nèi)沒有接收到某個微服務節(jié)點的心跳掰烟,Eureka Server將會注銷該微服務節(jié)點(默認90秒)。
Eureka Client包含服務提供者Applicaton Service和服務消費者Application Client
Applicaton Service:服務提供者沐批,提供服務給別個調(diào)用纫骑。
Application Client:服務消費者,調(diào)用別個提供的服務九孩。
往往大多數(shù)服務本身既是服務提供者先馆,也是服務消費者。
其它動作:
Register:服務注冊
當Eureka客戶端向Eureka Server注冊時躺彬,它提供自身的元數(shù)據(jù)煤墙,比如IP地址、端口宪拥,運行狀況指示符URL仿野,主頁等。
Renew:服務續(xù)約
Eureka Client會每隔30秒發(fā)送一次心跳來續(xù)約她君。 通過續(xù)約來告知Eureka Server該Eureka客戶仍然存在脚作,沒有出現(xiàn)問題。 正常情況下缔刹,如果Eureka Server在90秒沒有收到Eureka客戶的續(xù)約鳖枕,它會將實例從其注冊表中刪除魄梯。 建議不要更改續(xù)約間隔。
Fetch Registries:獲取注冊列表信息
Eureka客戶端從服務器獲取注冊表信息宾符,并將其緩存在本地∶鹣瑁客戶端會使用該信息查找其他服務魏烫,從而進行遠程調(diào)用。該注冊列表信息定期(每30秒鐘)更新一次肝箱。每次返回注冊列表信息可能與Eureka客戶端的緩存信息不同哄褒, Eureka客戶端自動處理。如果由于某種原因?qū)е伦粤斜硇畔⒉荒芗皶r匹配煌张,Eureka客戶端則會重新獲取整個注冊表信息呐赡。 Eureka服務器緩存注冊列表信息,整個注冊表以及每個應用程序的信息進行了壓縮骏融,壓縮內(nèi)容和沒有壓縮的內(nèi)容完全相同链嘀。Eureka客戶端和Eureka 服務器可以使用JSON / XML格式進行通訊。在默認的情況下Eureka客戶端使用壓縮JSON格式來獲取注冊列表的信息档玻。
Cancel:服務下線
Eureka客戶端在程序關閉時向Eureka服務器發(fā)送取消請求怀泊。 發(fā)送請求后,該客戶端實例信息將從服務器的實例注冊表中刪除误趴。該下線請求不會自動完成霹琼,它需要調(diào)用以下內(nèi)容:
DiscoveryManager.getInstance().shutdownComponent();
Eviction 服務剔除
在默認的情況下凉当,當Eureka客戶端連續(xù)90秒沒有向Eureka服務器發(fā)送服務續(xù)約枣申,即心跳,Eureka服務器會將該服務實例從服務注冊列表刪除看杭,即服務剔除忠藤。
結(jié)語:了解了以上一些基礎的概念和原理,對于Eureka的運行情況以及Eureka配置的理解就相對容易多了泊窘。最后附上一個轉(zhuǎn)載來的Eureka參數(shù)配置項詳解:http://www.reibang.com/p/98f4e5f6bca7