1. 程式人生 > >【夯實Spring Cloud】Spring Cloud中的Eureka服務註冊與發現詳解

【夯實Spring Cloud】Spring Cloud中的Eureka服務註冊與發現詳解

本文屬於【夯實Spring Cloud】系列文章,該系列旨在用通俗易懂的語言,帶大家瞭解和學習Spring Cloud技術,希望能給讀者帶來一些乾貨。系列目錄如下:

【夯實Spring Cloud】Dubbo沉睡5年,Spring Cloud開始崛起!
【夯實Spring Cloud】Spring Cloud中基於maven的分散式專案框架的搭建
【夯實Spring Cloud】Spring Cloud中的Eureka服務註冊與發現詳解
【夯實Spring Cloud】Spring Cloud中使用Eureka叢集搭建高可用服務註冊中心(正在寫……)
【夯實Spring Cloud】Spring Cloud中使用Ribbon實現負載均衡詳解(正在寫……)
【夯實Spring Cloud】Spring Cloud中使用Feign實現負載均衡詳解(正在寫……)
【夯實Srping Cloud】Spring Cloud中使用Hystrix實現斷路器原理詳解(正在寫……)
【夯實Spring Cloud】Spring Cloud中使用Zuul實現路由閘道器詳解(正在寫……)
【夯實Spring Cloud】Spring Cloud分散式配置中心詳解(正在寫……)
【夯實Spring Cloud】未完待續


1. 什麼是Eureka?官方解釋

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

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

官方github:https://github.com/Netflix/eureka

2. 我的解釋

我的解釋:現在有很多創業公司,很多城市都有一些經濟開發區,在經濟開發區有很多寫字樓,多個創業公司都會註冊進經濟開發區大樓,租一間寫字樓作為辦公基地。

那麼這裡的創業公司就相當於微服務,而開發區大樓的註冊登記表就相當於 Eureka。

每個創業公司都要定期向開發區負責人或者機構交房租和物業費,如果某個創業公司不交物業費了,那麼該開發區大樓負責人員就會去要,若多次不給,那麼就會將其移出開發區大樓。這就是 Eureka 的心跳機制。

PS:技術解決方案,大部分源自於生活,就是這個道理,所以我們要做一個懂生活的技術人。

3. Eureka的架構

Eureka 架構本身主要包含兩個元件:Eureka Server 和 Eureka Client,分別表示服務端和客戶端。如下圖所示

Eureka架構圖

Eureka Server 提供服務註冊服務,各個節點啟動後,會在 Eureka Server 中進行註冊,這樣 Eureka Server 中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在 Eureka 的介面(下文會說明)中直觀的看到。

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

4. Eureka 架構的程式碼實現

從上面的架構圖中可以看出,Eureka 服務註冊和發現架構主要有三個角色構成:Eureka 服務端、Eureka 客戶端(微服務提供方)和服務消費端(微服務消費方)。下面結合實際專案工程,詳細總結一下工程的構建。

4.1 Eureka Server 端

Eureka Server 端提供服務註冊和發現。我們首先建立一個 Eureka Server工程:microservice-eureka01,之所以用01,因為後面我要搭建 Eureka 叢集,所以暫且先就一個 eureka01。具體建立方式和本系列第二篇文章一樣,不再贅述。

我們新建立一個服務,一般分三步走:匯入依賴、配置檔案、啟動註解。我們一步步來分析。

首先匯入依賴:我們用的 Spring Cloud 版本是 Finchley,依賴如下:

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

接下來是 Spring Boot 專案配置檔案:application.yml

server:
  port: 7001

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

我們定義 Eureka Server 的服務埠為7001,然後定義了 Eureka 服務的服務名以及該服務的地址。相關資訊見上面的註釋。

最後在 Spring Boot 工程的啟動類中新增 @EnableEurekaServer 註解,表示該服務是 Eureka Server,接受其他微服務註冊進來。如下:

/**
 * eureka-server
 * @author shengwu ni
 * '@EnableEurekaServer' 註解表示伺服器端啟動類,接受其他微服務註冊進來
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer01 {

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

OK,接下來啟動服務,在瀏覽器輸入localhost:7001,如果出現下面的網頁,說明 Eureka server 服務OK。這就是 Eureka 的視覺化介面,可以監控一些註冊進來的服務資訊,下文我再詳解。

在這裡插入圖片描述

4.2 Eureka Client 端

Eureka Client 端即服務的提供方,將自身服務註冊到 Eureka Server,從而使服務消費方能夠找到。我們將上一節Spring Cloud中基於maven的分散式專案框架的搭建中的 microservice-order-provider01(埠8001)改造成 Eureka client 端。

還是分三步走:匯入依賴、配置檔案、啟動註解。

Eureka Client 端所依賴的註解如下:

<!--eureka-client客戶端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

專案配置檔案需要新增如下資訊:

spring:
  application:
    name: microservice-order # 對外暴露的服務名稱

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

可以看到,我們給該服務起了個名稱,該名稱是服務對外暴露的名稱。除此之外,我們指定了將該 Client 端註冊到哪個 Eureka 服務列表裡,這裡的 http://localhost:7001/eureka/ 就是上面我們定義的 Eureka Server 的服務地址。這樣就可以將 Eureka Client 端和 Eureka Server 端聯絡起來了。

最後在 Spring Boot 工程的啟動類中新增 @EnableEurekaClient 註解,表示該服務是 Eureka Client,啟動後會自動註冊到指定的 Eureka Server。如下:

/**
 * 訂單服務
 * @author shengwu ni
 * "@EnableEurekaClient" 服務啟動後會自動註冊到eureka服務中心
 */
@SpringBootApplication
@EnableEurekaClient
@MapperScan("com.itcodai.springcloud.dao")
public class OrderProvider01 {

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

現在我們將 Eureka Server 和 Eureka Client 端都寫好了,來測試一下,剛剛 Eureka Server 端已經啟動了,現在我們來啟動一下這個 OrderProvider01 服務,然後重新整理一下 Eureka 視覺化介面即可看到該服務已經註冊進來了。

服務註冊進來

可以看出,已經有個微服務註冊進來了,名字為:MICROSERVICE-ORDER。這個名字從哪來的呢?還記得上面 microservice-order-provider01 中的配置檔案嗎?裡面指定了暴露的服務名稱,只不過 Eureka 裡預設全部大寫而已。也可以看出,該服務的埠是8001。

4.3 服務消費端

我們還使用上一篇Spring Cloud中基於maven的分散式專案框架的搭建中的 microservice-order-consumer 來測一下即可。啟動該專案,在瀏覽器中輸入:http://localhost:8080/consumer/order/get/list,如果正常獲取 json 資料,說明服務OK。

[{"id":1,"name":"跟武哥一起學 Spring Boot","price":39.99,"dbSource":"microservice01"},
{"id":2,"name":"跟武哥一起學 Spring cloud","price":39.99,"dbSource":"microservice01"}]

原始碼下載地址:https://gitee.com/eson15/springcloud_study


更多優質文章請關注我的微信公眾號【程式設計師私房菜】,更多程式設計和架構等學習資源等你來獲取。

程式設計師私房菜