java架構(gòu)師高端課微服務(wù)_02_SpringCloud_Netflix_Eureka
Spring Cloud?Netflix Eureka
主要內(nèi)容
Eureka簡介
Eureka和Zookeeper 對比
搭建Eureka注冊中心
Eureka 服務(wù)管理平臺介紹
搭建高可用集群
集群原理
Eureka優(yōu)雅停服
學(xué)習(xí)目標(biāo)

Spring Cloud?Netflix Eureka
一、?Eureka簡介
Eureka是Netflix開發(fā)的服務(wù)發(fā)現(xiàn)框架,本身是一個(gè)基于REST的服務(wù),主要用于定位運(yùn)行在AWS域中的中間層服務(wù),以達(dá)到負(fù)載均衡和中間層服務(wù)故障轉(zhuǎn)移的目的。
SpringCloud將它集成在其子項(xiàng)目spring-cloud-netflix中,以實(shí)現(xiàn)SpringCloud的服務(wù)發(fā)現(xiàn)功能。
1?Eureka組件
Eureka包含兩個(gè)組件:Eureka Server和Eureka Client。
1.1?Eureka Server
Eureka Server提供服務(wù)注冊服務(wù),各個(gè)節(jié)點(diǎn)啟動(dòng)后,會(huì)在Eureka Server中進(jìn)行注冊,這樣EurekaServer中的服務(wù)注冊表中將會(huì)存儲所有可用服務(wù)節(jié)點(diǎn)的信息,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀的看到。
Eureka Server本身也是一個(gè)服務(wù),默認(rèn)情況下會(huì)自動(dòng)注冊到Eureka注冊中心。
如果搭建單機(jī)版的Eureka Server注冊中心,則需要配置取消Eureka Server的自動(dòng)注冊邏輯。畢竟當(dāng)前服務(wù)注冊到當(dāng)前服務(wù)代表的注冊中心中是一個(gè)說不通的邏輯。
Eureka Server通過Register、Get、Renew等接口提供服務(wù)的注冊、發(fā)現(xiàn)和心跳檢測等服務(wù)。
1.2?Eureka Client
Eureka Client是一個(gè)java客戶端,用于簡化與Eureka Server的交互,客戶端同時(shí)也具備一個(gè)內(nèi)置的、使用輪詢(round-robin)負(fù)載算法的負(fù)載均衡器。在應(yīng)用啟動(dòng)后,將會(huì)向Eureka Server發(fā)送心跳,默認(rèn)周期為30秒,如果Eureka Server在多個(gè)心跳周期內(nèi)沒有接收到某個(gè)節(jié)點(diǎn)的心跳,Eureka Server將會(huì)從服務(wù)注冊表中把這個(gè)服務(wù)節(jié)點(diǎn)移除(默認(rèn)90秒)。
Eureka Client分為兩個(gè)角色,分別是:Application Service(Service Provider)和Application Client(Service Consumer)
1.2.1?Application Service
服務(wù)提供方,是注冊到Eureka Server中的服務(wù)。
1.2.2?Application Client
服務(wù)消費(fèi)方,通過Eureka Server發(fā)現(xiàn)服務(wù),并消費(fèi)。
?
注意:在這里,Application Service和Application Client不是絕對上的定義,因?yàn)镻rovider在提供服務(wù)的同時(shí),也可以消費(fèi)其他Provider提供的服務(wù);Consumer在消費(fèi)服務(wù)的同時(shí),也可以提供對外服務(wù)。
二、?Eureka和Zookeeper 對比
1?什么是CAP定理
CAP原則又稱CAP定理,指的是在一個(gè)分布式系統(tǒng)中,Consistency(數(shù)據(jù)一致性)、 Availability(服務(wù)可用性)、Partition tolerance(分區(qū)容錯(cuò)性),三者不可兼得。
CAP由Eric Brewer在2000年P(guān)ODC會(huì)議上提出。該猜想在提出兩年后被證明成立,成為我們熟知的CAP定理




2 基于CAP定理比對Eureka和Zookeeper





三、?搭建Eureka注冊中心
Eureka Server既是一個(gè)注冊中心,同時(shí)也是一個(gè)服務(wù)。那么搭建Eureka Server的方式和以往搭建Dubbo注冊中心ZooKeeper的方式必然不同,那么首先搭建一個(gè)單機(jī)版的Eureka Server注冊中心。
1?POM文件


2??配置文件application.yml
Eureka Server本身也是一個(gè)服務(wù),同時(shí)又是一個(gè)注冊中心。在Spring Cloud中,啟動(dòng)的微服務(wù)會(huì)自動(dòng)的搜索注冊中心并注冊服務(wù),那么在單機(jī)版Eureka Server環(huán)境中,當(dāng)前服務(wù)注冊到當(dāng)前服務(wù)中,明顯是不合適的。所以搭建Eureka Server單機(jī)版時(shí),需要提供特殊的全局配置,避免回路注冊邏輯。
同理,Eureka Server服務(wù)在注冊中心中發(fā)現(xiàn)服務(wù)列表邏輯也是不必要的。畢竟注冊中心是一個(gè)中立的服務(wù)管理平臺,如果是單機(jī)版Eureka Server環(huán)境中,Eureka Server服務(wù)再去發(fā)現(xiàn)服務(wù)列表,明顯也是不必要的。也需要通過全局配置,避免回路發(fā)現(xiàn)邏輯。


3??啟動(dòng)類


4? 訪問Eureka Server WEB服務(wù)管理平臺
訪問服務(wù)管理平臺地址為: http://ip:port/
四、?Eureka 服務(wù)管理平臺介紹
1?Eureka Server服務(wù)管理平臺訪問預(yù)覽

