EnableEurekaClient 与 EnableDiscoveryClient,该用哪个?

1、简介

本文将带你了解 @EnableEurekaClient@EnableDiscoveryClient 的区别。

这俩注解在 Spring Cloud 微服务应用中,都用于客户端发现。

2、微服务中的服务注册

在以分布式和松散耦合为特点的微服务领域,随着服务数量的增加,维护准确的服务列表并确保它们之间的无缝通信变得越来越复杂。手动跟踪服务的健康状况和可用性是一项资源密集且容易出错的工作。这时,服务注册中心就变得非常有用。

服务注册中心是一个保存可用服务信息的数据库。它是服务注册、查询和管理的中心点。

当微服务启动时,它会在服务注册中心中注册自己。

3、@EnableDiscoveryClient 注解

@EnableDiscoveryClient 是 Spring Boot 提供的一种更通用的注解,使其成为服务发现的灵活选择。

可以将其视为一种约定,它允许我们的应用现在和将来与不同的服务注册中心协同工作。它包含在 spring-cloud-commons 依赖中,成为 Spring Cloud 服务发现机制的核心部分。

但是,它并不能独立工作,实际运行时需要真正的实现,如 EurekaConsulZookeeper

4、@EnableEurekaClient 注解

Eureka 最初由 Netflix 开发,提供了一个强大的服务发现解决方案。Eureka 客户端是 Eureka 的基本组成部分。

具体来说,应用可以作为客户端,在使用 Eureka 实现的服务注册中心注册。此外,Spring Cloud 还为其提供了一个抽象层,与 Spring Boot 结合使用,可大大简化 Eureka 与微服务架构的集成,从而提高开发人员的工作效率。

@EnableEurekaClient 注解在这一过程中起着至关重要的作用。更确切地说,它是作为客户端的服务向服务注册中心注册时使用的注解之一。

4.1、实现 Eureka Client

只有当 pom.xml 中包含 Eureka 客户端依赖 时,Eureka 客户端才能工作:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

还要定义 spring-cloud-commons <dependencyManagement>

<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 等元数据。服务注册中心还会从每个服务获取心跳信息,如果心跳信息没有在指定时间(可配置)内发送,实例就会从服务注册中心服务器上删除。

现在,在 application.propertiesapplication.yml 文件中配置 Eureka 客户端所需的基本 Spring Boot 属性:

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 服务器的位置。实质上,它就是服务注册中心的地址。
  • eureka.instance.prefer-ip-address:该属性规定 Eureka 客户端应注册其 IP 地址而不是主机名。

4.2、设置 Eureka Server

在注册 Eureka 客户端之前,还必须设置 Eureka 服务器。为此,我们还需要一个用 @SpringBootApplication 注解的 Spring Boot 应用,这是任何 Spring Boot 应用的基础,用于设置基本配置。

@EnableEurekaServer 注解将我们的应用转换为 Eureka 服务器。换句话说,它不仅仅是一个向注册中心注册的客户端,它还是注册中心。

@SpringBootApplication
@EnableEurekaServer  //  Eureka 服务器
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 服务器检索服务注册表。

Eureka 服务器启动后,就可以运行 Eureka 客户端了。

5、选择 @EnableEurekaClient 还是 @EnableDiscoveryClient?

@EnableDiscoveryClient 是在 @EnableEurekaClient 之上的抽象接口,@EnableEurekaClient 用于与 Eureka 进行服务发现。

如果你的服务注册中心是 Eureka,那么 @EnableEurekaClient@EnableDiscoveryClient 在技术上都可以为客户端所用。不过,一般建议使用 @EnableEurekaClient,因为它比较简单。

@EnableDiscoveryClient 在需要客户端更多灵活性的情况下有用,它给了我们更多的控制权。

需要注意,我们经常会在配置类上看到 @EnableDiscoveryClient 来启用客户端发现。但如果我们使用的是 Spring Cloud Starter,则不需要该注解。在这种情况下,客户端发现默认已启用。另外,如果 Spring Cloud 在类路径上找到 Netflix Eureka Client,它会自动进行配置。

@EnableEurekaClient@EnableDiscoveryClient 注解的区别如下:

@EnableEurekaClient @EnableDiscoveryClient
仅通过 Eureka 启用服务注册和发现功能。 通用性更强,可与多个服务注册中心协同工作。
只支持 Netflix Eureka。 支持 Eureka、Consul、Zookeeper 等。
这是一个具体的实现。 这是一个接口或约定。
需要依赖 spring-cloud-starter-netflix-eureka-client 才能运行 是 Spring Cloud 依赖项的一部分。无需特别依赖。

6、总结

本文介绍了如何使用 @EnableEurekaClient@EnableDiscoveryClient 与 Eureka 配合使用。如果确定使用 Eureka 作为注册中心,则 @EnableEurekaClient 通常是更简单、更直接的选择。

而,@EnableDiscoveryClient 的用途更为广泛。如果将来可能会使用不同的服务注册中心,或者只是想要更多的灵活性和控制权,那么它就是一个不错的选择。


Ref:https://www.baeldung.com/spring-boot-enableeurekaclient-vs-enablediscoveryclient