Рубрики
Без рубрики

Быстрый путеводитель по весеннему облачному консулу

Узнайте о проекте Spring Cloud Consul, который обеспечивает легкую интеграцию с приложениями Consul for Spring Boot.

Автор оригинала: baeldung.

Быстрый путеводитель по весеннему облачному консулу

1. Обзор

Весеннее облако Консул проект обеспечивает легкую интеграцию с приложениями Consul for Spring Boot.

Консул является инструментом, который предоставляет компоненты для решения некоторых из наиболее распространенных проблем в архитектуре микро-услуг:

  • Сервис Discovery – автоматически регистрировать и регистрировать сетевые местоположения экземпляров службы
  • Проверка состояния здоровья — обнаружение при запуске экземпляра службы
  • Распределенная конфигурация — для обеспечения того, чтобы все экземпляры службы использовали одинаковую конфигурацию

В этой статье мы увидим, как мы можем настроить приложение Spring Boot для использования этих функций.

2. Предпосылки

Начнем с того, что рекомендуется быстро взглянуть на Консул и все его особенности.

В этой статье мы собираемся использовать консула агента работает на localhost:8500 . Для получения более подробной информации о том, как установить консула и запустить агента, обратитесь к этой ссылка .

Во-первых, мы должны добавить весна-облако-стартер-консул-все зависимость от нашей пом.xml :


    org.springframework.cloud
    spring-cloud-starter-consul-all
    1.3.0.RELEASE

3. Сервис Дискавери

Давайте напишем наше первое приложение Spring Boot и проведем телефонные связи с бегущим агентом консула:

@SpringBootApplication
public class ServiceDiscoveryApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ServiceDiscoveryApplication.class)
          .web(true).run(args);
    }
}

По умолчанию Spring Boot попытается подключиться к агенту консула по localhost:8500 . Чтобы использовать другие настройки, нам нужно обновить application.yml файл:

spring:
  cloud:
    consul:
      host: localhost
      port: 8500

Затем, если мы посетим сайт консула агента в браузере на http://localhost:8500 , мы увидим, что наша заявка была должным образом зарегистрирована в Консул с идентификатором от “$spring.application.name:$-профили, разделенные запятой:$-сервер.порт” .

Чтобы настроить этот идентификатор, нам необходимо обновить свойство spring.cloud.discovery.instanceId с другим выражением:

spring:
  application:
    name: myApp
  cloud:
    consul:
      discovery:
        instanceId: ${spring.application.name}:${random.value}

Если мы заверем приложение снова, мы увидим, что оно было зарегистрировано с помощью идентификатора “MyApp” плюс случайное значение. Это необходимо для запуска нескольких экземпляров нашего приложения на нашей локальной машине.

Наконец, чтобы отключить сервис Discovery, нам необходимо установить spring.cloud.consul.discovery.enabled ложные .

3.1. Поиск услуг

У нас уже есть наша заявка, зарегистрированная в Consul, но как клиенты могут найти конечные точки обслуживания? Нам нужна услуга клиента обнаружения, чтобы получить работает и доступные услуги от консула.

Весна обеспечивает DiscoveryClient API для этой , которые мы можем включить с @EnableDiscoveryClient аннотация:

@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
    // ...
}

Затем мы можем ввести ДискавериКлиент фасоли в наш контроллер и получить доступ к экземплярам:

@RestController
public class DiscoveryClientController {
 
    @Autowired
    private DiscoveryClient discoveryClient;

    public Optional serviceUrl() {
        return discoveryClient.getInstances("myApp")
          .stream()
          .findFirst() 
          .map(si -> si.getUri());
    }
}

Наконец, мы определим конечные точки применения:

@GetMapping("/discoveryClient")
public String discoveryPing() throws RestClientException, 
  ServiceUnavailableException {
    URI service = serviceUrl()
      .map(s -> s.resolve("/ping"))
      .orElseThrow(ServiceUnavailableException::new);
    return restTemplate.getForEntity(service, String.class)
      .getBody();
}

@GetMapping("/ping")
public String ping() {
    return "pong";
}

“myApp/пинг” путь – это имя приложения Spring с конечной точкой службы. Консул предоставит все доступные заявки под названием “myApp”.

