1. 簡介
本教程將探討 @EnableEurekaClient 與 @EnableDiscoveryClient 的區別。
這兩個註解在 Spring Boot 開發微服務時,用於與服務註冊表進行交互。它們為其他客户端或微服務註冊到服務註冊表中提供基礎。
2. 微服務中的服務註冊表
在微服務領域,由於其分佈式和鬆耦合的特性,我們面臨着一項重要挑戰。隨着服務的數量不斷增加,維護準確的服務庫存並確保它們之間的無縫通信變得越來越複雜。因此,手動跟蹤服務健康狀況和可用性也變得既耗時又容易出錯。這時,服務註冊表就顯得尤為有用。
服務註冊表是一個存儲服務信息的數據庫。 它提供了一箇中心點,用於服務註冊、查找和管理。
當一個微服務啓動時,它會將其註冊到服務註冊表中。 想要與其他服務通信的其他服務會使用它進行查找或負載均衡。 它還通過刪除和添加實例來動態更新服務實例記錄。
3. @EnableDiscoveryClient 註解
@EnableDiscoveryClient 是 Spring Boot 提供的一種更通用的註解,使其成為服務發現的靈活選擇。
可以將它視為一種合同,允許我們的應用程序與不同的服務註冊中心協同工作,無論現在還是未來。它與 spring-cloud-commons 依賴一起提供,是 Spring Cloud 服務發現機制的核心組成部分。
但是,它本身無法獨立工作——我們需要為實際的實現添加特定的依賴,無論它是否是 Eureka、Consul 還是 Zookeeper。
4. <em @EnableEurekaClient> </em 標註
Eureka,最初由 Netflix 開發,提供了一個強大的服務發現解決方案。 Eureka Client 是 Eureka 的一個基本組成部分。
具體而言,應用程序可以作為客户端運行,並使用 Eureka 實現的服務註冊。 此外,Spring Cloud 提供了一個對 Eureka 的抽象層,與 Spring Boot 結合使用,極大地簡化了將 Eureka 集成到微服務架構中的過程,從而提高開發人員的生產力。
因此,<em @EnableEurekaClient> 標註在這一過程中發揮着關鍵作用。 更加精確地説,它是用於服務作為客户端註冊到服務註冊表時使用的標註之一。
4.1. 實現 Eureka 客户端
Eureka 客户端只有在 Eureka 客户端依賴 在 pom.xml 文件中時才會生效:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>我們還需要在同一文件中 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 客户端註冊之前,還需要設置 Eureka 服務器。為此,我們需要一個 Spring Boot 應用程序,該應用程序具有 <em @SpringBootApplication</em> 註解,這是任何 Spring Boot 應用程序的基礎,用於設置基本配置。
因此,<em @EnableEurekaServer</em> 註解將我們的應用程序轉換為 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: 它為我們的應用程序指定一個 名稱 標籤。
- 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 服務器檢索服務註冊表。
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 啓動器,則我們 不需要 此註解。在這種情況,發現客户端默認啓用。 此外——如果 Spring Cloud 找到 Netflix Eureka 客户端在我們的類路徑上——它會自動為我們配置它。
讓我們總結一下它們的主要區別:
| @EnableEurekaClient | @EnableDiscoveryClient |
|---|---|
|
僅支持 Eureka。 |
更多通用,支持多個服務註冊中心 |
|
僅支持 Netflix Eureka。 |
支持 Eureka、Consul、Zookeeper 等。 |
|
它是具體的實現。 |
它是接口或合同。 |
|
需要
|
它是 Spring Cloud 依賴的一部分。不需要任何特定的依賴。 |
6. 結論
在本文中,我們看到了 @EnableEurekaClient 和 @EnableDiscoveryClient 如何與 Eureka 協同工作。然而,如果已知我們正在使用 Eureka,@EnableEurekaClient 通常是更簡單、更直接的選擇。
另一方面,@EnableDiscoveryClient 更具通用性。 如果我們認為將來可能會使用不同的服務註冊中心,或者我們只是想要更多的靈活性和控制權,那麼它是一個不錯的選擇。 最終,這取決於我們需要的什麼以及我們希望在微服務設置中獲得多少抽象程度。