Spring Cloud 通过配置文件禁用服务发现

1、概览

在 Spring Cloud 中可以通过配置文件来启用、禁用服务发现,而不需要改动代码。

2、 设置 Eureka Server 和 Eureka Client

先创建一个 Eureka 服务器和一个 Discovery Client。

Eureka 服务创建过程,略!

2.1、Discovery Client 设置

创建 “Discovery Client” 应用,在 Eureka Server 上进行注册。

pom.xml 中添加 WebEureka Client starter 依赖:

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

还需要在 dependencyManagement 中添加 spring-cloud-starter-parent 依赖,用于定义 cloud 组件的版本。

如果使用 Spring Initializr 创建项目,这些参数已经设置好了。如果没有,可以手动添加到 pom.xml 文件中:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-parent</artifactId>
            <version>${spring-cloud-dependencies.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<properties>
    <spring-cloud-dependencies.version>2021.0.3</spring-cloud-dependencies.version>
</properties>

2.2、添加配置文件

接下来,在 application.properties 文件中添加客户端应用的配置属性:

eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka}
eureka.instance.preferIpAddress=false
spring.application.name=spring-cloud-eureka-client

如上,这将确保应用启动时,能在 Eureka 服务器(位于上面指定的 URL)上注册。它的服务名为 spring-cloud-eureka-client

注意,通常客户端需要配置类上使用 @EnableDiscoveryClient 注解来启用 Discovery Client。但是,如果我们使用 Spring Cloud Starter,则不需要使用注解。Discovery Client 默认已启用。此外,当它在类路径(classpath)上找到 Netflix Eureka Client 时,就会自动配置它。

2.3、Hello World Controller

创建一个简单的 Controller,返回一个问候信息。用于测试应用。

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

运行 Eureka 服务器和 Discovery Client。应用启动时,Discovery Client 将向Eureka 服务器注册。我们可以在 Eureka 服务器仪表板上看到:

Eureka 服务器仪表板上注册的服务

3、基于配置文件的配置

在某些情况下,我们可能希望禁用服务注册。

例如,我们可能希望在本地开发环境中禁用 Discovery Client,因为每次要进行本地测试时都运行 Eureka 服务器是不必要的。

可以直接更改 application.properties 文件中的属性,在每个 Profile 中启用或禁用 Discovery Client。

3.1、使用独立的 properties 文件

一种简单且常用的方法是在每个环境中使用单独的 properties 文件。

创建另一个名为 application-dev.properties 的 properties 文件:

spring.cloud.discovery.enabled=false

通过 spring.cloud.discovery.enabled 属性启用/禁用 Discovery Client。

我们将其设置为 false 以禁用 Discovery Client。

dev profile 处于活动状态时,将使用该文件代替原始 properties 文件。

3.2、使用多文档文件

如果不想在每个环境中使用单独的文件,另一个选择是使用多文档 properties 文件。

添加两个属性:

#---
spring.config.activate.on-profile=dev
spring.cloud.discovery.enabled=false

使用 #--- 将 properties 文件分为两部分。此外,还定义了 spring.config.activate.on-profile 属性。这两行结合使用,指示应用只有在某个 Profile 处于活动状态时,才读取当前部分中定义的属性。在本例中,将使用 dev Profile。

与之前一样,将 spring.cloud.discovery.enabled 属性设置为 false

这将在 dev Profile 中禁用 Discovery Client,但在 Profile 未激活时保持启用状态。

4、测试

现在,运行 Eureka 服务器和 Discovery Client 并测试一切是否按预期运行。目前还没有添加 Profile。当运行应用时,Discovery Client 将向 Eureka 服务器注册,可以在 Eureka 服务器仪表板上看到:

Eureka 服务器仪表板上注册的服务

4.1、测试 Profile

接下来,在运行应用时添加 Profile。

可以添加命令行参数 -Dspring.profiles.active=dev 来启用 dev Profile。运行应用时,可以看到客户端这次没有向 Eureka 服务器注册:

客户端未注册到 Eureka 服务器

5、总结

本文介绍了如何在 Spring Cloud 中使用 Properties 文件和 Profile 机制来禁用、启用客户端服务发现。


参考:https://www.baeldung.com/spring-cloud-disable-discovery-clients