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

Введение в Spring Cloud Netflix – Эврика

В статье показано, как зарегистрировать сервис и сделать его доступным для обнаружения с помощью Eureka

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

1. Обзор

В этом уроке мы представим клиентскую службу discovery через ” Spring Cloud Netflix Eureka “.

Обнаружение служб на стороне клиента позволяет службам находить и взаимодействовать друг с другом без жесткого кодирования имени хоста и порта. Единственная “фиксированная точка” в такой архитектуре состоит из реестра служб , в котором каждая служба должна зарегистрироваться.

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

С Netflix Eureka каждый клиент может одновременно выступать в качестве сервера, чтобы реплицировать свой статус на подключенный одноранговый узел. Другими словами, клиент получает список всех подключенных одноранговых узлов реестр служб и делает все дальнейшие запросы к любым другим службам с помощью алгоритма балансировки нагрузки.

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

Для достижения цели этой записи мы реализуем три микросервиса :

  • a реестр служб ( Сервер Eureka ),
  • a REST сервис, который регистрируется в реестре ( Клиент Eureka ) и
  • веб-приложение, которое использует службу REST в качестве клиента с поддержкой реестра ( Spring Cloud Netflix Притворный клиент ).

    Дальнейшее чтение:

    Руководство по Spring Cloud Netflix – Hystrix

    В статье показано, как настроить резерв в логике приложений с помощью Spring Cloud Hystrix.
    Подробнее

    Spring REST с прокси-сервером Zuul

    Изучение использования прокси-сервера Zuul для API Spring REST, работа с CORS и ограничение политики того же происхождения браузера.
    Подробнее

2. Сервер Эврика

Реализовать Сервер Eureka для реестра служб так же просто, как:

  1. добавление spring-cloud-starter-netflix-eureka-server в зависимости
  2. включите сервер Eureka в @SpringBootApplication , аннотировав его с помощью @EnableEurekaServer
  3. настройка некоторых свойств

Но мы будем делать это шаг за шагом.

Во – первых, мы создадим новый проект Maven и поместим в него зависимости. Вы должны заметить, что мы импортируем spring-cloud-starter-parent во все проекты, описанные в этом руководстве:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-server



    
        
            org.springframework.cloud
            spring-cloud-starter-parent
            Greenwich.RELEASE
            pom
            import
        
    

Примечание: мы можем проверить последние выпуски Spring Cloud в документации по проектам Spring .

Далее мы создаем основной класс приложения:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

Наконец, мы настраиваем свойства в формате YAML , поэтому файл конфигурации application.yml будет нашим файлом конфигурации:

server:
  port: 8761
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

Здесь мы настраиваем порт приложения– 8761 по умолчанию используется для серверов Eureka . Мы говорим встроенному Клиенту Eureka не регистрироваться в “себе”, потому что наше приложение должно действовать как сервер.

Теперь мы направим ваш браузер на http://localhost:8761 для просмотра панели мониторинга Eureka , где мы позже проверим зарегистрированные экземпляры.

На данный момент мы видим основные показатели, такие как состояние и показатели здоровья.

3. Клиент Eureka

Чтобы @SpringBootApplication был осведомлен об обнаружении, мы должны включить некоторые Spring Discovery Client (например spring-cloud-starter-netflix-eureka-client ) в наш classpath.

Затем нам нужно аннотировать @Configuration либо @EnableDiscoveryClient , либо @EnableEurekaClient – обратите внимание, что эта аннотация необязательна, если у нас есть spring-cloud-starter-netflix-eureka-client зависимость от пути к классу.

Последний явно указывает Spring Boot использовать Spring Netflix Eureka для обнаружения службы. Чтобы наполнить наше клиентское приложение некоторым жизненным циклом, мы также включим пакет spring-boot-starter-web в pom.xml и реализовать REST контроллер.

Но сначала мы добавим зависимости. Опять же, мы можем предоставить зависимости spring-cloud-starter-parent определять версии артефактов для нас:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-starter


    org.springframework.boot
    spring-boot-starter-web

Здесь мы реализуем основной класс приложения:

@SpringBootApplication
@RestController
public class EurekaClientApplication implements GreetingController {

    @Autowired
    @Lazy
    private EurekaClient eurekaClient;

    @Value("${spring.application.name}")
    private String appName;

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

    @Override
    public String greeting() {
        return String.format(
          "Hello from '%s'!", eurekaClient.getApplication(appName).getName());
    }
}

И интерфейс GreetingController :

public interface GreetingController {
    @RequestMapping("/greeting")
    String greeting();
}

Здесь вместо интерфейса мы также могли бы просто объявить отображение внутри клиентского приложения Eureka класса. Интерфейс может быть полезен, если мы хотим поделиться им между сервером и клиентом.

Затем мы должны настроить application.yml с настроенным Spring именем приложения, чтобы однозначно идентифицировать нашего клиента в списке зарегистрированных приложений.

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

Наконец, мы должны сообщить нашему клиенту, где он должен найти реестр:

spring:
  application:
    name: spring-cloud-eureka-client
server:
  port: 0
eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}
  instance:
    preferIpAddress: true

Когда мы решили настроить наш клиент Eureka таким образом, мы имели в виду, что впоследствии этот вид услуг должен быть легко масштабируемым.

Теперь мы запустим клиент и направим ваш браузер на http://localhost:8761 еще раз, чтобы увидеть его статус регистрации на панели мониторинга Eureka. Используя Панель мониторинга, мы можем выполнить дальнейшую настройку, например, связать домашнюю страницу зарегистрированного клиента с Панелью мониторинга в административных целях. Однако параметры конфигурации выходят за рамки этой статьи.

