Перейти к содержанию

Spring Cloud — как отключить Discovery Client с помощью профилей

В этой статье рассмотрим, как отключить Discovery Client в Spring Cloud с помощью профилей. Это может быть полезно в ситуациях, когда хотим включить/отключить обнаружение службы без внесения каких-либо изменений в код.

Настройка Eureka Server и Eureka Client

Начнем с создания Eureka Server и Discovery Client. Во-первых, можно настроить Eureka Server, используя раздел 2 из статьи Spring Cloud Netflix Eureka.

Настройка Discovery Client

Следующий этап – создать еще одно приложение, которое будет регистрироваться на сервере. Настроим это приложение как Discovery Client. Добавим стартовые зависимости Web и Eureka Client в pom.xml:

<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>

Нужно убедиться, что наш облачный стартер присутствует в разделе управления зависимостями и что установлена версия Spring 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.1</spring-cloud-dependencies.version>
</properties>

Добавление свойств конфигурации

Если есть зависимости, то достаточно добавить свойства конфигурации нового клиентского приложения в файл 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. Discovery Client включен по умолчанию. Кроме того, если он находит Netflix Eureka Client в classpath, то автоматически настраивает его.

Controller Hello World

Чтобы протестировать приложение, понадобится соответствующий URL-адрес. Для этого создадим простой контроллер, который будет возвращать приветственное сообщение:

@RestController
public class HelloWorldController {

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

Теперь пришло время запустить Eureka Server и Discovery Client. Когда запускаем приложение, Discovery Client зарегистрируется на Eureka Server:

Конфигурация на основе профиля

Возможны ситуации, когда нужно отключить сервис регистрации. Одной из причин может быть среда окружения.

Например, мы хотим отключить Discovery Client в локальной среде окружения разработки, потому что нет надобности в запуске Eureka Server каждый раз при локальном тестировании.

Для этого изменим свойства в файле application.properties, чтобы отключить Discovery Client для каждого профиля.

Использование отдельных файлов свойств

Одним из простых и популярных способов является использование отдельных файлов свойств для каждой среды окружения. Для этого создадим еще один файл свойств с названием application-dev.properties:

spring.cloud.discovery.enabled=false

Можно включать/отключать Discovery Client, используя свойство spring.cloud.discovery.enabled. Мы установили значение false, чтобы отключить Discovery Client. Если профиль dev активен, то этот файл будет использоваться вместо исходного файла свойств.

Использование файлов с несколькими документами

Если не хотим использовать отдельные файлы для каждой среды окружения, можно воспользоваться вариантом использования файлов свойств нескольких документов. Для этого добавим два свойства:

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

Для этого способа используем ‘#-‘, чтобы разделить файл свойств на две части. Далее будем использовать свойство spring.config.activate.on-profile. Эти две строки, используемые вместе, указывают приложению читать свойства, определенные в текущей части, только если профиль активен. В нашем случае будем использовать профиль dev.

Точно так же, как и раньше, мы установили для свойства spring.cloud.discovery.enabled значение false. Это отключит Discovery Client в профиле dev, но оставит включенным, если профиль не активен.

Тестирование

Теперь пришло время запустить Eureka Server и Discovery Client и проверить, все ли работает должным образом. Мы еще не добавили профиль. Когда запускаем приложение, Discovery Client зарегистрируется на Eureka Server:

Тестирование с профилем

Далее добавим профиль во время работы приложения. Можно добавить аргумент командной строки -Dspring.profiles.active=dev, чтобы включить профиль dev. Когда запускаем приложение, то видим, что на этот раз клиент не регистрируется на Eureka Server:

Вывод

Из этой статьи мы узнали, как использовать свойства для добавления конфигураций на основе профилей. Мы использовали вариант отключения Discovery Client на основе активных профилей. Код для этой статьи доступен на GitHub.

Оригинал