?
2??System Status
系統(tǒng)狀態(tài)展示
3??DS Replicas
注冊中心集群列表
4??Instances currently registered with Eureka
已在注冊中心中注冊的服務(wù)列表
5??General Info
當(dāng)前注冊中心相關(guān)信息展示
6??Instance Info
當(dāng)前注冊中心實(shí)例信息展示
五、?搭建高可用集群
1?在Eureka應(yīng)用中定義多環(huán)境配置
1.1?application-eureka1.yml

1.2?application-eureka2.yml


2?打包工程
2.1?POM依賴
增加Spring Boot打包插件


2.2?打包

2.3?打包結(jié)果

3??上傳打包后的jar文件到Linux系統(tǒng)
4??設(shè)置Linux主機(jī)域名
修改/etc/hosts文件,設(shè)置主機(jī)域名。將主機(jī)域名和IP進(jìn)行綁定。
vi /etc/hosts
新增內(nèi)容如下:兩個(gè)Linux系統(tǒng)修改內(nèi)容相同。(IP根據(jù)具體環(huán)境配置)

5??啟動(dòng)Eureka
5.1?使用java命令啟動(dòng)
java -jar -Dspring.profiles.active=eureka1 cloudeureka-1.0-SNAPSHOT.jar
5.2?腳本啟動(dòng)
當(dāng)然,每次通過命令來啟動(dòng)Eureka Server過于麻煩,可以定義一個(gè)shell文件來簡化操作。(Java程序員不必要掌握shell腳本的編寫。建議對shell腳本有一定的了解,至少能夠修改內(nèi)部的必要參數(shù)值。Shell腳本一般由運(yùn)維或部署人員開發(fā)。也可能有系統(tǒng)工程師開發(fā)。)具體shell內(nèi)容如下:










設(shè)置好shell啟動(dòng)腳本后,需要提供可執(zhí)行權(quán)限:shell腳本文件名自己修改。
chmod 755 xxx.sh
腳本使用方式為:
啟動(dòng)Eureka Server命令:??./xxx.sh start
關(guān)閉Eureka Server命令:??./xxx.sh stop
?
六、?集群原理
Eureka Server注冊中心的集群和Dubbo的ZooKeeper注冊中心集群在結(jié)構(gòu)上有很大的不同。
Eureka Server注冊中心集群中每個(gè)節(jié)點(diǎn)都是平等的,集群中的所有節(jié)點(diǎn)同時(shí)對外提供服務(wù)的發(fā)現(xiàn)和注冊等功能。同時(shí)集群中每個(gè)Eureka Server節(jié)點(diǎn)又是一個(gè)微服務(wù),也就是說,每個(gè)節(jié)點(diǎn)都可以在集群中的其他節(jié)點(diǎn)上注冊當(dāng)前服務(wù)。又因?yàn)槊總€(gè)節(jié)點(diǎn)都是注冊中心,所以節(jié)點(diǎn)之間又可以相互注冊當(dāng)前節(jié)點(diǎn)中已注冊的服務(wù),并發(fā)現(xiàn)其他節(jié)點(diǎn)中已注冊的服務(wù)。
1?Eureka集群架構(gòu)原理圖

七、?Eureka優(yōu)雅停服
1?自我保護(hù)模式
一般情況下,微服務(wù)在 Eureka 上注冊后,會(huì)每 30 秒發(fā)送心跳包,Eureka 通過心跳來判斷服務(wù)時(shí)候健康,同時(shí)會(huì)定期刪除超過 90 秒沒有發(fā)送心跳服務(wù)。
有兩種情況會(huì)導(dǎo)致 Eureka Server 收不到微服務(wù)的心跳:一是微服務(wù)自身的原因;二是微服務(wù)與 Eureka 之間的網(wǎng)絡(luò)故障。
通常微服務(wù)自身的故障關(guān)閉只會(huì)導(dǎo)致個(gè)別服務(wù)出現(xiàn)故障,一般不會(huì)出現(xiàn)大面積故障,而網(wǎng)絡(luò)故障通常會(huì)導(dǎo)致 Eureka Server 在短時(shí)間內(nèi)無法收到大批心跳。考慮到這個(gè)區(qū)別,Eureka 設(shè)置了一個(gè)閥值,當(dāng)判斷離線服務(wù)的數(shù)量超過閥值時(shí),Eureka Server 認(rèn)為很大程度上出現(xiàn)了網(wǎng)絡(luò)故障,將不再刪除心跳過期的服務(wù)。
那么這個(gè)閥值是多少呢?15分鐘之內(nèi)是否低于 85%;Eureka Server 在運(yùn)行期間,會(huì)統(tǒng)計(jì)心跳失敗的比例在15分鐘內(nèi)是否低于85%,這種算法叫做 Eureka Server 的自我保護(hù)模式。
1?為什么要自我保護(hù)
因?yàn)橥瑫r(shí)保留"好數(shù)據(jù)"與"壞數(shù)據(jù)"總比丟掉任何數(shù)據(jù)要更好,當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,這個(gè) Eureka 節(jié)點(diǎn)會(huì)退出"自我保護(hù)模式"。Eureka 還有客戶端緩存功能(也就是微服務(wù)的緩存功能)。即便 Eureka 集群中所有節(jié)點(diǎn)都宕機(jī)失效,微服務(wù)的 Provider 和 Consumer都能依托服務(wù)緩存正常通信。微服務(wù)的負(fù)載均衡策略會(huì)自動(dòng)剔除離線的微服務(wù)節(jié)點(diǎn)。
2?關(guān)閉自我保護(hù)
修改Eureka Server中的核心配置文件application.yml
