三、SpringCloud——Eureka Demo (服務註冊與發現,Eureka 集羣)

1 Eureka 簡介

  1. Eureka是什麼

Eureka是Netflix的一個子模塊,也是核心模塊之一。Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。

服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現與註冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的註冊中心,比如Zookeeper。

在這裏插入圖片描述

  1. 原理講解
    Eureka的基本架構
    Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現(對比Zookeeper)。
    Eureka 採用了 C-S 的設計架構。Eureka Server 作爲服務註冊功能的服務器,它是服務註冊中心。而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server並維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發現系統中的其他微服務,並執行相關的邏輯。
    請注意和Dubbo的架構對比
    在這裏插入圖片描述

在這裏插入圖片描述
Eureka包含兩個組件:Eureka Server和Eureka Client
Eureka Server提供服務註冊服務
各個節點啓動後,會在EurekaServer中進行註冊,這樣EurekaServer中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到

EurekaClient是一個Java客戶端,用於簡化Eureka Server的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啓動後,將會向Eureka Server發送心跳(默認週期爲30秒)。如果Eureka Server在多個心跳週期內沒有接收到某個節點的心跳,EurekaServer將會從服務註冊表中把這個服務節點移除(默認90秒)

三大角色
Eureka Server 提供服務註冊和發現
Service Provider服務提供方將自身服務註冊到Eureka,從而使服務消費方能夠找到
Service Consumer服務消費方從Eureka獲取註冊服務列表,從而能夠消費服務

2 Eureka Demo
承接上文https://mp.csdn.net/mdeditor/96200728#

1)新建microservicecloud-eureka-7001eureka服務註冊中心Module

a) 編寫pom.xml 建議使用netflix 版本spring-cloud-starter-netflix-eureka-server
在這裏插入圖片描述

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
   <groupId>com.atguigu.springcloud</groupId>
   <artifactId>microservicecloud</artifactId>
   <version>0.0.1-SNAPSHOT</version>
  </parent>

  <artifactId>microservicecloud-eureka-7001</artifactId>

  <dependencies>
   <!--eureka-server服務端 --> 
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId> spring-cloud-starter-netflix-eureka-server</artifactId>
   </dependency>
   <!-- 修改後立即生效,熱部署 -->
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>springloaded</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
   </dependency>
  </dependencies>

</project>

b)新建application.properties,編輯如下

server.port=7001
#eureka服務端的實例名稱
eureka.instance.hostname=localhost
#false表示不向註冊中心註冊自己。
eureka.client.register-with-eureka=false
#false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
eureka.client.fetch-registry=false
#設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址。
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

c)編寫EurekaServer7001_App主啓動類,添加@EnableEurekaServer註解

@SpringBootApplication
@EnableEurekaServer//EurekaServer服務器端啓動類,接受其它微服務註冊進來
public class EurekaServer7001_App
{
  public static void main(String[] args)
  {
   SpringApplication.run(EurekaServer7001_App.class, args);
  }
}

d)測試

http://localhost:7001/
No application available 沒有服務被發現 (因爲沒有註冊服務進來當然不可能有服務被發現)

在這裏插入圖片描述

2)microservicecloud-provider-8001 將已有的部門微服務註冊進eureka服務中心

a)修改pom.xml,添加如下依賴


   <!-- 將微服務provider側註冊進eureka -->
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka</artifactId>
   </dependency>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-config</artifactId>
   </dependency>

b)修改application.properties文件 添加如下配置

#客戶端註冊進eureka服務列表內
eureka.client.service-url.defaultZone=http://localhost:7001/eureka

c)修改主啓動類DeptProvider8001,添加如下註解
@EnableEurekaClient //本服務啓動後會自動註冊進eureka服務中

@SpringBootApplication
@EnableEurekaClient
public class DeptProvider8001 {
    public static void main(String[] args)
    {
        SpringApplication.run(DeptProvider8001.class, args);
    }
}

d)測試
先啓動EurekaServer
訪問http://localhost:7001/
在這裏插入圖片描述
微服務註冊名配置說明(一一對應)
在這裏插入圖片描述

3 actuator與註冊微服務信息完善

