Eureka是Netflix開源的一款提供服務注冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。
# 背景介紹
*****
## 服務中心
服務中心又稱注冊中心,管理各種服務功能包括服務的注冊、發現、熔斷、負載、降級等,比如dubbo admin后臺的各種功能。
有了服務中心調用關系會有什么變化,畫幾個簡圖來幫忙理解
項目A調用項目B
正常調用項目A請求項目B

有了服務中心之后,任何一個服務都不能直接去掉用,都需要通過服務中心來調用
項目A調用項目B,項目B在調用項目C
這時候調用的步驟就會為兩步:第一步,項目A首先從服務中心請求項目B服務器,然后項目B在從服務中心請求項目C服務。

上面的項目只是兩三個相互之間的簡單調用,但是如果項目超過20個30個呢,在15年底的時候我司分布式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調用關系全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟著重啟,巨麻煩而且容易出錯。通過服務中心來獲取服務你不需要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去服務中心獲取可以使用的服務去調用既可。
由于各種服務都注冊到了服務中心,就有了去做很多高級功能條件。比如幾臺服務提供相同服務來做均衡負載;監控服務器調用成功率來做熔斷,移除服務列表中的故障點;監控服務調用時間來對不同的服務器設置不同的權重等等。
說Eureka之前我先八卦一下Netflix
## Netflix
以下介紹來自于百度百科:
Netflix是一家美國公司,在美國、加拿大提供互聯網隨選流媒體播放,定制DVD、藍光光碟在線出租業務。該公司成立于1997年,總部位于加利福尼亞州洛斯蓋圖,1999年開始訂閱服務。2009年,該公司可提供多達10萬部DVD電影,并有1千萬的訂戶。2007年2月25日,Netflix宣布已經售出第10億份DVD。HIS一份報告中表示,2011年Netflix網絡電影銷量占據美國用戶在線電影總銷量的45%。
我第一次看到這個單詞的時候,是在各種美劇或者電影的開頭,Netflix拍攝的代表性的美劇有《紙牌屋》、《毒梟》、《怪奇物語》。后來研究springcloud的時候發現了Netflix公司,就在想它們是不是同一家公司,經過核對github上面郵件后綴判定確實是同一家公司,其實springcloud的微服務就基于Netflix公司的開源產品來做的。
Netflix的開源框架組件已經在Netflix的大規模分布式微服務環境中經過多年的生產實戰驗證,正逐步被社區接受為構造微服務框架的標準組件。Spring Cloud開源產品,主要是基于對Netflix開源組件的進一步封裝,方便Spring開發人員構建微服務基礎框架。對于一些打算構建微服務框架體系的公司來說,充分利用或參考借鑒Netflix的開源微服務組件(或Spring Cloud),在此基礎上進行必要的企業定制,無疑是通向微服務架構的捷徑。
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 的服務,主要在 AWS 云中使用, 定位服務來進行中間層服務器的負載均衡和故障轉移。
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務注冊和發現。Eureka 采用了 C-S 的設計架構。Eureka Server 作為服務注冊功能的服務器,它是服務注冊中心。而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server,并維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。Spring Cloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發現系統中的其他微服務,并執行相關的邏輯。
Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用作服務注冊服務器。Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、作為輪詢負載均衡器,并提供服務的故障切換支持。Netflix在其生產環境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態的加權負載均衡。
用一張圖來認識以下:

上圖簡要描述了Eureka的基本架構,由3個角色組成:
1、Eureka Server
提供服務注冊和發現
2、Service Provider
服務提供方
將自身服務注冊到Eureka,從而使服務消費方能夠找到
3、Service Consumer
服務消費方
從Eureka獲取注冊服務列表,從而能夠消費服務
# 案例實踐
*****
## Eureka Server
spring cloud已經幫我實現了服務注冊中心,我們只需要很簡單的幾個步驟就可以完成。
1、pom中添加依賴
```
<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注解
```
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaApplication.class, args);
}
}
```
3、配置文件
在默認設置下,該服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,在application.properties添加以下配置:
```
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 :設置與Eureka Server交互的地址,查詢服務和注冊服務都需要依賴這個地址。默認是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
啟動工程后,訪問:http://localhost:8000/,可以看到下面的頁面,其中還沒有發現任何服務