4. Симулируйте Клиента

Чтобы завершить наш проект с тремя зависимыми микросервисами, мы теперь реализуем REST -потребляющее веб-приложение с использованием Spring Netflix Feign Client .

Думать о Притворяться как открытие, осознающее Пружинная опорная плита использование интерфейсов для связи с конечными точками. Эти интерфейсы будут автоматически реализованы во время выполнения и вместо сервис-url-адреса , он использует сервис-имена .

Без Симуляции нам пришлось бы автоматически подключать экземпляр Клиента Eureka к вашему контроллеру, с помощью которого мы могли бы получать служебную информацию по имени службы в качестве Приложения объекта.

Мы будем использовать это Приложение , чтобы получить список всех экземпляров этой службы, выбрать подходящий и использовать эту Информацию об экземпляре , чтобы получить имя хоста и порт. С помощью этого мы могли бы выполнить стандартный запрос с любым http – клиентом .

Например:

@Autowired
private EurekaClient eurekaClient;

public void doRequest() {
    Application application =
      eurekaClient.getApplication("spring-cloud-eureka-client");
    InstanceInfo instanceInfo = application.getInstances().get(0);
    String hostname = instanceInfo.getHostName();
    int port = instanceInfo.getPort();
    // ...
}

/| RestTemplate также можно использовать для доступа к Eureka клиентским службам по имени, но эта тема выходит за рамки этой записи.

Чтобы настроить наш проект FeignClient , мы добавим следующие четыре зависимости в его pom.xml :


    org.springframework.cloud
    spring-cloud-starter-feign


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-thymeleaf

Клиент Feign находится в пакете spring-cloud-starter-feign . Чтобы включить его, мы должны аннотировать @Configuration с помощью @EnableFeignClients . Чтобы использовать его, мы просто аннотируем интерфейс с помощью @FeignClient(“имя службы”) и автоматически подключаем его к контроллеру.

Хорошим способом создания таких Притворных | Клиентов является создание интерфейсов с @RequestMapping аннотированными методами и помещение их в отдельный модуль. Таким образом, они могут быть разделены между сервером и клиентом. На стороне сервера вы можете реализовать их как @Controller , а на стороне клиента они могут быть расширены и аннотированы как @FeignClient .

Кроме того, пакет spring-cloud-starter-eureka должен быть включен в проект и включен путем аннотирования основного класса приложения с помощью @EnableEurekaClient .

Зависимости spring-boot-starter-web и spring-boot-starter-thymeleaf используются для представления представления , содержащего извлеченные данные из нашего REST сервиса.

Это будет наш Притворный клиент интерфейс:

@FeignClient("spring-cloud-eureka-client")
public interface GreetingClient {
    @RequestMapping("/greeting")
    String greeting();
}

Здесь мы реализуем основной класс приложения, который одновременно выступает в качестве контроллера:

@SpringBootApplication
@EnableFeignClients
@Controller
public class FeignClientApplication {
    @Autowired
    private GreetingClient greetingClient;

    public static void main(String[] args) {
        SpringApplication.run(FeignClientApplication.class, args);
    }

    @RequestMapping("/get-greeting")
    public String greeting(Model model) {
        model.addAttribute("greeting", greetingClient.greeting());
        return "greeting-view";
    }
}

Это будет HTML-шаблон для нашего представления:




    
        Greeting Page
    
    
        

По крайней мере, файл конфигурации application.yml почти такой же, как на предыдущем шаге:

spring:
  application:
    name: spring-cloud-eureka-feign-client
server:
  port: 8080
eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URI:http://localhost:8761/eureka}

Теперь мы можем создать и запустить эту службу. Наконец, мы направим ваш браузер на http://localhost:8080/get-greeting и он должен отображать что-то вроде следующего:

Hello from SPRING-CLOUD-EUREKA-CLIENT!

5. “TransportException: Не удается выполнить запрос на любом известном сервере”

Во время работы сервера Eureka мы часто сталкиваемся с такими исключениями, как:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

В основном это происходит из-за неправильной конфигурации в application.properties или application.yml . Eureka предоставляет клиенту два свойства, которые можно настроить.

  • registerWithEureka: Если мы сделаем это свойство как true , то при запуске сервера встроенный клиент попытается зарегистрироваться на сервере Eureka.
  • fetchRegistry: Встроенный клиент попытается извлечь реестр Eureka , если мы настроим это свойство как true.

Теперь когда мы запускаем сервер Eureka, мы не хотим регистрировать встроенный клиент для настройки себя с сервером .

Если мы пометим вышеуказанные свойства как true (или не настроим их как true по умолчанию) при запуске сервера, встроенный клиент попытается зарегистрироваться на сервере Eureka , а также попытается получить реестр, который еще не доступен. В результате мы получаем TransportException .

Поэтому мы никогда не должны настраивать эти свойства как true в серверных приложениях Eureka . Правильные настройки, которые следует ввести в application.yml , приведены ниже:

eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false

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

Как мы уже видели, теперь мы можем реализовать реестр служб с помощью Spring Netflix Eureka Server и зарегистрировать некоторые Клиенты Eureka с его помощью.

Поскольку наш клиент Eureka с шага 3 прослушивает случайно выбранный порт, он не знает своего местоположения без информации из реестра. С помощью Притворного клиента и нашего реестра мы можем найти и использовать службу REST , даже когда местоположение меняется.

Наконец, у нас есть общая картина использования обнаружения служб в архитектуре микросервиса.

Как обычно, вы найдете исходники на GitHub , который также включает в себя набор файлов, связанных с Docker , для использования с docker-compose для создания контейнеров из нашего проекта.