天天看點

SpringCloud-注冊中心Eureka

作者:臭豬比

Eureka是Netflix開源的一款提供服務注冊和發現的産品,它提供了完整的Service Registry和Service Discovery實作。也是springcloud體系中最重要最核心的元件之一。

背景介紹

服務中心

服務中心又稱注冊中心,管理各種服務功能包括服務的注冊、發現、熔斷、負載、降級等,比如dubbo admin背景的各種功能。

有了服務中心調用關系會有什麼變化,畫幾個簡圖來幫忙了解

項目A調用項目B

正常調用項目A請求項目B

SpringCloud-注冊中心Eureka

有了服務中心之後,任何一個服務都不能直接去掉用,都需要通過服務中心來調用

SpringCloud-注冊中心Eureka

項目A調用項目B,項目B在調用項目C

SpringCloud-注冊中心Eureka

這時候調用的步驟就會為兩步:第一步,項目A首先從服務中心請求項目B伺服器,然後項目B在從服務中心請求項目C服務。

SpringCloud-注冊中心Eureka

上面的項目隻是兩三個互相之間的簡單調用,但是如果項目超過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在其生産環境中使用的是另外的用戶端,它提供基于流量、資源使用率以及出錯狀态的權重負載均衡。

用一張圖來認識以下:

SpringCloud-注冊中心Eureka

上圖簡要描述了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/,可以看到下面的頁面,其中還沒有發現任何服務
SpringCloud-注冊中心Eureka

叢集

注冊中心這麼關鍵的服務,如果是單點話,遇到故障就是毀滅性的。在一個分布式系統中,服務注冊中心是最重要的基礎部分,理應随時處于可以提供服務的狀态。為了維持其可用性,使用叢集是很好的解決方案。Eureka通過互相注冊的方式來實作高可用的部署,是以我們隻需要将Eureke Server配置其他可用的serviceUrl就能實作高可用部署。

雙節點注冊中心

首次我們嘗試一下雙節點的注冊中心的搭建。

1、建立application-peer1.properties,作為peer1服務中心的配置,并将serviceUrl指向peer

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/ 效果圖如下:

SpringCloud-注冊中心Eureka

根據圖可以看出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/ 效果圖如下:

SpringCloud-注冊中心Eureka

可以在peer1中看到了peer2、peer3的相關資訊。至此eureka叢集也已經完成了