# 集群
*****
注冊中心這么關鍵的服務,如果是單點話,遇到故障就是毀滅性的。在一個分布式系統中,服務注冊中心是最重要的基礎部分,理應隨時處于可以提供服務的狀態。為了維持其可用性,使用集群是很好的解決方案。Eureka通過互相注冊的方式來實現高可用的部署,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實現高可用部署。
## 雙節點注冊中心
首次我們嘗試一下雙節點的注冊中心的搭建。
1、創建application-peer1.properties,作為peer1服務中心的配置,并將serviceUrl指向peer2
```
spring.application.name=spring-cloud-eureka
server.port=8000
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:8001/eureka/
```
2、創建application-peer2.properties,作為peer2服務中心的配置,并將serviceUrl指向peer1
```
spring.application.name=spring-cloud-eureka
server.port=8001
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:8000/eureka/
```
3、host轉換
在hosts文件中加入如下配置
```
127.0.0.1 peer1
127.0.0.1 peer2
```
4、打包啟動
依次執行下面命令
```
#打包
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/ 效果圖如下:

根據圖可以看出peer1的注冊中心DS Replicas已經有了peer2的相關配置信息,并且出現在available-replicas中。我們手動停止peer2來觀察,發現peer2就會移動到unavailable-replicas一欄中,表示peer2不可用。
到此雙節點的配置已經完成。
## eureka集群使用
在生產中我們可能需要三臺或者大于三臺的注冊中心來保證服務的穩定性,配置的原理其實都一樣,將注冊中心分別指向其它的注冊中心。這里只介紹三臺集群的配置情況,其實和雙節點的注冊中心類似,每臺注冊中心分別又指向其它兩個節點即可,使用application.yml來配置。
application.yml配置詳情如下:
```
---
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的配置參數啟動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
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3
```
依次啟動完成后,瀏覽器輸入:http://localhost:8000/ 效果圖如下:

可以在peer1中看到了peer2、peer3的相關信息。至此eureka集群也已經完成了
- JeeSpringCloud
- JeeSpringCloud-獎項
- JeeSpringCloud-企業版
- 企業開發文檔(開源不易)!
- JeeSpringCloud項目外包服
- 快速開發
- 部署初級
- 部署高級
- 部署異常處理
- JeeSpringDriver.java相關注解類報紅色
- Whitelabel Error Page用開發工具啟動報錯
- MAC電腦Whitelabel Error Page用開發工具啟動報錯
- jstl_core報錯沒有找到
- 多模塊訪問不了jsp或訪問不了jsp
- 導入sql報錯
- Error creating 'tfTicketServiceImpl'
- 運行后系統不到的報acivemq異常
- 有報數據庫相關錯誤
- 運行act表格異常
- 不用使用中文路徑
- 開發異常處理
- 代碼生成后訪問報404
- 發版日志&計劃
- 發版日志
- 發版計劃
- 企業群技術咨詢
- 開發培訓文檔
- 目錄
- 系統介紹
- 功能介紹
- 代碼生成步驟
- 代碼生成專題
- 架構代碼介紹
- 集群
- 隊列
- 高速緩存
- 多項目
- JeeSpringCloud-熱部署
- 系統配置項
- 系統配置界面
- 正式版啟用
- 驗證碼啟用
- 修改版本
- 異常郵箱
- 授權功能
- 系統配置文件
- application.yml
- bootstrap.yml
- 系統專題
- 系統模塊專題
- 云接口專題
- 代碼生成專題
- 開發專題
- 數據權限
- SpringBoot教程(免費)
- 入門篇
- web綜合開發
- SpringCloud(免費)
- 大話Spring Cloud
- 注冊中心Eureka
- 服務提供與調用
- 熔斷器Hystrix
- 項目管理(免費)
- 手把手教你做2019年計劃
- 面試(免費)
- 40K!程序員四面美團,已拿Offer!這些經驗分享給你!
- 小白程序員僅用 5 分鐘入職 BAT,他只做了這件事!