1 )主機名稱:服務名稱修改
當前問題 含有主機名稱
在這裏插入圖片描述
修改microservicecloud-provider-dept-8001配置文件,添加如下內容
eureka.instance.instance-id=microservicecloud-dept8001
修改之後
在這裏插入圖片描述

2)訪問信息有IP信息提示

當前問題 沒有IP提示
修改microservicecloud-provider-8001配置文件,添加如下

#訪問路徑可以顯示IP地址
eureka.instance.prefer-ip-address=true

在這裏插入圖片描述

3)微服務info內容詳細信息

當前問題:超鏈接點擊服務報告ErrorPage
在這裏插入圖片描述
a)修改microservicecloud-provider-8001 pom.xml文件
添加如下依賴

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

b) 總的父工程microservicecloud修改pom.xml添加構建build信息

<build>
   <finalName>microservicecloud</finalName>
   <resources>
     <resource>
       <directory>src/main/resources</directory>
       <filtering>true</filtering>
     </resource>
   </resources>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <configuration>
         <delimiters>
          <delimit>$</delimit>
         </delimiters>
       </configuration>
     </plugin>
   </plugins>
  </build>

c) 修改microservicecloud-provider-8001 配置文件,添加如下配置


info.app.name=tang-microservicecloud
info.company.name=www.tang.com
info.build.artifactId=$project.artifactId$
info.build.version=$project.version$

4 eureka自我保護
故障現象
在這裏插入圖片描述
在這裏插入圖片描述
導致原因:某時刻某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的信息進行保存

自我保護模式
默認情況下,如果EurekaServer在一定時間內沒有接收到某個微服務實例的心跳,EurekaServer將會註銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行爲可能變得非常危險了——因爲微服務本身其實是健康的,此時本不應該註銷這個微服務。Eureka通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務註冊表中的信息,不再刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。

在自我保護模式中,Eureka Server會保護服務註冊表中的信息,不再註銷任何服務實例。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計原則就是寧可保留錯誤的服務註冊信息,也不盲目註銷任何可能健康的服務實例。一句話講解:好死不如賴活着

綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構原則是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目註銷任何健康的微服務。使用自我保護模式,可以讓Eureka集羣更加的健壯、穩定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式。

5 Eureka集羣配置

1 )新建microservicecloud-eureka-7002 和microservicecloud-eureka-7003兩個maven moudle

2)按照7001 moudle爲模板粘貼7002和7003的pom.xml文件

3)按照7001修改7002和7003的主啓動類

4)修改映射配置
找到C:\Windows\System32\drivers\etc路徑下的hosts文件
修改映射配置添加進hosts文件,爲127.0.0.1添加3個別名
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com
127.0.0.1 eureka7003.com

5)3臺eureka服務器的yml配置

7001配置文件如下
server.port=7001
#eureka服務端的實例名稱
eureka.instance.hostname=eureka7001.com
#false表示不向註冊中心註冊自己。
eureka.client.register-with-eureka=false
#false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
eureka.client.fetch-registry=false
#設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址。
eureka.client.service-url.defaultZone=http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/


7002 配置文件如下
server.port=7002
#eureka服務端的實例名稱
eureka.instance.hostname=eureka7002.com
#false表示不向註冊中心註冊自己。
eureka.client.register-with-eureka=false
#false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
eureka.client.fetch-registry=false
#設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址。
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/


7003配置如下
server.port=7003
#eureka服務端的實例名稱
eureka.instance.hostname=eureka7003.com
#false表示不向註冊中心註冊自己。
eureka.client.register-with-eureka=false
#false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
eureka.client.fetch-registry=false
#設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址。
eureka.client.service-url.defaultZone=http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

6 ) microservicecloud-provider-8001 微服務發佈到上面3臺eureka集羣配置中
修改 microservicecloud-provider-8001配置文件

#客戶端註冊進eureka服務列表內
eureka.client.service-url.defaultZone=http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

7)測試
在這裏插入圖片描述
在這裏插入圖片描述
6 Eureka 與zookeeper對比
A 可用性
P 容錯性(只要是分佈式系統,P是必選的)
C 強一致性

Eureka 遵守AP ,zookeeper遵守CP,Nosql AP
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像zookeeper那樣使整個註冊服務癱瘓

發佈了100 篇原創文章 · 獲贊 9 · 訪問量 9208
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章