1. 程式人生 > 其它 >SpringCloud04---Eureka服務註冊中心

SpringCloud04---Eureka服務註冊中心

1. 什麼是Eureka

Eureka是Netflix的有個子模組,也是核心模組之一。Eureka是基於REST的服務,用於定位服務,以實現雲端中介軟體層服務發現和故障轉移,服務註冊與發現對於微服務來說是非常重要的,有了服務註冊與發現,只需要使用服務的識別符號,就可以訪問到服務,而不需要修改服務呼叫的配置檔案了,功能類似於Dubbo的註冊中心,比如Zookeeper.

2. 原理理解

Eureka基本的架構

  • Eureka採用了C-S的架構設計,EurekaServer作為服務註冊功能的伺服器,他是服務註冊中心.

  • 而系統中的其他微服務,使用Eureka的客戶端連線到EurekaServer並維持心跳連線。這樣系統的維護人員就可以通過EurekaServer來監控系統中各個微服務是否正常執行,Springcloud 的一些其他模組 (比如Zuul) 就可以通過EurekaServer來發現系統中的其他微服務,並執行相關的邏輯.

  • Eureka 包含兩個元件:Eureka Server 和** Eureka Client**.

  • Eureka Server 提供服務註冊,各個節點啟動後,回在EurekaServer中進行註冊,這樣Eureka Server中的服務登錄檔中將會儲存所有課用服務節點的資訊,服務節點的資訊可以在介面中直觀的看到.

  • Eureka Client 是一個Java客戶端,用於簡化EurekaServer的互動,客戶端同時也具備一個內建的,使用輪詢負載演算法的負載均衡器。在應用啟動後,將會向EurekaServer傳送心跳 (預設週期為30秒) 。如果Eureka Server在多個心跳週期內沒有接收到某個節點的心跳,EurekaServer將會從服務登錄檔中把這個服務節點移除掉 (預設週期為90s).

3. Eureka服務註冊中心

3.1 eureka-server

  1. 新建模組 springcloud-eureka-7001

  2. pom.xml 配置

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
        <version>1.4.7.RELEASE</version>
    </dependency>
    <!--熱部署工具-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>
  1. application.yml 配置
server:
  port: 7001

# Eureka配置
eureka:
  instance:
    # Eureka服務端的例項名字
    hostname: 127.0.0.1
  client:
    # 表示是否向 Eureka 註冊中心註冊自己(這個模組本身是伺服器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果為false,則表示自己為註冊中心,客戶端的化為 ture
    fetch-registry: false
    # Eureka監控頁面~
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  1. 主啟動類
//啟動之後,訪問http://localhost:7001/
@SpringBootApplication
@EnableEurekaServer   // @EnableEurekaServer 服務端的啟動類,可以接受別人註冊進來~
public class EurekaServer_7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer_7001.class,args);
    }
}
  1. 啟動成功後訪問 http://localhost:7001/ 得到Spring Eureka主頁

3.2 eureka-client

調整之前建立的springlouc-provider-dept-8001

  1. Eureka依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>
  1. application中新增Eureka配置
# Eureka配置:配置服務註冊中心地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka/
  instance:
    instance-id: springcloud-provider-dept-8001 #修改Eureka上的預設描述資訊
    hostname: localhost
  1. 為主啟動類新增@EnableEurekaClient註解
@SpringBootApplication
// @EnableEurekaClient 開啟Eureka客戶端註解,在服務啟動後自動向註冊中心註冊服務
@EnableEurekaClient
public class DeptProvider_8001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptProvider_8001.class,args);
    }
}
  1. 先啟動7001服務端後啟動8001客戶端進行測試,然後訪問監控頁http://localhost:7001/ 看結果

  2. 配置關於服務載入的監控資訊

【pom.xml中新增依賴】

<!--actuator完善監控資訊-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

【application.yml中新增配置】

# info配置
info:
  app.name: springcloud-provider-dept-8001
  company.name: 江蘇大學計算機學院

此時重新整理監控頁,點選進入

3.3 EureKa自我保護機制

一句話總結就是:某時刻某一個微服務不可用,eureka不會立即清理,依舊會對該微服務的資訊進行儲存!

3.4 註冊進來的微服務,獲取一些訊息(團隊開發會用到)

  1. DeptController.java新增方法
/**
 * DiscoveryClient 可以用來獲取一些配置的資訊,得到具體的微服務!
 */
@Autowired
private DiscoveryClient client;

/**
 * 獲取一些註冊進來的微服務的資訊~,
 *
 * @return
 */
