springcloud(二):註冊中心Eureka

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

背景介紹

服務中心

服務中心又稱註冊中心,管理各類服務功能包括服務的註冊、發現、熔斷、負載、降級等,好比dubbo admin後臺的各類功能。java

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

項目A調用項目Bgithub

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

有了服務中心以後,任何一個服務都不能直接去掉用,都須要經過服務中心來調用瀏覽器

項目A調用項目B,項目B在調用項目C服務器

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

上面的項目只是兩三個相互之間的簡單調用,可是若是項目超過20個30個呢,在15年末的時候我司分佈式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調用關係全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟着重啓,巨麻煩並且容易出錯。經過服務中心來獲取服務你不須要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去服務中心獲取可使用的服務去調用既可。架構

因爲各類服務都註冊到了服務中心,就有了去作不少高級功能條件。好比幾臺服務提供相同服務來作均衡負載;監控服務器調用成功率來作熔斷,移除服務列表中的故障點;監控服務調用時間來對不一樣的服務器設置不一樣的權重等等。app

說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個角色組成:

一、Eureka Server

  • 提供服務註冊和發現

二、Service Provider

  • 服務提供方
  • 將自身服務註冊到Eureka,從而使服務消費方可以找到

三、Service Consumer

  • 服務消費方
  • 從Eureka獲取註冊服務列表,從而可以消費服務

案例實踐

Eureka Server

spring cloud已經幫我實現了服務註冊中心,咱們只須要很簡單的幾個步驟就能夠完成。

一、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>

 

二、添加啓動代碼中添加@EnableEurekaServer註解

@SpringBootApplication
@EnableEurekaServer
public class SpringCloudEurekaApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
}

 

三、配置文件

在默認設置下,該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們須要禁用它的客戶端註冊行爲,在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就能實現高可用部署。

雙節點註冊中心

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

一、建立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/

 

二、建立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/

 

三、host轉換

在hosts文件中加入以下配置

127.0.0.1 peer1  
127.0.0.1 peer2  

 

四、打包啓動

依次執行下面命令

#打包
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/

 

分別以peer一、peer二、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中看到了peer二、peer3的相關信息。至此eureka集羣也已經完成了

示例代碼-github

示例代碼-碼雲

參考:

Spring Cloud構建微服務架構(六)高可用服務註冊中心

Peer Awareness


做者:純潔的微笑
出處:http://www.ityouknow.com/ 版權歸做者全部,轉載請註明出處

相關文章
相關標籤/搜索