天天看點

【夯實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,分别表示服務端和用戶端。如下圖所示

【夯實Spring Cloud】Spring Cloud中的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 的可視化界面,可以監控一些注冊進來的服務資訊,下文我再詳解。

【夯實Spring Cloud】Spring Cloud中的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 可視化界面即可看到該服務已經注冊進來了。

【夯實Spring Cloud】Spring Cloud中的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

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

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

繼續閱讀