eureka是netflix開源的一款提供服務(wù)注冊和發(fā)現(xiàn)的產(chǎn)品,它提供了完整的service registry和service discovery實現(xiàn)。也是springcloud體系中最重要最核心的組件之一。
背景介紹
服務(wù)中心
服務(wù)中心又稱注冊中心,管理各種服務(wù)功能包括服務(wù)的注冊、發(fā)現(xiàn)、熔斷、負載、降級等,比如dubbo admin后臺的各種功能。
有了服務(wù)中心調(diào)用關(guān)系會有什么變化,畫幾個簡圖來幫忙理解
項目a調(diào)用項目b
正常調(diào)用項目a請求項目b
有了服務(wù)中心之后,任何一個服務(wù)都不能直接去掉用,都需要通過服務(wù)中心來調(diào)用
項目a調(diào)用項目b,項目b在調(diào)用項目c
這時候調(diào)用的步驟就會為兩步:第一步,項目a首先從服務(wù)中心請求項目b服務(wù)器,然后項目b在從服務(wù)中心請求項目c服務(wù)。
上面的項目只是兩三個相互之間的簡單調(diào)用,但是如果項目超過20個30個呢,在15年底的時候我司分布式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調(diào)用關(guān)系全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟著重啟,巨麻煩而且容易出錯。通過服務(wù)中心來獲取服務(wù)你不需要關(guān)注你調(diào)用的項目ip地址,由幾臺服務(wù)器組成,每次直接去服務(wù)中心獲取可以使用的服務(wù)去調(diào)用既可。
由于各種服務(wù)都注冊到了服務(wù)中心,就有了去做很多高級功能條件。比如幾臺服務(wù)提供相同服務(wù)來做均衡負載;監(jiān)控服務(wù)器調(diào)用成功率來做熔斷,移除服務(wù)列表中的故障點;監(jiān)控服務(wù)調(diào)用時間來對不同的服務(wù)器設(shè)置不同的權(quán)重等等。
說eureka之前我先八卦一下netflix
netflix
以下介紹來自于百度百科:
netflix是一家美國公司,在美國、加拿大提供互聯(lián)網(wǎng)隨選流媒體播放,定制dvd、藍光光碟在線出租業(yè)務(wù)。該公司成立于1997年,總部位于加利福尼亞州洛斯蓋圖,1999年開始訂閱服務(wù)。2009年,該公司可提供多達10萬部dvd電影,并有1千萬的訂戶。2007年2月25日,netflix宣布已經(jīng)售出第10億份dvd。his一份報告中表示,2011年netflix網(wǎng)絡(luò)電影銷量占據(jù)美國用戶在線電影總銷量的45%。
我第一次看到這個單詞的時候,是在各種美劇或者電影的開頭,netflix拍攝的代表性的美劇有《紙牌屋》、《毒梟》、《怪奇物語》。后來研究springcloud的時候發(fā)現(xiàn)了netflix公司,就在想它們是不是同一家公司,經(jīng)過核對github上面郵件后綴判定確實是同一家公司,其實springcloud的微服務(wù)就基于netflix公司的開源產(chǎn)品來做的。
netflix的開源框架組件已經(jīng)在netflix的大規(guī)模分布式微服務(wù)環(huán)境中經(jīng)過多年的生產(chǎn)實戰(zhàn)驗證,正逐步被社區(qū)接受為構(gòu)造微服務(wù)框架的標準組件。spring cloud開源產(chǎn)品,主要是基于對netflix開源組件的進一步封裝,方便spring開發(fā)人員構(gòu)建微服務(wù)基礎(chǔ)框架。對于一些打算構(gòu)建微服務(wù)框架體系的公司來說,充分利用或參考借鑒netflix的開源微服務(wù)組件(或spring cloud),在此基礎(chǔ)上進行必要的企業(yè)定制,無疑是通向微服務(wù)架構(gòu)的捷徑。
eureka
按照官方介紹:
eureka is a rest (representational state transfer) based service that is primarily used in the aws cloud for locating services for the purpose of load balancing and failover of middle-tier servers.
eureka 是一個基于 rest 的服務(wù),主要在 aws 云中使用, 定位服務(wù)來進行中間層服務(wù)器的負載均衡和故障轉(zhuǎn)移。
spring cloud 封裝了 netflix 公司開發(fā)的 eureka 模塊來實現(xiàn)服務(wù)注冊和發(fā)現(xiàn)。eureka 采用了 c-s 的設(shè)計架構(gòu)。eureka server 作為服務(wù)注冊功能的服務(wù)器,它是服務(wù)注冊中心。而系統(tǒng)中的其他微服務(wù),使用 eureka 的客戶端連接到 eureka server,并維持心跳連接。這樣系統(tǒng)的維護人員就可以通過 eureka server 來監(jiān)控系統(tǒng)中各個微服務(wù)是否正常運行。spring cloud 的一些其他模塊(比如zuul)就可以通過 eureka server 來發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù),并執(zhí)行相關(guān)的邏輯。
eureka由兩個組件組成:eureka服務(wù)器和eureka客戶端。eureka服務(wù)器用作服務(wù)注冊服務(wù)器。eureka客戶端是一個java客戶端,用來簡化與服務(wù)器的交互、作為輪詢負載均衡器,并提供服務(wù)的故障切換支持。netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態(tài)的加權(quán)負載均衡。
用一張圖來認識以下:
上圖簡要描述了eureka的基本架構(gòu),由3個角色組成:
1、eureka server
- 提供服務(wù)注冊和發(fā)現(xiàn)
2、service provider
- 服務(wù)提供方
- 將自身服務(wù)注冊到eureka,從而使服務(wù)消費方能夠找到
3、service consumer
- 服務(wù)消費方
- 從eureka獲取注冊服務(wù)列表,從而能夠消費服務(wù)
案例實踐
eureka server
spring cloud已經(jīng)幫我實現(xiàn)了服務(wù)注冊中心,我們只需要很簡單的幾個步驟就可以完成。
1、pom中添加依賴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<dependencies> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter</artifactid> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-eureka-server</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> </dependencies> |
2、添加啟動代碼中添加@enableeurekaserver
注解
1
2
3
4
5
6
7
8
|
@springbootapplication @enableeurekaserver public class springcloudeurekaapplication { public static void main(string[] args) { springapplication.run(springcloudeurekaapplication. class , args); } } |
3、配置文件
在默認設(shè)置下,該服務(wù)注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,在application.properties
添加以下配置:
1
2
3
4
5
6
7
|
spring.application.name=spring-cloud-eureka server.port= 8000 eureka.client.register-with-eureka= false eureka.client.fetch-registry= false eureka.client.serviceurl.defaultzone=http: //localhost:${server.port}/eureka/ |
-
eureka.client.register-with-eureka
:表示是否將自己注冊到eureka server,默認為true。 -
eureka.client.fetch-registry
:表示是否從eureka server獲取注冊信息,默認為true。 -
eureka.client.serviceurl.defaultzone
:設(shè)置與eureka server交互的地址,查詢服務(wù)和注冊服務(wù)都需要依賴這個地址。默認是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
啟動工程后,訪問:http://localhost:8000/,可以看到下面的頁面,其中還沒有發(fā)現(xiàn)任何服務(wù)
集群
注冊中心這么關(guān)鍵的服務(wù),如果是單點話,遇到故障就是毀滅性的。在一個分布式系統(tǒng)中,服務(wù)注冊中心是最重要的基礎(chǔ)部分,理應(yīng)隨時處于可以提供服務(wù)的狀態(tài)。為了維持其可用性,使用集群是很好的解決方案。eureka通過互相注冊的方式來實現(xiàn)高可用的部署,所以我們只需要將eureke server配置其他可用的serviceurl就能實現(xiàn)高可用部署。
雙節(jié)點注冊中心
首次我們嘗試一下雙節(jié)點的注冊中心的搭建。
1、創(chuàng)建application-peer1.properties,作為peer1服務(wù)中心的配置,并將serviceurl指向peer2
1
2
3
4
5
|
spring.application.name=spring-cloud-eureka server.port= 8000 eureka.instance.hostname=peer1 eureka.client.serviceurl.defaultzone=http: //peer2:8001/eureka/ |
2、創(chuàng)建application-peer2.properties,作為peer2服務(wù)中心的配置,并將serviceurl指向peer1
1
2
3
4
5
|
spring.application.name=spring-cloud-eureka server.port= 8001 eureka.instance.hostname=peer2 eureka.client.serviceurl.defaultzone=http: //peer1:8000/eureka/ |
3、host轉(zhuǎn)換
在hosts文件中加入如下配置
1
2
|
127.0 . 0.1 peer1 127.0 . 0.1 peer2 |
4、打包啟動
依次執(zhí)行下面命令
1
2
3
4
5
|
#打包 mvn clean package # 分別以peer1和peeer2 配置信息啟動eureka java -jar spring-cloud-eureka- 0.0 . 1 -snapshot.jar --spring.profiles.active=peer1 java -jar spring-cloud-eureka- 0.0 . 1 -snapshot.jar --spring.profiles.active=peer2 |
依次啟動完成后,瀏覽器輸入:http://localhost:8000/
效果圖如下:
根據(jù)圖可以看出peer1的注冊中心ds replicas已經(jīng)有了peer2的相關(guān)配置信息,并且出現(xiàn)在available-replicas中。我們手動停止peer2來觀察,發(fā)現(xiàn)peer2就會移動到unavailable-replicas一欄中,表示peer2不可用。
到此雙節(jié)點的配置已經(jīng)完成。
eureka集群使用
在生產(chǎn)中我們可能需要三臺或者大于三臺的注冊中心來保證服務(wù)的穩(wěn)定性,配置的原理其實都一樣,將注冊中心分別指向其它的注冊中心。這里只介紹三臺集群的配置情況,其實和雙節(jié)點的注冊中心類似,每臺注冊中心分別又指向其它兩個節(jié)點即可,使用application.yml來配置。
application.yml配置詳情如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
--- spring: application: name: spring-cloud-eureka profiles: peer1 server: port: 8000 eureka: instance: hostname: peer1 client: serviceurl: defaultzone: http: //peer2:8001/eureka/,http://peer3:8002/eureka/ --- spring: application: name: spring-cloud-eureka profiles: peer2 server: port: 8001 eureka: instance: hostname: peer2 client: serviceurl: defaultzone: http: //peer1:8000/eureka/,http://peer3:8002/eureka/ --- spring: application: name: spring-cloud-eureka profiles: peer3 server: port: 8002 eureka: instance: hostname: peer3 client: serviceurl: defaultzone: http: //peer1:8000/eureka/,http://peer2:8001/eureka/ |
分別以peer1、peer2、peer3的配置參數(shù)啟動eureka注冊中心。
1
2
3
|
java -jar spring-cloud-eureka- 0.0 . 1 -snapshot.jar --spring.profiles.active=peer1 java -jar spring-cloud-eureka- 0.0 . 1 -snapshot.jar --spring.profiles.active=peer2 java -jar spring-cloud-eureka- 0.0 . 1 -snapshot.jar --spring.profiles.active=peer3 |
依次啟動完成后,瀏覽器輸入:http://localhost:8000/
效果圖如下:
可以在peer1中看到了peer2、peer3的相關(guān)信息。至此eureka集群也已經(jīng)完成了
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/ityouknow/article/details/72085662