天天看點

《Spring Cloud Netflix》 -- 服務注冊和服務發現-Eureka 的使用

 一、Spring Cloud Netflix

該項目是Spring Cloud的核心子項目,是對Netflix公司一系列開源産品的封裝。它為Spring Boot應用提供了自配置的整合,隻需要通過一些簡單的注解,就可以快速地在Spring Cloud的應用中使用起來。

它主要提供的子產品包括:

服務發現注冊(Eureka)

用戶端負載均衡(Ribbon)

斷路器(Hystrix)

智能路由(Zuul)

開源位址:

http://netflix.github.io/

https://github.com/Netflix

二、服務注冊和服務發現

《Spring Cloud Netflix》 -- 服務注冊和服務發現-Eureka 的使用

調用關系說明:

1.服務提供者在啟動時,向注冊中心注冊自己提供的服務。

2.服務消費者在啟動時,向注冊中心訂閱自己所需的服務。

3.注冊中心傳回服務提供者位址給消費者。

4.服務消費者從提供者位址中調用消費者。

注意! 下面的服務端指:注冊中心,用戶端指:提供者和消費者

  三、如何使用Eureka進行服務注冊和發現

1、服務端添加依賴

<dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

           

2、服務端添加配置

# server (eureka 預設端口為:8761)

server.port=8761

           

# spring

spring.application.name=spring-cloud-server

           

# eureka

# 是否注冊到eureka

eureka.client.register-with-eureka=false

           

# 是否從eureka擷取注冊資訊

eureka.client.fetch-registry=false

           

# eureka伺服器的位址(注意:位址最後面的 /eureka/ 這個是固定值)

eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

           

3、服務端添加注解

@EnableEurekaServer

           

4、用戶端添加依賴

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

           

5、用戶端添加配置

提供者

# server

server.port=7777

           

# spring

spring.application.name=spring-cloud-provider

           

# eureka

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

           

消費者

# server

server.port=8888

           

# spring

spring.application.name=spring-cloud-consumer

           

# eureka

eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

           

6、用戶端添加注解

@EnableEurekaClient

           

注意:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

分析:是由于Eureka進入了保護模式。

在保護模式下,Eureka Server将會嘗試保護其服務系統資料庫中的資訊,暫時不會登出服務系統資料庫中的服務。

四、基本流程:

《Spring Cloud Netflix》 -- 服務注冊和服務發現-Eureka 的使用

1、  最左邊的client(即服務提供者)發起us-east-1c注冊請求;

2、  Eureka Server叢集中的其他兩個node(us-east-1d和us-east-1e進行Replicate複制);

3、  圖下放的兩個client(即服務消費者)分别向三個server擷取注冊資訊及Get Registry。

五、和Zookeeper的對比

1、分布式系統的CAP理論:

一緻性(C):所有的節點上的資料時刻保持同步。

可用性(A):每個請求都能接受到一個響應,無論響應成功或失敗。

分區容錯性(P):系統應該能持續提供服務,即使系統内部有消息丢失(分區)。

由于分區容錯性在是分布式系統中必須要保證的,是以我們隻能在A和C之間進行權衡。

在此Zookeeper保證的是CP, 而Eureka則是AP。

2、Zookeeper保證CP

ZooKeeper是個 CP的,即任何時刻對ZooKeeper的通路請求能得到一緻的資料結果,同時系統對網絡分割具備容錯性、但是它不能保證每次服務請求的可用性(注:也就是在極端環境下,ZooKeeper可能會丢棄一些請求,消費者程式需要重新請求才能獲得結果)。

例如:當master節點因為網絡故障與其他節點失去聯系時,剩餘節點會重新進行leader選舉。問題在于,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk叢集都是不可用的,這就導緻在選舉期間注冊服務癱瘓。

3、Eureka保證AP

Eureka看明白了這一點,是以在設計時就優先保證可用性。我們可以容忍注冊中心傳回的是幾分鐘以前的注冊資訊,但不能接受服務直接down掉不可用。也就是說,服務注冊功能對可用性的要求要高于一緻性。

如果Eureka服務節點在短時間裡丢失了大量的心跳連接配接(注:可能發生了網絡故障),那麼這個 Eureka節點會進入“自我保護模式”,同時保留那些“心跳死亡”的服務注冊資訊不過期。此時,這個Eureka節點對于新的服務還能提供注冊服務,對于“死亡”的仍然保留,以防還有用戶端向其發起請求。當網絡故障恢複後,這個Eureka節點會退出“自我保護模式”。Eureka的哲學是,同時保留“好資料”與“壞資料”總比丢掉任何資料要更好。

4、總結

Eureka作為單純的服務注冊中心來說要比zookeeper更加“專業”,因為注冊服務更重要的是可用性,我們可以接受短期内達不到一緻性的狀況。

當然,這也要看具體的使用場景。

參考視訊教程:http://www.roncoo.com/course/view/cc8fbd6749f94f2fa015641ef96b9460

點選連結加入群【Spring Cloud 實戰群】:https://jq.qq.com/?_wv=1027&k=47YlnT7

繼續閱讀