【夯實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中使用Eureka集羣搭建高可用服務註冊中心
【夯實Spring Cloud】Spring Cloud中的Eureka和Zookeeper的區別在哪?
【夯實Spring Cloud】Spring Cloud中使用Ribbon實現負載均衡詳解(上)
【夯實Spring Cloud】Spring Cloud中使用Ribbon實現負載均衡詳解(下)
【夯實Spring Cloud】Spring Cloud中自定義Ribbon負載均衡策略
【夯實Spring Cloud】Spring Cloud中使用Feign實現負載均衡詳
【夯實Srping Cloud】Spring Cloud中使用Hystrix實現斷路器原理詳解(上)
【夯實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: eureka01
  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 服務的服務名以及該服務的地址。相關信息見上面的註釋。當然咯,要在hosts文件中配置 127.0.0.1 和 eureka01 的映射。

最後在 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://eureka01:7001/eureka/

可以看到,我們給該服務起了個名稱,該名稱是服務對外暴露的名稱。除此之外,我們指定了將該 Client 端註冊到哪個 Eureka 服務列表裏,這裏的 http://eureka01: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


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

更多優質文章請關注我的微信公衆號【武哥聊編程】,回覆“資源”、“架構”、“簡歷”等關鍵詞,可以領取海量優質的視頻學習資源。大家共同進步。

程序員私房菜

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章