@GetMapping("/dept/discovery")
public Object discovery() {
    // 獲取微服務列表的清單
    List<String> services = client.getServices();
    System.out.println("discovery=>services:" + services);
    // 得到一個具體的微服務資訊,通過具體的微服務id,applicaioinName;
    List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT");
    for (ServiceInstance instance : instances) {
        System.out.println(
                instance.getHost() + "\t" + // 主機名稱
                        instance.getPort() + "\t" + // 埠號
                        instance.getUri() + "\t" + // uri
                        instance.getServiceId() // 服務id
        );
    }
    return this.client;
}
  1. 主啟動類中加入@EnableDiscoveryClient 註解

  2. 訪問localhost:8001/dept/discovery,頁面如下

4. Eureka:叢集環境配置

4.1 初始化

  1. 新建springcloud-eureka-7002、springcloud-eureka-7003 模組,為pom.xml新增依賴 (與springcloud-eureka-7001相同)

  2. application.yml配置(與springcloud-eureka-7001相同,埠號修改一下就行)

  3. 主啟動類(與springcloud-eureka-7001相同)

4.2 叢集成員相互關聯

  1. 配置一些自定義本機名字,找到本機hosts檔案並開啟(C:\Windows\System32\drivers\etc)
127.0.0.1    euraka7001.com
127.0.0.1    euraka7002.com
127.0.0.1    euraka7003.com
  1. 在叢集中使springcloud-eureka-7001關聯springcloud-eureka-7002、springcloud-eureka-7003
server:
  port: 7001

# Eureka配置
eureka:
  instance:
    # Eureka服務端的例項名字
    hostname: eureka7001.com
  client:
    # 表示是否向 Eureka 註冊中心註冊自己(這個模組本身是伺服器,所以不需要)
    register-with-eureka: false
    # fetch-registry如果為false,則表示自己為註冊中心,客戶端的化為 ture
    fetch-registry: false
    # Eureka監控頁面~
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      #重寫 Eureka的預設埠以及訪問路徑 --->http://localhost:7001/eureka/
      # 單機: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 叢集(關聯):7001關聯7002、7003
  1. 配置springcloud-eureka-7002和springcloud-eureka-7003

  2. 這樣模擬叢集就搭建號了,就可以把一個專案掛載到三個伺服器上了

5. 對比和Zookeeper區別

5.1 回顧CAP原則

  • RDBMS (MySQL\Oracle\sqlServer) ===> ACID

  • NoSQL (Redis\MongoDB) ===> CAP

ACID是什麼

  • A (Atomicity) 原子性

  • C (Consistency) 一致性

  • I (Isolation) 隔離性

  • D (Durability) 永續性

CAP是什麼

  • C (Consistency) 強一致性

  • A (Availability) 可用性

  • P (Partition tolerance) 分割槽容錯性

5.2 CAP理論的核心

  • 一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性這三個需求:CAP的三進二:CA、AP、CP

  • 根據CAP原理,將NoSQL資料庫分成了滿足CA原則,滿足CP原則和滿足AP原則三大類

    • CA:單點叢集,滿足一致性,可用性的系統,通常可擴充套件性較差
    • CP:滿足一致性,分割槽容錯的系統,通常效能不是特別高
    • AP:滿足可用性,分割槽容錯的系統,通常可能對一致性要求低一些

5.3 作為分散式服務註冊中心,Eureka比Zookeeper好在哪裡

  • Zookeeper 保證的是 CP —> 滿足一致性,分割槽容錯的系統,通常效能不是特別高

  • Eureka 保證的是 AP —> 滿足可用性,分割槽容錯的系統,通常可能對一致性要求低一些

Zookeeper保證的是CP

當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊資訊,但不能接收服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性但zookeeper會出現這樣一種情況,當master節點因為網路故障與其他節點失去聯絡時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30-120s,且選舉期間整個zookeeper叢集是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因為網路問題使得zookeeper叢集失去master節點是較大概率發生的事件,雖然服務最終能夠恢復,但是,漫長的選舉時間導致註冊長期不可用,是不可容忍的。

Eureka保證的是AP

Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊時,如果發現連線失敗,則會自動切換至其他節點,只要有一臺Eureka還在,就能保住註冊服務的可用性,只不過查到的資訊可能不是最新的,除此之外,Eureka還有之中自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,此時會出現以下幾種情況:

  • Eureka不在從註冊列表中移除因為長時間沒收到心跳而應該過期的服務
  • Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其他節點上 (即保證當前節點依然可用)
  • 當網路穩定時,當前例項新的註冊資訊會被同步到其他節點中

因此,Eureka可以很好的應對因網路故障導致部分節點失去聯絡的情況,而不會像zookeeper那樣使整個註冊服務癱瘓