4. Проверка здоровья

Консул периодически проверяет работу конечных точек службы.

По умолчанию Весна реализует конечную точку здоровья, чтобы вернуть 200 ОК если приложение не работает . Если мы хотим настроить конечную точку, мы должны обновить application.yml:

spring:
  cloud:
    consul:
      discovery:
        healthCheckPath: /my-health-check
        healthCheckInterval: 20s

В результате консул опросит “/моя проверка здоровья” конечная точка каждые 20 секунд.

Давайте определим нашу пользовательскую службу проверки здоровья, чтобы вернуть ЗАПРЕТНАЯ статус:

@GetMapping("/my-health-check")
public ResponseEntity myCustomCheck() {
    String message = "Testing my healh check function";
    return new ResponseEntity<>(message, HttpStatus.FORBIDDEN);
}

Если мы зайдем на сайт агента консула, мы увидим, что наша заявка не работает. Чтобы исправить это, “/моя проверка здоровья” служба должна вернуть http 200 ОК статус-код.

5. Распределенная конфигурация

Эта функция позволяет синхронизировать конфигурацию между всеми службами . Consul будет следить за любыми изменениями конфигурации, а затем инициировать обновление всех служб.

Во-первых, мы должны добавить весна-облако-стартер-консул-конфиг зависимость от нашей пом.xml :


    org.springframework.cloud
    spring-cloud-starter-consul-config
    1.3.0.RELEASE

Нам также необходимо перенести настройки названия приложения Consul и Spring с application.yml файл в bootstrap.yml файл, который Весна загружается в первую очередь.

Затем мы должны включить Spring Cloud Consul Config:

spring:
  application:
    name: myApp
  cloud:
    consul:
      host: localhost
      port: 8500
      config:
        enabled: true

Весна Облако Консул Config будет искать свойства в Консул в “/конфиг/myApp” . Так что, если у нас есть свойство под названием “Моя.проп” , мы должны были бы создать это свойство на сайте консула агента.

Мы можем создать свойство, отоехав в “KEY/VALUE” раздел, затем ввод “/конфиг/myApp/my/prop” в “Создать ключ” форма и “Здравствуйте, мир” как значение. Наконец, нажмите на “Создать” пуговица.

Имейте в виду, что если мы используем профили Spring, нам нужно придать профили рядом с именем приложения Spring. Например, если мы используем dev профиль, окончательный путь в Консул будет “/конфиг/myApp,dev”.

Теперь давайте посмотрим, как выглядит наш контроллер с введенными свойствами:

@RestController
public class DistributedPropertiesController {

    @Value("${my.prop}")
    String value;

    @Autowired
    private MyProperties properties;

    @GetMapping("/getConfigFromValue")
    public String getConfigFromValue() {
        return value;
    }

    @GetMapping("/getConfigFromProperty")
    public String getConfigFromProperty() {
        return properties.getProp();
    }
}

И MyProperties класс:

@RefreshScope
@Configuration
@ConfigurationProperties("my")
public class MyProperties {
    private String prop;

    // standard getter, setter
}

Если мы за запустите приложение, поле значение и свойства имеют те же “Здравствуйте, мир” значение от консула.

5.1. Обновление конфигурации

Как насчет обновления конфигурации без перезапуска приложения Spring Boot?

Если мы вернемся на сайт агента консула и обновим “/конфиг/myApp/my/prop” с другим значением, “Новый Привет Мир” , то поле значение не изменится, и поле свойства будут обновлены до “Новый Привет Мир” как и ожидалось.

Это потому, что поле свойства является MyProperties класс имеет @RefreshScope аннотация. Все бобы аннотированы с @RefreshScope аннотация будет обновлена после изменения конфигурации.

В реальной жизни, мы не должны иметь свойства непосредственно в консул, но мы должны хранить их настойчиво где-то. Мы можем сделать это с помощью сервера Config .

6. Заключение

В этой статье мы видели, как настроить наши приложения Spring Boot для работы с Consul для целей Обнаружения службы, настроить правила проверки здоровья и поделиться распределенной конфигурацией.

Мы также внедрили ряд подходов для клиентов, чтобы ссылаться на эти зарегистрированные услуги.

Как обычно, источники могут быть найдены более на GitHub .