EnableEurekaClient 與 EnableDiscoveryClient:使用哪一個?
1. 簡介
在本教程中,我們將研究@EnableEurekaClient
與@EnableDiscoveryClient
的差異。
兩者都是在開發微服務時使用 Spring Boot 中的服務註冊表時使用的註解。這些註釋成為其他用戶端或微服務作為客戶端發現的一部分在服務註冊表中註冊的基礎。
2. 微服務中的服務註冊中心
在以分散式和鬆散耦合特性為特徵的微服務領域中,我們遇到了巨大的挑戰。具體來說,隨著服務數量的擴大,維護準確的庫存並確保它們之間的無縫通訊變得越來越複雜。因此,手動追蹤服務健康和可用性被證明是一項資源密集且容易出錯的工作。這時服務註冊表就變得非常有用。
服務註冊表是一個保存可用服務資訊的資料庫。它為服務註冊、尋找和管理提供了一個中心點。
當微服務啟動時,它會將自己註冊到服務註冊表中。其他想要通訊的服務將它們用作查找或使用查找進行負載平衡。它還透過刪除和新增服務實例記錄來動態更新它們。
3. @EnableDiscoveryClient
註解
@EnableDiscoveryClient
是 Spring Boot 提供的更通用的註解,使其成為服務發現的靈活選擇。
我們不能將其視為一種合同,允許我們的應用程式現在和將來與不同的服務註冊中心合作。它與spring-cloud-commons
依賴項捆綁在一起,使其成為 Spring Cloud 服務發現機制的核心部分。
但是,它不能獨立運作——我們需要為實際實作添加特定的依賴項,無論是 Eureka、Consul 還是 Zookeeper。
4. @EnableEurekaClient
註解
Eureka 最初由 Netflix 開發,提供了強大的服務發現解決方案。 Eureka Client 是 Eureka 的一個基本元件。
具體來說,應用程式可以作為客戶端,在使用 Eureka 實現的服務註冊表中註冊自己。此外,Spring Cloud 在其上提供了一個有價值的抽象層,並與 Spring Boot 結合,大大簡化了 Eureka 與微服務架構的集成,從而提高了開發人員的工作效率。
因此, @EnableEurekaClient
註釋在此過程中起著關鍵作用。更準確地說,它是用於作為客戶端的服務將自己註冊到服務註冊表的註釋之一。
4.1.實作 Eureka 客戶端
只有當我們在pom.xml
檔案中擁有Eureka 客戶端依賴項時,Eureka 客戶端才有效:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
我們還需要同一文件中的依賴管理部分中的spring-cloud-commons
:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
一旦註冊,它會提供元數據,如主機、URL、健康 URL 等。服務註冊表也會從每個服務取得心跳訊息,如果心跳未在可設定的時間表內傳送,則該實例將從服務註冊伺服器中刪除。
我們現在將檢查配置 Eureka 用戶端所需的基本 Spring Boot 屬性,它們出現在application.properties
或application.yml
檔案中:
spring.application.name=eurekaClient
server.port=8081
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.instance.prefer-ip-address=true
讓我們理解上述屬性:
-
spring.application.name
:這為我們的應用程式提供了一個名稱,一個邏輯識別碼(用於服務發現)。 -
server.port
:此客戶端正在執行的連接埠號碼。 -
eureka.client.service-url.defaultZone
:這是客戶端找到 Eureka 伺服器的地方。本質上它是服務註冊中心的地址。因此,「defaultZone'
是客戶端知道如何註冊和獲取服務的地方。 -
eureka.instance.prefer-ip-address
:此屬性規定 Eureka 用戶端應註冊其 IP 位址而非其主機名稱。
4.2.設定Eureka伺服器
在 Eureka Client 註冊之前,我們還必須設定 Eureka Server。為此,我們需要一個具有@SpringBootApplication
註釋的 Spring Boot 應用程序,它是任何 Spring Boot 應用程式的基礎,用於設定基本配置。
因此, @EnableEurekaServer
註解將我們的應用程式轉換為Eureka伺服器。換句話說,這不僅僅是一個客戶端在註冊中心註冊;它是註冊表。因此,該應用程式成為中央服務發現中心:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
現在,讓我們在application.properties
檔案中包含一些用於設定 Eureka 伺服器的屬性:
spring.application.name=eurekaServer
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
讓我們仔細看看上述屬性:
-
spring.application.name
:它為我們的應用程式提供了一個name
標籤 -
server.port
:指定 Spring Boot 應用程式監聽傳入請求的網路連接埠。 -
eureka.instance.hostname
:定義 Eureka 伺服器實例在其註冊過程中公佈的主機名稱。在這個設定中,localhost
表示伺服器在本機上執行。在生產環境中,此屬性將填入伺服器的完全限定網域名稱或 IP 位址。 -
eureka.client.register-with-eureka
:當設定為false
時,它會指示 Eureka 伺服器實例不要將自身註冊到另一個 Eureka 伺服器 -
eureka.client.fetch-registry
:當設定為false
時,它會阻止 Eureka 伺服器實例從另一個 Eureka 伺服器檢索服務註冊表
一旦 Eureka 伺服器運行,我們也可以運行 Eureka 用戶端。我們已準備好實施。
5. 在@EnableEurekaClient
和@EnableDiscoveryClient
之間進行選擇
@EnableDiscoveryClient
是Spring Cloud Netflix未來建置服務註冊中心工具時,放置在EnableEurekaClient
之上的抽象介面。另一方面, @EnableEurekaClient
用於使用 Eureka 進行服務發現。
類似地,在 Eureka、Consul、Zookeeper 等其他實作中,我們可以有各種組合:
-
EnableDiscoveryClient
與EnableEurekaClient
以及服務註冊伺服器作為EnableEurekaServer
。 -
EnableDiscoveryClient
使用 Consul 和服務註冊伺服器作為 Consul Server。
如果我們的服務註冊中心是 Eureka,那麼@EnableEurekaClient
和@EnableDiscoveryClient
在技術上都可以為我們的客戶工作。不過,一般情況下還是建議使用@EnableEurekaClient
,因為它比較簡單。
@EnableDiscoveryClient
在我們希望在客戶端獲得更多靈活性的情況下非常有用,因為它可以給予我們更多的控制權。
另外值得注意的是,我們經常會在設定類別上看到@EnableDiscoveryClient
來啟用發現客戶端。但這裡有一個巧妙的技巧:如果我們使用 Spring Cloud starter,我們就不需要那個註解。在這種情況下,發現客戶端預設為啟用。另外 - 如果 Spring Cloud 在我們的類別路徑上找到 Netflix Eureka Client,它會自動為我們配置它。
讓我們來總結一下它們的主要差異:
@EnableEurekaClient |
@EnableDiscoveryClient |
---|---|
僅使用 Eureka 啟用服務註冊和發現。 |
| 更通用,可與多個服務註冊中心搭配使用 |
|
它僅支援 Netflix Eureka。
|
它支援Eureka,Consul,Zookeeper等。
|
|
它是一個具體的實現。
|
它是一個介面或者契約。
|
|
它需要spring-cloud-starter-netflix-eureka-client
依賴項可以正常運作。
|
它是 Spring Cloud 依賴項的一部分。不需要任何特定的依賴。
|
6. 結論
在本文中,我們了解了@EnableEurekaClient
和@EnableDiscoveryClient
如何與 Eureka 配合使用。但是,如果我們知道我們正在使用 Eureka, @EnableEurekaClient
通常是更簡單、更直接的選擇。
另一方面, @EnableDiscoveryClient
更通用。如果我們認為將來可能會使用不同的服務註冊表,或者我們只是想要更多的靈活性和控制力,那麼這是一個不錯的選擇。所以,一切都歸結為我們需要什麼以及我們在微服務設定中想要多少抽象。
與往常一樣,本教學的程式碼可 在 GitHub 上取得。