外行人都能看得懂的Spring Cloud服務註冊與發現,錯過了血虧!

Spring Cloud 中的服務與發現使用的是 Eureka,什麼是 Eureka 呢?我們先來看看官方的解釋,然後再看看我的解釋。


1. 什麼是Eureka(官方版)


Eureka 是 Netflix 的一個子模塊, 也是核心模塊之一,Eureka 是一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現與註冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。


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


是不是看着很彆扭?很拗口?看看武哥版的解釋。


2. 什麼是Eureka(武哥版)


現在有很多創業公司,很多城市都鼓勵大學生創業,政府搞了一些經濟開發區,裏面有很多寫字樓,那麼這些創業公司就可以註冊到經濟開發區大樓,租一間寫字樓作爲自己的辦公地點。


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


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


這樣是不是就能明白其原理了?接下來看下 Eureka 的架構圖,從宏觀上把握一下。


3. Eureka的架構圖


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



Eureka Server 提供服務註冊服務,各個節點啓動後,會在 Eureka Server 中進行註冊,這樣 Eureka Server 中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在 Eureka 的界面(下文會說明)中直觀的看到。這就相當於經濟開發區的註冊登記表,簡稱“花名冊”


Eureka Client 是一個 Java 客戶端,用於簡化 Eureka Server 的交互,在應用啓動後,將會向 Eureka Server 發送心跳。如果Eureka Server 在多個心跳週期內沒有接收到某個節點的心跳。Eureka Server 將會從服務註冊表中把這個服務節點移除。這就相當於創業公司交房租費,你多次不交,那就不好意了


4. Eureka架構的實現


根據上面的架構圖,我們來搭建一下 Eureka Server和Eureka Client。


Eureka Server端


我們新創建一個服務,一般分三步走:導入依賴、配置文件、啓動註解。首先導入依賴:我們用的 Spring Cloud 版本是 Finchley,依賴如下:


<dependency>
   <groupId>org.springframework.cloudgroupId>
   <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
dependency>


接下來是 Spring Boot 項目配置文件:application.yml


server:
 port7001

eureka:
 instance:
   #eureka服務端的實例名稱
   hostname: eureka01
 client:
   # false表示不向註冊中心註冊自己
   register-with-eureka: false
   # false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務
   fetch-registry: false
   service-url:
     #設置與Eureka Server交互的地址查詢服務和註冊服務都需要依賴這個地址(單機)。
     defaultZonehttp://${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,接下來啓動服務,在瀏覽器輸入eureka01:7001,如果出現下面的網頁,說明 Eureka server 服務OK。這就是 Eureka 的可視化界面,可以監控一些註冊進來的服務信息。



Eureka Client 端


Eureka Client 端即服務的提供方,將自身服務註冊到 Eureka Server,從而使服務消費方能夠找到。


創建 Eureka Client,還是分三步走:導入依賴、配置文件、啓動註解。Eureka Client 端所依賴的註解如下:



<dependency>
   <groupId>org.springframework.cloudgroupId>
   <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>


項目配置文件需要添加如下信息:


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

# 客戶端註冊進eureka服務列表裏
eureka:
 client:
   service-url:
     defaultZonehttp://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。這個名字從哪來的呢?還記得上面 Eureka Client 中的配置文件嗎?裏面指定了暴露的服務名稱,只不過 Eureka 裏默認全部大寫而已。也可以看出,該服務的端口是8001。


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